zoukankan      html  css  js  c++  java
  • 第一次作业——结合三次小作业

    作业①:
    要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
    输出信息:

    排名 学校名称 省市 学校类型 总分
    1 清华大学 北京 综合 852.5
    2 ... ... ... ...
    1)代码:
    import requests,re
    from bs4 import BeautifulSoup
    
    url = "http://www.shanghairanking.cn/rankings/bcur/2020"
        
    r = requests.get(url)
    r.encoding="UTF-8"
    soup = BeautifulSoup(r.text, "html.parser")
    trList = soup.select("tr")
    
    for tr in trList[1:]:
        # 清除tr.text里的
    和*(因为学校名称带个*),替换成空格,然后以空格为分隔得到数组,数组里有很多空字符串"",取数组里的非空字符串,格式化输出
        data = [x for x in re.sub("[%s]+" % "
    *"," ",tr.text).split(" ") if x!=""]
        p = lambda x:format(x,"<"+str(30)) if x.isdigit() else format(x,"<"+str(30-len(x)))
        print(p(data[0]),p(data[1]),p(data[2]),p(data[3]),p(data[4]))
    

    图片:

    ...

    2)心得体会:作业1一看觉得挺难的,后面大佬牛哥讲解了一下,一语中的,让我大致熟悉了爬虫的流程,就是输出格式要思考一番.

    作业②:

    要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
    输出信息:

    序号 价格 商品名
    1 65.00 xxx
    2 ... ...
    1)代码
    import requests
    import re
    
    def gethtml(url):
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
        }
        r = requests.get(url,headers=headers)
        r.encoding = "UTF-8"
        return r.text
    
    def getGoodsMsg(msg):
        # 每件商品的信息都包含在<li data-sku=...></li>标签中
        m = re.findall("<li data-sku.*>", msg)
        # 一开始用其它的爬60项,会有重复的,而且顺序不是从小到大,需要排序一下(由于要求使用requests,实力限制仅有30项)
        pos = sorted(list(set([msg.index(i) for i in m])))
        print("序号	价格"+"	"*5+"商品名")
        for i in range(len(pos)):
            # 在每个<li>标签中匹配数据
            start = pos[i]
            end = msg.rindex("</ul>") if i==len(pos)-1 else pos[i+1]
            item = msg[start:end]
            try:
                price = re.search("<i>(d|.)+</i>",item).group(0)
                name = re.search("<em>[^¥]*?</em>",item).group(0)
                # 有的商品名带有 京东超市 ,会带有
    	,用replace方法去除
                print(str(i+1)+"	"+re.sub("<[^>]*>","",price)+"	"+re.sub("<[^>]*>","",name).replace("
    ","").replace("	"," "))
            except AttributeError as e:
                print(e)
                continue
    
    if __name__=="__main__":
        url = "https://search.jd.com/search?keyword="
        goods = "口红"    
        pageurl = url+goods
        msg = gethtml(pageurl)
        getGoodsMsg(msg)
    

    图片:

    2)心得体会:作业2一看觉得挺难的,后面大佬晟新讲解了一下,茅塞顿开,只用正则还是花了挺长时间,代码原来是处理60项的,爬30项好像没那么多问题,直接两个findAll就行.

    作业③:
    要求:爬取一个给定网页(http://xcb.fzu.edu.cn/html/2019ztjy )或者自选网页的所有JPG格式文件
    输出信息:将自选网页内的所有jpg文件保存在一个文件夹中

    1)代码:

    import requests
    import re
    import os
    
    # 存储图片
    def saveImg(url, path):
        r = requests.get(url)
        with open(path, 'wb') as f:
            f.write(r.content)
            f.close()
            print(name+"保存成功")
    
    url = "http://xcb.fzu.edu.cn/"
    # 文件夹结尾有\,便于后续字符串拼接
    savepath = "C:\image\fzu\"
    # 有jpg和JPG
    r = requests.get(url).text.lower()
    
    # 清理注释 注释里的cast1234.jpg 会重复
    r = re.sub("<!--(.|
    )*?-->", "", r)  
    # 从第6位开始取 前5位是src=" | 后面不在<img>标签里
    imglist = [imgurl[5:] for imgurl in re.findall("src=".*?jpg", r)] + re.findall("/attach.*?jpg", r)
    # 不存在存储文件夹则创建
    if not os.path.exists(savepath):
        os.mkdir(savepath)
    for imgurl in imglist:
        # 相对路径=>绝对路径
        if imgurl[0] == "/":
            imgurl = url+imgurl
        # 找最后一个/出现的位置 取后面的字串作为名字 因为路径都是http://xcb.fzu.edu.cn/cxcgg/fuji.jpg这样的
        name = imgurl[imgurl.rindex("/")+1:]
        if os.path.exists(savepath+name):
            print(name+"已存在")
        else:
            saveImg(imgurl, savepath+name) 
    

    图片:

    2)心得体会:作业3一看觉得挺难的,后面大佬11zhi讲解了一下,为有源头活水来!此次作业我对正则的理解更加深入,有催人跑的意思。

  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/baiii/p/13745606.html
Copyright © 2011-2022 走看看