网络爬虫的使用

蓝咒 提交于 2020-03-08 16:45:42

爬虫基础

有些网页是js动态生成的,有些则不是,被JS渲染过的页面内容获取可以通过浏览器的“开发者工具”功能寻找真正提供数据的页面,有时会有一定的难度。

import requests
网站地址/robots.txt   #可查看网站的爬虫协议
r = requests.get('网站地址') #填写网站地址
r.status_code #获取状态码 200则正常
printf(r.text) #输出获取的信息

request库官方文档

BeautifulSoup库官方文档

爬虫练习

@@@ 这部分的内容是节选自MOOC中南京大学的国家经典课程《用Python玩转数据》的实例

实例一

实例介绍:

从豆瓣读书上抽取某本书的前50条短评内容并计算评分(star)的平均值。

import requests,re,time
from bs4 import BeautifulSoup

count = 0 
i = 0
s,count_s,count_del = 0,0,0
lst_stars = []
# http头信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
url = 'https://book.douban.com/subject/1084336/comments/hot?p='
while count<50:
    try:
        #逐页请求 i代表了页数
        r=requests.get(url+str(i+1),headers=headers)   
    except Exception as err:
        print(err)
        break
    soup = BeautifulSoup(r.text,'lxml')
    #comments获取了本页面的所有短评,并且返回一个列表
    comments = soup.find_all('span','short')

     #编写评分所使用的正则表达式 (.*?)是要获取的地方
    pattern = re.compile('<span class="user-stars allstar(.*?)rating"')
     #利用正则表达式来获取评分,返回和字符串相匹配的列表
    p = re.findall(pattern,r.text)

    #利用for循环输出列表中所有短评
    for item in comments:  
        count += 1   #count来统计短评的数目
        #这一页中的短评数>50 则删除标记加1
        if(count>50):
            count_del += 1
        else:
            print(count,item.string)
    #初始化分数列表        
    for star in p:
        lst_stars.append(int(star))
    time.sleep(5) #延迟5秒
    i+=1 
    #对分数的遍历,不过得注意一点,并不是所有的短评都有分数
    for star in lst_stars[:-count_del]:
        s+=int(star)
if count>=50:
    print(s//len(lst_stars)-count_del)

以上是MOOC给的参考答案,里面涉及的问题就是无法做到短评和分值进行相应的匹配,因为通过beautifulsoup库获取的短评列表和用正则表达式获取的分数列表不匹配。

关于问题的想法:抽取前50条短评,和每个短评相应的分数(有些短评可能不存在分数),然后计算出来平均值




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!