数据采集第一次作业

作业一

结果展示

 

 

 

 

分析网页

找到需要爬取网页的部分,这里可以分析出信息所在的标签信息,根据这些标签信息写出正则表达式,利用re库中的re.findall函数进行爬取

代码部分

获取html

def getHTML_requests(url,header):#加个头伪装一下
    try:
        r = requests.get(url, headers = header,timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except Exception as err:
        print(err)

正则查找所需元素并用列表保存,便与格式化输出

def fillunilist(ulist,html):
    #采用非贪婪匹配
    #采用[\u4e00-\u9fa5]匹配中文字符
    #设置re.s模式
    ranks = re.findall(r'class="ranking" data-v-68e330ae>(.*?)</div>',html,re.M|re.S)
    levels = re.findall(r'<td data-v-68e330ae>.*?([\u4e00-\u9fa5].*?%).*?</td>',html,re.M|re.S)
    names = re.findall(r'class="name-cn" data-v-b80b4d60>(.*?)</a>', html, re.M | re.S)
    scores = re.findall(r'<td data-v-68e330ae>(\n\s*?.*?\s*?)</td>',html)

    for i in range(len(ranks)):
        rank = ranks[i].strip()#去除空格或者其他字符再保存
        level = levels[i].strip()
        name = names[i].strip()
        score = scores[i].strip()
        ulist.append([rank,level,name,score])

格式化输出

def printuniList(ulist, num):
    tplt = "{0:{4}^10}\t{1:{4}<7}\t{2:{4}^15}\t{3:{4}^6}"
    print(tplt.format("2020排名", "全部层次", "学校类型","总分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2],u[3],chr(12288)))
        #中西混排时,用中文字符空格填充chr(122888)

作业心得

1.由于自己对正则表达式运用的不够熟练,在进行正则匹配的过程中,会出现反复匹配失败的情况,需要反复进行调试。

2.初步写表达式的时候,没有考虑到换行,空格等等情况,饶了很多弯路,花费了不少时间。

3.通过这道题目,我对正则表达式有了更深刻的认识,使用更加熟练。

作业二

序号城市AQIPM2.5SO2No2Co首要污染物
1 北京 55 6 5 1.0 225
2......              

结果展示

分析网页

查看网页源码,网页的标签树结构十分清晰,tbody->tr->td,可用bs中的select或者find_all函数快速定位

代码部分

采用bs分析网页并用列表保存

def fillweatherList(list, html):
    soup = BeautifulSoup(html, "lxml")
    trs = soup.select("tbody > tr")
    i = 1
    for tr in trs:
        tds = tr.find_all('td')
        no = i
        city = tds[0].text.strip()
        if city == "北京市" and i != 1:
            break#网页展示的信息是循环的,break避免重复爬取
        aqi = tds[1].text.strip()
        pm2_5 = tds[2].text.strip()
        so2 = tds[4].text.strip()
        no2 = tds[5].text.strip()
        co = tds[6].text.strip()
        fp = tds[8].text.strip()
        list.append([no,city,aqi,pm2_5,so2,no2,co,fp])
        i += 1

格式化输出

def printweatherList(ulist, num):
    tplt = "{0:{8}^6}\t{1:{8}^4}\t{2:{8}^5}\t{3:{8}^4}\t{4:{8}^4}\t{5:{8}^5}\t{6:{8}^5}\t{7:{8}<6}"
    print(tplt.format("序号", "城市", "AQI","PM2.5","SO2","No2","Co","首要污染物",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2],u[3],u[4],u[5],u[6],u[7],chr(12288)))

作业心得

1.BeatutifulSoup是一个很好用的工具,可以直接通过标签获取信息,但是要先对网页的标签树进行分析

作业三

  • 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/),并爬取该网站下的所有图片

  • 输出信息:将网页内的所有图片文件保存在一个文件夹中

结果展示

 

分析网页

 题目要我们爬取网页内的所有图片,通过查看网页,可以发现图片的地址都在img标签下,采用re正则匹配可能会更加方便?

代码部分

获取图片并保存到本地

def get_image(html):
    global pic_num#爬取的图片总数
    reg = r'<img src="/(.*?).jpg"'#这里只爬取jpg类型的图片
    all_img = re.findall(reg,html)
    for img in all_img:
        adress = 'http://news.fzu.edu.cn/' + img + '.jpg'#得到图片地址
        root = 'E:/crawl_pic/'
        path = root + str(pic_num)+'.jpg'#设置文件保存路径
        try:
            if not os.path.exists(root):
                os.mkdir(root)
            if not os.path.exists(path):
                r = requests.get(adress)
                with open(path,'wb') as f:
                    f.write(r.content)
                    f.close()
                    print("文件保存成功!")
                    pic_num += 1
            else:
                print("文件已经存在!")
        except:
            print("爬取失败")

作业心得

通过这次题目,我对正则表达式的理解更加深刻。也顺便复习了os库的使用

代码连接:https://gitee.com/linyu17/crawl_project/tree/master/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%9C%E4%B8%9A

posted @ 2021-09-30 22:53  今晚一定12点前睡觉  阅读(47)  评论(0编辑  收藏  举报