爬虫项目—豆瓣影评爬取
什么是网络爬虫
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本
。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
豆瓣影评爬取
页面分析
页面链接如下:
https://movie.douban.com/subject/26634250/comments?start=0&limit=20
对于页面上的文本来说,短评指的是以下的内容
对于程序来说,直接获取界面中的内容是比较难以实现,因此可以使用HTML代码来进行提取,我们可以查看一些该页面的HTML代码
对于可以找到相应的短评代码,发现都是由<span class="short">短评内容</span>
的格式来构成,可以以这个内容为准,进行相应的正则提取
URL链接分析
URL是一个网页的入口,每个网页资源都有自己对应的URL资源,对于下面的链接来说:
https://movie.douban.com/subject/26634250/comments?start=0&limit=20
- 26634250表示该电影的ID标号,每个电影都会有自己的ID标号
- start表示起始的短评编号
- limit表示每页显示的短评数量
- 每个参数之间使用
&
符号来进行连接 - 由于limit大小为20,因此start必须是20的倍数
获取网页的HTML代码
def getHtml(url):
try:
#设置相应的请求头,伪装成浏览器访问,防止网页将程序识别为爬虫
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'
}
#获取response对象
response = r.get(url,headers = headers)
#如果返回代码为200,则说明访问成功,返回代码
if response.status_code == 200:
return response.text
else:
print(response.status_code)
except r.RequestException as e:
#输出错误信息
print(e)
对网页内容进行分析提取
#获取网页内容
html = getHtml(url)
#分析内容,使用正则表达式
pattern = '<span class="short">(.*?)</span>'
#将所有搜索到的结果组合成一个列表
short_list = re.findall(pattern,html)
#将内容进行组合
result += "".join(short_list)
可以尝试使用getHtml来获取其他网页进行分析
探究练习
对下面网页进行爬取,并且找出目标网页中的所有电影标题
爬取多页数据
在豆瓣网页中发现,每次进行切换页面时,start的参数都会不断向上进行递增,因此可以使用一个for循环进行多次页面的爬取,完整代码如下:
import requests as r
import re
import wordcloud
import matplotlib.pyplot as plt
import jieba
move_id = "30391186"
start = 0
limit = 20
result = ""
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'
}
def getHtml(url):
try:
response = r.get(url,headers = headers)
if response.status_code == 200:
return response.text
else:
print(response.status_code)
except r.RequestException as e:
print(e)
for i in range(20,100,20):
url = "https://movie.douban.com/subject/{}/comments?start={}&limit={}"\
.format(move_id,i,limit)
#获取网页内容
html = getHtml(url)
#分析内容
pattern = '<span class="short">(.*?)</span>'
short_list = re.findall(pattern,html)
#将内容进行组合
result += "".join(short_list)
#统计词频
re_dict = {}
re_list = jieba.lcut(result)
print(re_list)
for item in re_list:
if len(item) > 1:
if item not in re_dict:
re_dict[item] = 1
else:
re_dict[item] += 1
#进行词云分析
word = wordcloud.WordCloud(font_path = "STSONG.TTF",width = 300,height = 300)
word.fit_words(re_dict)
#显示结果
plt.imshow(word)
plt.axis("off")
plt.show()
数据内容分析
进行分词显示
由于是中文显示,需要使用JIEBA进行分词显示
#统计词频
re_dict = {}
re_list = jieba.lcut(result)
print(re_list)
for item in re_list:
if len(item) > 1:
if item not in re_dict:
re_dict[item] = 1
else:
re_dict[item] += 1
#进行词云分析
word = wordcloud.WordCloud(font_path = "STSONG.TTF",width = 300,height = 300)
word.fit_words(re_dict)
#显示结果
plt.imshow(word)
plt.axis("off")
plt.show()
作业练习
对下面网页进行爬取,并且找出目标网页中的所有电影标题、评分、上映年限,每个电影的相关信息组合成一个字典来进行
格式如下:
{"name":电影名称,"score":分数,"year":上映年限}