请选择 进入手机版 | 继续访问电脑版

基于Scrapy框架的豆瓣影评及评分爬取

[复制链接]
奋斗在韩 发表于 2021-1-1 10:28:49 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
一、创建爬虫项目,明确爬取信息
1.1创建Scrapy项目nz_comments
1.1.1使用交互行创建Scrapy项目
爬虫项目在Pycharm的工作目次下创建。首先复制Pycharm的工作目次。
①下令行 cd C:\Users\Administrator\PycharmProjects
②下令行 scrapy startproject nz_comments
乐成创建爬虫项目nz_comments.
1.1.2Pycharm打开项目nz_comments

该项目中,有Scrapy框架的各个核心组件——爬虫spider,项目管道pipelines,中间件middlewares等。
1.2查察豆瓣影评网站,明确爬取信息
1.2.1登录豆瓣影评网站
《哪吒之魔童降世》短评网站:
https://movie.douban.com/subject/26794435/comments?status=P

1.2.2欣赏网页观察重要信息
本项目最终的目标是通过批评词来预测评分,因此要爬取的信息只有两个——评分及批评。

二、编写爬虫步伐,实现信息爬取
2.1 编写爬虫步伐前的预备
2.1.1 如何爬取多页
我们把网站拉到最下面,点击“后页>”。

得到下一页网站界面 =>

通过观察网站布局,发现规律。
https://movie.douban.com/subject/26794435/comments?start=20&limit=20&status=P&sort=new_score
咱们对比一下第一页,第二页和第三页。
第一页:
https://movie.douban.com/subject/26794435/comments?status=P
第二页:
https://movie.douban.com/subject/26794435/comments?start=20&limit=20&status=P&sort=new_score
第三页:
https://movie.douban.com/subject/26794435/comments?start=40&limit=20&status=P&sort=new_score
可以看的出来,从第二页开始,改变的只是start里面的值,第二页是201,第三页是202,那么第n页就是20*n.
我们通过这个规则爬取多页。
2.1.2 如何获取评分和批评的HTML标签位置
回到第一页。按F12,打开“开发者工具”。

随后把鼠标移动到评分栏,点击。

可以看到,评分在这一栏。豆瓣的评分不是直接打分,这里的四分对应“推荐”,如果是五分对应“力荐”。先爬下来,后期我们把信息处理惩罚成数值型。
在这一栏,右键复制Xpath。

得到评分Xpath:
/html/body/div[3]/div[1]/div/div[1]/div[4]/div[1]/div[2]/h3/span[2]/span[2]
同理,得到批评Xpath:
/html/body/div[3]/div[1]/div/div[1]/div[4]/div[1]/div[2]/p/span
2.1.3 如何把各个用户当成一个整体爬取数据
这里涉及到Xpath方法里的选择器,我们需要在服务器响应的HTML文档上先获取所有用户的Xpath,再遍历每个用户,获取每个用户的评分和批评。
同样是通过上面的方法,不外要把鼠标移到整个用户块。

一个用户对应一个

  

可以看到第一页的全部20个用户的批评信息,都并列存放在此。那么我们的选择器列要包罗全部的用户div,就找到它们的父节点。

也就是

我们想找到它的Xpath,可以通过子节点往上找一个节点。
我们看看第一个用户的Xpath:
  

得到: /html/body/div[3]/div[1]/div/div[1]/div[4]/div[1]
也就是说,父节点Xpath为:/html/body/div[3]/div[1]/div/div[1]/div[4]
那么选择器列为 /html/body/div[3]/div[1]/div/div[1]/div[4]/div
这样选择器列就包罗了所有的用户,遍历即可。
但有一个坑,就是,往下翻,有两个同级div不是用户信息。

显然下面两个不是我们所需要的,那么选择器最后写div肯定是不可,修改一下为:
/html/body/div[3]/div[1]/div/div[1]/div[4]/div[@class=”comment-item ”]
这个要仔细看,会发现comment-item反面尚有一个空格。
2.2 编写爬虫步伐
2.2.1 伪装欣赏器为用户
在settings.py文件里,把注释掉的USER_AGENT赋值为欣赏器名。
获取欣赏器名的方法为:
①点击“开发者工具”里的“网络”,英文对应“Network”。并点击“重新载入”。

====》》

复制粘贴到settings.py文件中。

2.2.2 设置不遵守爬虫约定

2.2.3 编写封装文件items.py
我们要爬取的评分和批评封装到item对象中,这是一个类字典对象,后续可以将封装的item,通过项目管道pipelines举行数据处理惩罚,还可以通过下载器中间件middlewares设置随机USER-AGENT以及ip署理。

2.2.4 编写spider.py文件,创建爬虫CommentSpider类
这个spider.py文件要创建在spiders的目次下。

