爬虫实战——豆瓣电影短评爬取
目录
- 一、任务概述
- 心路历程
- 方案制定
- 二、正式开工
- 准备工作
- 处理 json 数据获取电影 id
- 处理短评 html 源码
- 三、全部代码
- 用Access后续处理
一、任务概述
爬取豆瓣电影中2020年中国大陆的电影影评。
心路历程
在豆瓣电影分类栏里面,选取相应的标签(电影、中国大陆、2020),可以看到如下页面。
由于20部电影远达不到数据要求,不禁想要点击最下方的加载更多:鼠标右键->检查元素,切换到network选项,将页面滚动到最下方,点击加载更多。
会在network栏中出现一个网络请求,具体地址如下:https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=电影&start=20&countries=中国大陆&year_range=2020,2020
copy它的链接地址,粘贴并转到,可以获得如下页面。
不难发现,该请求得到的内容中,包含了一系列的电影信息,以json的格式返回,内容截取部分整理后如下:
{"data":[{"directors":["徐展雄"],"rate":"4.3","cover_x":5906,"star":"20","title":"荞麦疯长","url":"https:\/\/movie.douban.com\/subject\/30170833\/","casts":["马思纯","钟楚曦","黄景瑜","王砚辉","王阳明"],"cover":"https://img1.doubanio.com\/view\/photo\/s_ratio_poster\/public\/p2616740389.webp","id":"30170833","cover_y":8268},.........]
}
学过一点英语同时通过对比原来的页面可以推测出各个标签所代表的含义:
- “directors”:导演名单数组
- “rate”:评分
- “cover_x”:封面图片宽度
- “star”:我不清楚
- “title”:电影名
- “url”:页面地址
- “casts”:主演名单数组
- “cover”:封面地址
- “id”:id标识
- “cover_y”:封面图片长度
其中,链接中:
https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=电影&start=20&countries=中国大陆&year_range=2020,2020
start=20 这个参数引起了我的兴趣,修改它的值为0,发现得到的第一个数据就是“送你一朵小红花”,即原页面中的第一个电影。可以确认该参数代表着搜索的起始值。
并且我们不难发现电影地址与 id 的关系。
拖动电影页面,可以看到电影的评论(以短评为例),点进去。
点进去后可以进一步发现短评链接与电影 id 的关系,即:
https://movie.douban.com/subject/电影id/comments?status=P。
有了以上的探索分析,可以确认一个方案下来。
方案制定
使用 python 完成数据爬取,并将数据写入到 Excel 中。
首先,爬取下方链接:
https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=电影&start=20&countries=中国大陆&year_range=2020,2020
保存电影名、评分等信息,最重要的是保存 id 信息,因为我们要用它拼接相应电影的短评地址。
我们可以通过不断的修改 start 参数值获取搜索得到更多的电影。由于每次返回20条电影信息,因此每次将 start 增加20。
循环10次我们就可以得到200个电影,以及对应的电影 id。将id拼接成相应电影的短评地址,并爬取里面的内容:https://movie.douban.com/subject/电影id/comments?status=P
为了简单起见,仅爬取第一页的评论内容。
想爬取更多的评论内容可以修改以下地址的start值并进行爬取:
https://movie.douban.com/subject/35096844/comments?start=40&limit=20&status=P&sort=new_score
二、正式开工
准备工作
引入下列需要的包
import requests #请求网页源码,本文涉及到两种格式:html和json
import json #解析json格式的内容
from bs4 import BeautifulSoup #解析html格式源码
import random #产生随机数
import xlsxwriter #用于写入表格
时常,为了避免被反爬虫程序拦截,可以使用用户代理掩护:
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60','Opera/8.0 (Windows NT 5.1; U; en)','Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 ','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36'
]def getHeaders():i = random.randint(0, 10)user_agent = user_agents[i]headers = {'User-Agent': user_agent}return headers
上面给了10个代理,每次爬取随机产生一个,使用如下:
response = requests.get(url, headers=getHeaders())
处理 json 数据获取电影 id
一切就绪,先处理 json 格式内容,以获取一系列电影 id。
def gennerateIds():ids=[]infos=[]url = 'https://movie.douban.com/j/new_search_subjects?sort=R&range=0,10&tags=电影&countries=中国大陆&year_range=2020,2020' #待爬取链接,本来还有start参数,被单独揪了出来for i in range(10):params={"start":20*i} #修改start参数,步长20,循环10次response = requests.get(url, headers=getHeaders(),params=params) #随机获取一个代理,并传入start参数data = json.loads(response.text) #直接将爬取获得的文本内容加载进来,loads()会返回一个字典类型,保存在变量data中datalist = data["data"] #直接用字典访问方式就可以访问data内容for item in datalist:ids.append(item["id"])#电影idinfos.append((item["id"],item["title"],item["rate"],item["casts"],item["directors"]))#电影id,电影名,评分,主演,导演等return ids,infos
if __name__ == '__main__':ids,infos=gennerateIds() #保存返回的内容# 下面创建一个 Excel 工作簿,添加两个表,分别用于保存短评和电影信息workbook = xlsxwriter.Workbook('data3.xlsx')worksheet = workbook.add_worksheet('comments')worksheet1 =workbook.add_worksheet('movie_info')# 写入 Movieinfosrowindex=1 #控制写入表格时行数for info in infos:mid=info[0]title=info[1]rate=info[2]casts=""dires=""for name in info[3]:casts+=name+" "for name in info[4]:dires+=name+" "worksheet1.write_row(rowindex,0,(mid,title,rate,casts,dires)) #写入表格rowindex+=1
处理短评 html 源码
首先需要了解到每个评论对于的链接,知道它们的结构,在页面中,右键鼠标->检查元素。可以看到,每个短评内容都在class属性为“comment-item ”的div中。
rowindex=1for id in ids:#根据 id 拼接 urlcommenturl="https://movie.douban.com/subject/"+id+"/comments?status=P"response2 = requests.get(commenturl, headers=getHeaders())# 用BeautifulSoup解析html = BeautifulSoup(response2.text, 'xml')comments = html.find_all("div", attrs={"class": "comment-item "}) #找到所有短评的div,注意这里有一个空格for comment in comments:cid,name,text=pauseComment(comment) #解析每个短评的div的函数,下面给出worksheet.write_row(rowindex, 0, (id,cid,name,text)) #写入表格rowindex+=1
先观察我们需要的内容所在的标签,用户名在div->div->a标签的title属性,评论内容为一个“class”=“short”的span标签中的文本内容
解析函数如下:
def pauseComment(commenthtml):id=commenthtml['data-cid']name=commenthtml.div.a['title']span=commenthtml.find_all('span',attrs={"class":"short"})[0]text=span.textreturn id,name,text
最后别忘记了关闭工作簿。
workbook.close()
三、全部代码
import requests
import json
from bs4 import BeautifulSoup
import random
import xlsxwriteruser_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60','Opera/8.0 (Windows NT 5.1; U; en)','Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 ','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36'
]def getHeaders():i = random.randint(0, 10)user_agent = user_agents[i]headers = {'User-Agent': user_agent}return headersdef gennerateIds():ids=[]infos=[]url = 'https://movie.douban.com/j/new_search_subjects?sort=R&range=0,10&tags=电影&countries=中国大陆&year_range=2020,2020'for i in range(10):params={"start":20*i}response = requests.get(url, headers=getHeaders(),params=params)data = json.loads(response.text)datalist = data["data"]for item in datalist:ids.append(item["id"])infos.append((item["id"],item["title"],item["rate"],item["casts"],item["directors"]))return ids,infosdef pauseComment(commenthtml):id=commenthtml['data-cid']name=commenthtml.div.a['title']span=commenthtml.find_all('span',attrs={"class":"short"})[0]text=span.textreturn id,name,textif __name__ == '__main__':ids,infos=gennerateIds()workbook = xlsxwriter.Workbook('data3.xlsx')worksheet = workbook.add_worksheet('comments')worksheet1 =workbook.add_worksheet('movie_info')# 写入 Movieinfosrowindex=1for info in infos:mid=info[0]title=info[1]rate=info[2]casts=""dires=""for name in info[3]:casts+=name+" "for name in info[4]:dires+=name+" "worksheet1.write_row(rowindex,0,(mid,title,rate,casts,dires))rowindex+=1# 写入影评数据rowindex=1for id in ids:print(id)commenturl="https://movie.douban.com/subject/"+id+"/comments?status=P"response2 = requests.get(commenturl, headers=getHeaders())html = BeautifulSoup(response2.text, 'xml')comments = html.find_all("div", attrs={"class": "comment-item "})for comment in comments:cid,name,text=pauseComment(comment)worksheet.write_row(rowindex, 0, (id,cid,name,text))rowindex+=1workbook.close()
用Access后续处理
先上数据成果吧,有两个表格,在一个工作簿里面:
导入到Access数据库:
两个表都要勾选“第一列包含列标题”。
导入第二个Movie_info表时可以把第一个字段作为主键。其他直接点下一步。
创建关系:
创建查询设计:
完成!
爬虫实战——豆瓣电影短评爬取相关推荐
- easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化
最近自学了简单的爬虫项目,简单记录下自己的小白学习路径. 本次爬取的是豆瓣电影TOP250数据,主要用到beautifulsoup.re.urllib库.SQLite包,数据可视化方面主要用到flas ...
- JAVA爬虫(一):豆瓣电影排行榜爬取
JAVA爬虫(一):豆瓣电影排行榜爬取 前言 流程图 步骤 一.爬取豆瓣电影榜单网页源代码 二.网页源码解析 三.爬取单个电影网页源码 四.源代码解析及关键信息获取 前言 最近和大创队友一起给大创做的 ...
- xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验
影评许可证 公众号[2019]第22期 本栏目由"数据皮皮侠"独家呈献 专场 python爬虫实战--豆瓣电影get初体验 2019.10.28 / 早上7点场 / 免费 本期&q ...
- 爬虫实战——豆瓣电影Top250
爬虫实战--豆瓣电影Top250 准备阶段 网页分析 在目标网页直接ctrl+u查看网页源代码(或者F12审查),豆瓣的网页源代码就出现了(非常友好): <!DOCTYPE html> & ...
- Python 爬虫实战,模拟登陆爬取数据
Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...
- 豆瓣电影影评爬取---最受欢迎的影评[xpath语法]
豆瓣电影影评爬取---最受欢迎的影评[xpath语法] 1.基础环境配置: requests-->版本:2.12.4 lxml-->版本:3.7.2 2.爬取网址:https://movi ...
- Python爬虫实战系列(一)-request爬取网站资源
Python爬虫实战系列(一)-request爬取网站资源 python爬虫实战系列第一期 文章目录 Python爬虫实战系列(一)-request爬取网站资源 前言 一.request库是什么? 二 ...
- Colly实现豆瓣电影Top250爬取
使用 Colly 实现 豆瓣电影Top250爬取 package mainimport ("encoding/csv""github.com/PuerkitoBio/go ...
- python爬虫实战(一)--爬取知乎话题图片
原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...
最新文章
- Python 动态生成多维数组
- JNDI配置原理详解
- 阿里云与A站在一起后,悄悄干了件大事
- 《Reids 设计与实现》第十六章 集群(下)
- 旋转成分矩阵结果分析_30分钟学会PCA主成分分析
- 使用 SqlDataSource 控件查询数据47
- notepadpython插件_Notepad Python
- OpenCV学习——摄像头人脸识别
- sqlserver去空格函数
- 微信中那些你不知道的隐藏实用功能!
- Aspack壳代码分析
- X509证书信任管理器类的详解
- 【高中数学】数列 · 通项求法
- Start Developing iOS Apps (Swift) 中文翻译版
- MySQL程序员面试笔试宝典pdf_数据库程序员面试笔试宝典
- 分形图(fractal pictures)
- 《IBM SPSS Modeler数据与文本挖掘实战》之文本挖掘算法
- 用python每日更换“必应图片”为“桌面壁纸”
- 《翻转组件库之init项目》
- shell基础正则表达式
热门文章
- [manjaro] unzip-icon解决解压zip文件乱码
- ubuntu16.04自动切换桌面壁纸
- pc控制iphone的软件_iPhone Share?这里有一款在 PC 端控制 iPhone 的工具
- 污到不行的名人名言(2)
- 1553B学堂在线课程笔记
- 富士通半导体携手奇瑞汽车
- 关于中断的模式 RXNE TC TXE 等等的含义(看着就乱)
- GaN Systems 和 Phihong 首次亮相游戏笔记本电脑电源
- 面向网络转型的编排管理系统和ONAP自研产品介绍
- 比较for、for...in、for...of、forEach