需求:抓取《纯洁心灵·逐梦演艺圈》的短评,并通过词云分析高频词语
(一)分析页面
1.首先访问《纯洁心灵·逐梦演艺圈》链接:
https://movie.douban.com/subject/26322774/comments?status=P
发现页面渲染并不是rest风格的request,在network中没有返回XHR格式的response,所以需要请求页面,解析html页面抓取数据
2.查看短评在页面中的位置,位于class=' comment-content'的p标签的span标签的文本中(注意' comment-content'前有一个空格)
所以xpath表达式为:"//p[@class=' comment-content']/span"
3.首页短评url为:https://movie.douban.com/subject/26322774/comments?status=P
后续每页短评url为:https://movie.douban.com/subject/26322774/comments?start=20&limit=20&status=P&sort=new_score
所以抓取首页短评时需要特殊处理
(二)准备所需的python module
1)requests库
pip install requests
2)lxml库
pip install lxml
(三)代码
# encoding=utf-8
"""
豆瓣短评spider
"""
import os
import random
import sys
from time import sleep
import requests
from lxml import etree
reload(sys)
sys.setdefaultencoding('utf8')
headers = {
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36",
'Host': 'movie.douban.com',
'Connection': 'keep-alive',
'Accept': 'application/json, text/plain, */*'
}
# 随机睡眠
def random_sleep():
t = random.randint(1, 3)
sleep(t)
def spider_page(url, xpath):
"""
根据xpath表达式解析url指定html页面
:param url:
:param xpath: xpath表达式
:return:
"""
random_sleep()
response = requests.request(method='GET', url=url, headers=headers)
selector = etree.HTML(response.text)
return selector.xpath(xpath)
def spider_douban(subject, path):
"""
将短评写入指定路径文件
:param subject: 豆瓣subject id
:param path: 指定路径
:return:
"""
url = 'https://movie.douban.com/'
url_fisrt_page = url + 'subject/' + str(subject) + '/comments?status=P'
comment_list = spider_page(url_fisrt_page, "//p[@class=' comment-content']/span")
fd = os.open(path, os.O_RDWR | os.O_CREAT)
for data in comment_list:
os.write(fd, data.text) # 写入text
print '第一页爬取完毕'
try:
for i in xrange(0, 20):
print '第' + str(i + 2) + '页写入中...'
url_next_page = url + 'subject/' + str(subject) + '/comments?start=' + str(
i * 20) + '&limit=20&status=P&sort=new_score'
comment_list = spider_page(url_next_page, "//p[@class=' comment-content']/span")
for comment in comment_list:
os.write(fd, comment.text) # 写入text
print '写入数据条数:{}'.format(len(comment_list))
except RuntimeError as e:
print e
os.close(fd)
if __name__ == '__main__':
spider_douban(26322774, '/Users/gcl/tools/os/zhumeng.txt')
output:
第1页写入中...
写入数据条数:20
第2页写入中...
写入数据条数:20
第3页写入中...
写入数据条数:20
第4页写入中...
写入数据条数:20
第5页写入中...
写入数据条数:20
第6页写入中...
写入数据条数:20
第7页写入中...
写入数据条数:20
第8页写入中...
写入数据条数:20
第9页写入中...
写入数据条数:20
第10页写入中...
写入数据条数:20
第11页写入中...
写入数据条数:20
第12页写入中...
写入数据条数:0
第13页写入中...
写入数据条数:0
第14页写入中...
写入数据条数:0
第15页写入中...
发现在13页之后,抓取的数据量变为0
访问url:https://movie.douban.com/subject/26322774/comments?start=500&limit=20&status=P&sort=new_score
显示
豆瓣的反爬虫机制:当爬取前几百条数据时,继续爬取时会提醒没有权限。
解决思路:模拟登陆豆瓣,豆瓣的验证码机制是滑动验证码,在本文中不涉及,后续再讨论
通过selenium解决
(四)词云分析
将抓取的数据放入第三方词云分析库
如有问题,欢迎讨论哦