到这里开端编写完了爬虫项目,针对这简单的第一页可以试着爬取数据并存到项目目次下的csv文件中。
【小试牛刀】
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment -o comment_score.csv
(运行爬虫步伐,中间的comment就是CommentSpider类一开始界说的爬虫名comment,-o comment_score.csv是指把爬取并封装生成的item一条一条存入comment_score.csv这个文件中)

乐成!
但出现了一个问题,就是文本出现了许多换行。

我们可以从下令行得到验证。

2.2.5 编写pipelines.py文件,将数据格式化&长期化
第一个目标是实现数据格式化。编写NzCommentsPipeline类。

编写完数据格式化类,还需要在settings.py文件里启用这个项目管道。

这里的数值300是用于比力优先级的,反面还会将数据长期化,编写别的一个管道,启用管道时,值越低,优先级越高。
再次运行刚刚的爬虫步伐,看看效果。
发起每次运行把之前的csv文件给删了,否则就会将爬取的信息追加到上次文档的反面。而且因为上次数据格式有误,导致本次存数据时会报错。所以这次必须得把之前的csv文件给删了。

数据格式化乐成!
第二个目标是数据长期化。编写MySQLPipeline类。
导入MySQLdb模块,用于毗连Python和Mysql。

在毗连之前,先要明确毗连的数据库,以及数据插入哪个表。
启用数据库。

使用MySQL Workbench毗连进入,创建新数据库comment_score

设置该数据库为默认操作数据库,创建新表

id 用于查察用户的个数,设置为表的主键,not null,自动增量auto_increment;
comment 用于存储爬取的批评,由于字数较多,将VARCHAR由默认的45改为300;
score 用于存储爬取的评分,改数据范例为int.

建表乐成,表中有3个字段——id,comment和score.
在编写MySQLPipeline类之前,需要在settings.py文件里设置毗连的数据库属性,以便调用毗连。

开始编写MySQLPipeline类。

编写好之后,还需要在settings.py文件里开启这个项目管道。

【小试牛刀】
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment
因为已经把数据存到Mysql里面,所以不需要-o comment_score.csv把生成的item存到csv文件中。

乐成!
2.2.6 使用ip署理
(反爬虫核心本领之一。)
在反面爬取多页内容时,每个页面都需要向服务器端发送一个请求,然后频仍的请求一定会被服务器端察觉,即便是在USER-AGENTS列表随机选取USER-AGENT,也会因为ip地点相同而被发现。因此只用ip署理即可,USER-AGENT就使用之前那一个就好。
ip署理,要钱。
所谓的免费,都是用不了的,有效性极低。
这里推荐“快署理”,至少可以试用4小时。
快署理提供了一个api接口,通过访问该网站来获取ip池。
请求对象Request在发送给下载器之前,还会颠末中间件来处理惩罚一遍,于是ip署理的代码要写在middlewares.py文件中。
详细的代码内容,快署理提供了样例。相应链接:
https://www.kuaidaili.com/doc/dev/sdk_http/

Scrapy框架代码样例里许多内容已经编写,要修改的内容是middlewares.py文件。
①导入模块

②复制代码样例,在middlewares.py文件下面添加ProxyDownloaderMiddleware类。

这里有两个地方要修改。
第一个,打马赛克的地方要填写订单编号,这是在快署理上购买的产品的id,到时候提取ip,该订单的ip余额会发生更改。
第二个,打马赛克的地方要填写快署理的账号暗码,这个是用于快署理登录验证。在快署理背景可以设置登录ip白名单,也就是一个快署理账号,可以给几个人用,ip地点为本机或他机ip地点。不要同时开白名单ip和账号暗码设置,否则ip提取会扣除双倍。
详细试用过程留在反面,先编写完ip署理中间件。
③在settings.py文件中启用ProxyDownloaderMiddleware中间件。

2.2.7 修改comment_spider.py文件爬取多页信息
首先估算一下大概要爬多少信息。爬10000个用户,需要500页。

在分析方法parse里,之前只写了对初始页面(第一页批评页)遍历每个用户,生成封装item对象。因此在该页遍历用户结束后,继续生成Request请求对象,不停地分析返回的response对象,而且产生新的item封装数据。

2.2.8 试用ip署理
快署理试用的方式是:创建账号,购买订单但不支付,把订单号发给客服开通4小时试用。

用邮箱,手机验证注册。乐成注册登录。
找客服免费试用。

根据提示乐成得到试用。

在之前middlewares.py文件里修改ProxyDownloaderMiddleware中间件。

下面的账号暗码,快署理提供的代码样例是这个样子。

得把${username} 和 ${password} 给删掉,只保存字符串引号’’
2.3 运行爬虫步伐
2.3.1 清空数据库表cs里面第一次爬取的数据,重新爬取

别的,还要将该表的id自动增量重新设为1.

2.3.2 开启爬虫
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

乐成爬了一点信息。报错。

爬了198个。回到下令行去检查一下报错信息。

