欲直接下载代码文件,关注咱们的公众号哦!查看历史消息便可!html
《复仇者联盟4:终局之战》已经上映快三个星期了,全球票房破24亿美圆,国内票房破40亿人民币。浏览器
虽然如今热度逐渐降低,可是咱们仍是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。app
后来持续走低,如今《复联4》的评分稳定在8.6分。虽然豆瓣平常被人吐槽注水严重,恶意评分不少,可是因为它好爬鸭~,咱们仍是选择豆瓣做为爬取对象。豆瓣的长评论有文字和图片等其它元素,简单起见,此次只爬短评。函数
在浏览器中查看豆瓣关于复联4的短评,先来看看url的结构:编码
https://movie.douban.com/subject/26100958/comments?start=20&limit=20&sort=new_score&status=Purl
可见,咱们能够经过修改start的值进入不一样的页面:spa
右键查看源代码能够看到浏览器获取到的html页面代码。Ctrl F搜索第一条影评的关键词,快速定位到影评的标签:code
能够看到影评内容在span标签中,class为“short”。htm
总览一下爬取内容的步骤:对象
1) 访问url,获取html页面文本,这一步咱们要用到的是requests模块。
2) 解析返回的文本,提取出爬虫内容,这一步要用的是beautifulSoup模块。
这两个模块均可以经过pip直接下载。
首先是main函数:
def main(): discuss = [] a = 0 for i in range(0,100,20): url = 'https://movie.douban.com/subject/26100958/comments?start='+ str(i) +'&limit=20&sort=new_score&status=P' HTMLpage = getHTML(url) #print(HTMLpage) for t in parseHTML(HTMLpage): discuss.append(t) for i in discuss: print(str(a) + ':' + i) # print(i) a = a + 1
因为豆瓣一页显示20条影评,咱们爬前100条,因此这里访问了前5个页面:
def getHTML(url): try: r = requests.get(url) r.raise_for_status() print("get html successfully") r.encoding = 'utf-8' #print(r.text) return r.text except: return ""
在getHTML函数中,咱们申请访问目标页面,并返回html页面文本。注意这里应该将编码方式设置为utf-8,实测若是设置成r.encoding = r.apparent_encoding,程序并不能猜想到正确的编码方式。
当r.raise_for_status() 没有抛出异常时,程序通知咱们获取html成功。若是有异常,返回空字符串。
下一步是解析:
如前所述影评是class为short的span,因此能够直接使用bs4的find_all()函数获得一个含有全部影评的tag的列表。咱们只须要把tag中的文字提取出来就能够返回到主函数了。
首先要生成一个beautifulSoup类的对象,使用html的解析器。html页面是树状分布的,能够经过各类树的遍历找到咱们须要的标签,这里bs4提供了一个简单粗暴的find_all,能够直接使用。
find_all()函数返回的是一个保存着tag的列表。
def parseHTML(html): try: soup = BeautifulSoup(html,"html.parser") A = soup.find_all('span',attrs = {'class':'short'}) B = [] for i in A: B.append(i.get_text()) return B except: return []
用get_text函数去掉span标签,只留下内容的文本,加入到B列表里。而后就能够返回了。同理,若是出错了,返回空列表。
好了以上就是一个很是简单的小爬虫,经过修改爬取的数量能够爬取任意页面的评论。固然了后续还会对这些数据进行一些有趣的分析,请关注咱们。同时由于做者本人能力有限,本系列可能又要无限托更了/呲牙
下附完整版代码和运行结果【代码下载移步留言区】:
import requests from bs4 import BeautifulSoup def getHTML(url): try: r = requests.get(url) r.raise_for_status() print("get html successfully") r.encoding = 'utf-8' #print(r.text) return r.text except: return "" def parseHTML(html): try: soup = BeautifulSoup(html,"html.parser") A = soup.find_all('span',attrs = {'class':'short'}) B = [] for i in A: B.append(i.get_text()) return B except: return [] def main(): discuss = [] a = 0 for i in range(0,100,20): url = 'https://movie.douban.com/subject/26100958/comments?start='+ str(i) +'&limit=20&sort=new_score&status=P' HTMLpage = getHTML(url) #print(HTMLpage) for t in parseHTML(HTMLpage): discuss.append(t) for i in discuss: print(str(a) + ':' + i) # print(i) a = a + 1 if __name__ == "__main__": main()
运行结果: