爬虫基础
有些网页是js动态生成的,有些则不是,被JS渲染过的页面内容获取可以通过浏览器的“开发者工具”功能寻找真正提供数据的页面,有时会有一定的难度。
import requests
网站地址/robots.txt #可查看网站的爬虫协议
r = requests.get('网站地址') #填写网站地址
r.status_code #获取状态码 200则正常
printf(r.text) #输出获取的信息
爬虫练习
@@@ 这部分的内容是节选自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条短评,和每个短评相应的分数(有些短评可能不存在分数),然后计算出来平均值
来源:CSDN
作者:qq_41291769
链接:https://blog.csdn.net/qq_41291769/article/details/104640523