MySQLdb._exceptions.DataError: (1406, “Data too long for column ‘comment’ at row 1”)
批评数据太长了???岂非是之前设置的300个varchar还不敷吗?
到网页中去找到这个批评,看它到底有多长。这个报错信息是第198条,对应批评页第10页。
https://movie.douban.com/subject/26794435/comments?start=200&limit=20&status=P&sort=new_score

确实字数挺多的。有312个字。

而我们的comment最多只能存300个字。这个“短评”不太短。为了防止报错,简单处理惩罚就是直接改为VARCHAR(1000)。

再修改auto_increment自动增量为1,重新爬。

同时把之前储存的数据给删了,清空数据库表。

这样应该没问题了。但在下令行中还发现了一个报错信息。

[scrapy.spidermiddlewares.httperror] INFO: Ignoring response : HTTP status code is not handled or not allowed

也许是调用的ip池,更新速度太慢,而爬取速度太快,之前是10秒钟更新一次ip池,改为5秒。
再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

乐成爬取231个数据,报错7个后再次停止。
分析原因:
①居然评价可以没有评分。

②批评有心情存不了

管理办法:
在项目管道里修改代码,接纳异常处理惩罚。

再重新爬。
这次少爬一点,把total_page改为10,只爬取200条,看看效果。

而且关掉ip署理池。

①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

乐成爬取197条。

没有批评的乐成修改为0分存入。
但尚有3条报错,原因是批评有心情,却没有修改为“这个批评有心情”存入mysql。
分析原因为:

纵然有心情,还是可以对comment举行分割格式化,try可以或许执行,而且格式化后的comment仍然有心情,再把封装数据item拿到MySQLPipeline里面举行长期化时,就会报错。
管理办法:
①在数据格式化阶段,不消异常处理惩罚。

②在数据长期化阶段,对comment举行异常处理惩罚。

再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

乐成!
爬取10页200条,有心情的批评和没评分的用户都给乐成处理惩罚。
将total_page改为500,重新开启ip署理池。


再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

乐成爬取了220条,又报错,原因是
[scrapy.spidermiddlewares.httperror] INFO: Ignoring response : HTTP status code is not handled or not allowed
分析原因:
大概是USER-AGENT单一,纵然更换了ip仍然被发现了。
管理办法:
在middlewares.py文件里编写中间件NzUserAgentMiddleware,接纳USER-AGENTS随机选取USER-AGENT。
①导入模块

②编写中间件NzUserAgentMiddleware

③启用中间件NzUserAgentMiddleware

再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

又是爬了220条信息报错,同样的报错。
分析原因:
查察网站。
https://movie.douban.com/subject/26794435/comments?start=220&limit=20&status=P&sort=new_score

明确了。前20页是可以爬的,但反面的没有访问权限。(因为默认平常用户查察前面的批评,如果翻到反面那大概是爬虫了)。
不外如果是登录状态的话,就有相应的权限了。
管理办法:
模拟登录。
在爬虫的初始请求,使用账号暗码登录。
①导入模块scrapy.FormRequest,导入模块json(这是因为要使登录页面返回文本信息分析为json数据)

②修改初始请求信息,编写登录分析方法。

再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

报错:参数缺失。
分析:原因不详。改用cookies验证登录。
管理办法:
①打开登录界面,F12开发者工具,勾选连续记录。登录。

②记录COOKIES值。

将所有COOKIES以键值对的方式生成一个cookies字典。(原来有专门的办法获取cookies,但我的火狐欣赏器失效,谷歌欣赏器80.x以上版本无法使用,相应的模块是browsercookie)。
comment_spider.py文件规复到没有用账号暗码模拟登录之前。

到场cookies,并在生成请求对象时添加cookies参数。

再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment

又乐成爬了220条。
分析原因:
大概是使用差别的ip,新的ip+cookies无法验证乐成。
实验管理:
①在网站
https://movie.douban.com/subject/26794435/comments?start=220&limit=20&status=P&sort=new_score
里用开发者工具查找该网页的cookies值,并在comment_spider.py文件里修改。

②禁用中间件,USER-AGENT和IP署理都禁用。使用自己的USER-AGENT和IP,看看能否cookies模拟登录及爬取未登录克制访问的网页。

再重新爬。
①下令行 cd C:\Users\Administrator\PycharmProjects\nz_comments
(这是我nz_comments的目次)
②下令行 scrapy crawl comment
仍然克制访问。
最后的管理思路:
①不消ip署理,就用本机ip,欣赏器USER-AGENT,用cookies模拟登录。一次爬少量数据,逐步爬,晚上服务器访问量少再爬,设置爬虫的延迟。如果署理ip对cookies有效,就分次取ip,每个ip爬10页。
②既然谷歌欣赏器80.X版本用不了browsercookie模块获取cookies,那么就下载低版本谷歌欣赏器,而且限制其自动更新。

来源:https://blog.csdn.net/Oh_science/article/details/111998293
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )