python爬取豆瓣短评_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)
原创技术公众号:bigsai
前言
在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块、工具知识的使用。然而我所在的组刚好遇到的是python爬虫的小课题。
心想这不是很简单嘛,搞啥呢?想着去搞新的时间精力可能不太够,索性自己就把豆瓣电影的评论(短评)搞一搞吧。
之前有写过哪吒那篇类似的,但今天这篇要写的像姨母般详细。本篇主要实现的是对任意一部电影短评(热门)的抓取以及可视化分析。 也就是你只要提供链接和一些基本信息,他就可以
分析
对于豆瓣爬虫,what shold we 考虑?怎么分析呢?豆瓣电影首页
这个首先的话尝试就可以啦,打开任意一部电影,这里以姜子牙为例。打开姜子牙你就会发现它是非动态渲染的页面,也就是传统的渲染方式,直接请求这个url即可获取数据。但是翻着翻着页面你就会发现:未登录用户只能访问优先的界面,登录的用户才能有权限去访问后面的页面。
所以这个流程应该是 登录——> 爬虫——>存储——>可视化分析。
这里提一下环境和所需要的安装装,环境为python3,代码在win和linux可成功跑,如果mac和linux不能跑友字体乱码问题还请私我。其中pip用到包如下,直接用清华 镜像下载不然很慢很慢(够贴心不)。pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple
登录
进去后有个密码登录栏,我们要分析在登录的途中发生了啥,打开F12控制台是不够的,我们还要使用Fidder抓包。
打开F12控制台然后点击登录,多次试探之后发现登录接口也很简单:
查看请求的参数发现就是普通请求,无加密,当然这里可以用fidder进行抓包,这里我简单测试了一下用错误密码进行测试。如果失败的小伙伴可以尝试手动登陆再退出这样再跑程序。
这样编写登录模块的代码:url='https://accounts.douban.com/j/mobile/login/basic'
header={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',
'Origin': 'https://accounts.douban.com',
'content-Type':'application/x-www-form-urlencoded',
'x-requested-with':'XMLHttpRequest',
'accept':'application/json',
'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9',
'connection': 'keep-alive'
,'Host': 'accounts.douban.com'
}
data={
'ck':'',
'name':'',
'password':'',
'remember':'false',
'ticket':''
}
def login(username,password):
global data
data['name']=username
data['password']=password
data=urllib.parse.urlencode(data)
print(data)
req=requests.post(url,headers=header,data=data,verify=False)
cookies = requests.utils.dict_from_cookiejar(req.cookies)
print(cookies)
return cookies
这块高清之后,整个执行流程大概为:
爬取
成功登录之后,我们就可以携带登录的信息访问网站为所欲为的爬取信息了。虽然它是传统交互方式,但是每当你切换页面时候会发现有个ajax请求。
这部分接口我们可以直接拿到评论部分的数据,就不需要请求整个页面然后提取这部分的内容了。而这部分的url规律和之前分析的也是一样,只有一个start表示当前的条数在变化,所以直接拼凑url就行。
也就是用逻辑拼凑url一直到不能正确操作为止。https://movie.douban.com/subject/25907124/comments?percent_type=&start=0&其他参数省略
https://movie.douban.com/subject/25907124/comments?percent_type=&start=20&其他参数省略
https://movie.douban.com/subject/25907124/comments?percent_type=&start=40&其他参数省略
对于每个url访问之后如何提取信息呢?
我们根据css选择器进行筛选数据,因为每个评论他们的样式相同,在html中就很像一个列表中的元素一样。
再观察我们刚刚那个ajax接口返回的数据刚好是下面红色区域块,所以我们直接根据class搜素分成若干小组进行曹祖就可以。
在具体的实现上,我们使用requests发送请求获取结果,使用BeautifulSoup去解析html格式文件。
而我们所需要的数据也很容易分析对应部分。
实现的代码为:import requests
from bs4 import BeautifulSoup
url='https://movie.douban.com/subject/25907124/comments?percent_type=&start=0&limit=20&status=P&sort=new_score&comments_only=1&ck=C7di'
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
}
req = requests.get(url,headers=header,verify=False)
res = req.json() # 返回的结果是一个json
res = res['html']
soup = BeautifulSoup(res, 'lxml')
node = soup.select('.comment-item')
for va in node:
name = va.a.get('title')
star = va.select_one('.comment-info').select('span')[1].get('class')[0][-2]
comment = va.select_one('.short').text
votes=va.select_one('.votes').text
print(name, star,votes, comment)
这个测试的执行结果为:
储存
数据爬取完就要考虑存储,我们将数据储存到cvs中。
使用xlwt将数据写入excel文件中,xlwt基本应用实例:import xlwt
#创建可写的workbook对象
workbook = xlwt.Workbook(encoding='utf-8')
#创建工作表sheet
worksheet = workbook.add_sheet('sheet1')
#往表中写内容,第一个参数 行,第二个参数列,第三个参数内容
worksheet.write(0, 0, 'bigsai')
#保存表为test.xlsx
workbook.save('test.xlsx')
使用xlrd读取excel文件中,本案例xlrd基本应用实例:import xlrd
#读取名称为test.xls文件
workbook = xlrd.open_workbook('test.xls')
# 获取第一张表
table = workbook.sheets()[0] # 打开第1张表
# 每一行是个元组
nrows = table.nrows
for i in range(nrows):
print(table.row_values(i))#输出每一行
到这里,我们对登录模块+爬取模块+存储模块就可把数据存到本地了,具体整合的代码为:import requests
from bs4 import BeautifulSoup
import urllib.parse
import xlwt
import xlrd
# 账号密码
def login(username, password):
url = 'https://accounts.douban.com/j/mobile/login/basic'
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',
'Origin': 'https://accounts.douban.com',
'content-Type': 'application/x-www-form-urlencoded',
'x-requested-with': 'XMLHttpRequest',
'accept': 'application/json',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'connection': 'keep-alive'
, 'Host': 'accounts.douban.com'
}
# 登陆需要携带的参数
data = {
'ck' : '',
'name': '',
'password': '',
'remember': 'false',
'ticket': ''
}
data['name'] = username
data['password'] = password
data = urllib.parse.urlencode(data)
print(data)
req = requests.post(url, headers=header, data=data, verify=False)
cookies = requests.utils.dict_from_cookiejar(req.cookies)
print(cookies)
return cookies
def getcomment(cookies, mvid): # 参数为登录成功的cookies(后台可通过cookies识别用户,电影的id)
start = 0
w = xlwt.Workbook(encoding='ascii') # #创建可写的workbook对象
ws = w.add_sheet('sheet1') # 创建工作表sheet
index = 1 # 表示行的意思,在xls文件中写入对应的行数
while True:
# 模拟浏览器头发送请求
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
}
# try catch 尝试,一旦有错误说明执行完成,没错误继续进行
try:
# 拼凑url 每次star加20
url = 'https://movie.douban.com/subject/' + str(mvid) + '/comments?start=' + str(
start) + '&limit=20&sort=new_score&status=P&comments_only=1'
start += 20
# 发送请求
req = requests.get(url, cookies=cookies, headers=header)
# 返回的结果是个json字符串 通过req.json()方法获取数据
res = req.json()
res = res['html'] # 需要的数据在`html`键下
soup = BeautifulSoup(res, 'lxml') # 把这个结构化html创建一个BeautifulSoup对象用来提取信息
node = soup.select('.comment-item') # 每组class 均为comment-item 这样分成20条记录(每个url有20个评论)
for va in node: # 遍历评论
name = va.a.get('title') # 获取评论者名称
star = va.select_one('.comment-info').select('span')[1].get('class')[0][-2] # 星数好评
votes = va.select_one('.votes').text # 投票数
comment = va.select_one('.short').text # 评论文本
print(name, star, votes, comment)
ws.write(index, 0, index) # 第index行,第0列写入 index
ws.write(index, 1, name) # 第index行,第1列写入 评论者
ws.write(index, 2, star) # 第index行,第2列写入 评星
ws.write(index, 3, votes) # 第index行,第3列写入 投票数
ws.write(index, 4, comment) # 第index行,第4列写入 评论内容
index += 1
except Exception as e: # 有异常退出
print(e)
break
w.save('test.xls') # 保存为test.xls文件
if __name__ == '__main__':
username = input('输入账号:')
password = input('输入密码:')
cookies = login(username, password)
mvid = input('电影的id为:')
getcomment(cookies, mvid)
执行之后成功存储数据:
可视化分析
我们要对评分进行统计、词频统计。还有就是生成词云展示。而对应的就是matplotlib、WordCloud库。
实现的逻辑思路:读取xls的文件,将评论使用分词处理统计词频,统计出现最多的词语制作成直方图和词语。将评星
python爬取豆瓣短评_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)相关推荐
- 豆瓣用python写的网站_用python写一个豆瓣短评通用爬虫(登录、爬取、可视化)
原创技术公众号:bigsai,本文在1024发布,祝大家节日快乐,心想事成. @ 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是 ...
- python爬虫豆瓣评论实验报告_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...
原创技术公众号:bigsai 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥 ...
- educoder python入门之基础语法-用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...
原创技术公众号:bigsai 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥 ...
- 用python写一个豆瓣短评通用爬虫(登录、爬取、可视化)!
前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥呢?想着去搞新的时间精力可能不 ...
- python爬取微博评论_用 python 爬取微博评论并手动分词制作词云
最近上海好像有举行个什么维吾尔族的秘密时装秀,很好看的样子,不过我还没时间看.但是微博上已经吵翻了天,原因是 好吧,这不是我们关心的,我的心里只有学习 我爱学习 Python 爬虫 本次爬取的是这条微 ...
- python爬去朋友圈_利用Python爬取朋友圈数据,爬到你开始怀疑人生
人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...
- python爬取行业数据_用Python进行Web爬取数据
介绍 我们拥有的数据太少,无法建立机器学习模型.我们需要更多数据! 如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题.我们无法在数据科学项目中获 ...
- python 翻译库本地库_利用python爬取并翻译GEO数据库
原标题:利用python爬取并翻译GEO数据库 GEO数据库是NCBI创建并维护的基因表达数据库,始于2000年,收录了世界各国研究机构提交的高通量基因表达数据,现芯片集数据量高达12万以上.想要从这 ...
- python爬取餐饮数据_使用 Python 分析全国所有必胜客餐厅
本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 在之前的一篇文章中,我讲到如何爬取必胜客官网中全国各大城市餐厅的信息.虽然餐厅数据信息被抓取下来,但是数据一直在硬盘中" ...
最新文章
- Django 的视图层
- CISCO SECURE ACCESS CONTROL SERVER
- aos make 配置环境
- oracle启用amm,oracle AMM、ASMM区别以及相关用法
- 常用元器件使用方法3:电平转换芯片74LVC1T45的使用方法
- gis核密度分析工具_Arcgis软件支持下的核密度估计
- Supervisor进程管理详解
- VUX--小白初学使用安装
- color.cpp:7456: error: (-215) scn == 3 || scn == 4 的解决办法
- 网站微信扫码授权登录
- 利用snowfall.jquery.js实现爱心满屏飞
- android 9.0rom下载,安卓9.0刷机包
- STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计
- 赛码网: 小明很喜欢打字,今天小红给了小明一个字符串。
- 研究生论文致谢怎么写?
- mysql灯是红色的_报警指示灯为什么是红色?
- 情人节程序员用HTML网页表白【情人节表白网页】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- mysql 游标 多字段_MySQL 游标使用 多字段
- 导热材料、热管焊接与导热填料
- ldd3学习之七:中断处理