今天试了下Python的爬虫,果然简单的一批,适合懵懂的小白。就先放代码吧。。。
from bs4 import BeautifulSoup
import requests
url = 'https://movie.douban.com/subject/35051512/comments?status=P'
r = requests.get(url=url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'})
be = BeautifulSoup(r.text,features="lxml")
S = be.select('span[class=short]') #提取包含短评的部分
C = be.select('span[class=comment-info]') #提取包含评分的部分
for i,(s,c) in enumerate(zip(S,C)):
text = s.text.replace('\n','') #获取标签文本,删除换行
score = c.select('span[title]')[0].get('title') 提取评分,因为有两个title属性,评分是第一个。get('title')得到评分结果
print(i,text,score)
恩。直接运行代码,就能得到如下结果:爬虫结果
这十来行的代码就能爬虫,好爽。下面一行行的分析下原理。
那么我如何爬取这些短评内容和评分呢。首先把这个网页丢给request库的get函数,该函数读取网页的源代码,其中headers的值不可少,headers的作用是为了解决反爬虫的,该信息如何找我就不说了,直接粘贴我这个就可以用(我也是粘贴别人的哈哈哈)。自己也可以按照方法找下自己浏览器本身的。
然后将得到的内容丢给BeautifulSoup库按照lxml格式解析,这样我们可以按照xml的方式去寻找我们需要的内容。忘了看源代码的样子了!转换完了后我们可以打印出网页的源代码了,如下图:
好了,经过我们仔细的观察发现,我们需要提取的评论在的标签中!!
好了,这时候再把我们提取的内容循环出来就可以了!
但是,另一个问题就是,如果我想继续循环后面的网页呢,好办!
我们先观察一下下一页评论的网址,https://movie.douban.com/subject/35051512/comments?start=20&limit=20&status=P&sort=new_score,是这个样子的,和我们第一个网址的不同在哪?多了start=20&limit=20&sort=new_score是吧,很明显,start代表这页评论的起始索引,limit=20代表这页评论的数目,sort=new_score不用管,其实变量就一个起始位置嘛,那么我们就可以根据这个思路,写一个网址的变量。如下:
for i in range(10):
start = i * 20
url = 'https://movie.douban.com/subject/35051512/comments?start={}&limit=20&status=P&sort=new_score'.format(start)
上面我把网页重复了10次,也就是前十页的网址,只要把这段代码加到源代码中,就可以爬取多个网页了:
from bs4 import BeautifulSoup
import requests
for i in range(10):
start = i * 20
url = 'https://movie.douban.com/subject/35051512/comments?start={}&limit=20&status=P&sort=new_score'.format(start)
r = requests.get(url=url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'})
be = BeautifulSoup(r.text,features="lxml")
S = be.select('span[class=short]')
C = be.select('span[class=comment-info]')
for i,(s,c) in enumerate(zip(S,C)):
text = s.text.replace('\n','')
score = c.select('span[title]')[0].get('title')
print(i,text,score)