一、创建爬虫项目,明确爬取信息

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,打开“开发者工具”。

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

可以看到,评分在<span class=”allstar40 rating” title=”推荐”>这一栏。豆瓣的评分不是直接打分,这里的四分对应“推荐”,如果是五分对应“力荐”。先爬下来,后期我们把信息处理成数值型。
在这一栏,右键复制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 <403 https://movie.douban.com/subject/26794435/comments?start=220&limit=20&status=P&sort=new_score>: 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 <403 https://movie.douban.com/subject/26794435/comments?start=220&limit=20&status=P&sort=new_score>: 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,那么就下载低版本谷歌浏览器,并且限制其自动更新。

下载谷歌浏览器75.0,关掉各种自动更新。用其账号密码登录豆瓣。登录一次之后,浏览器中就留下了cookies。

可以只筛选出豆瓣的cookies。

这样就构建了豆瓣的cookies字典,直接传入Request对象作参数即可。
用cookies必须要在谷歌浏览器登录账号后,而且账号不能退出,一旦退出账号cookies就暂时失效了。
修改comment_spider.py文件。
①导入browsercookie模块。

②编写初始化方法__init__ ,并修改爬取的页面,创建cookiedict作参数生成Request对象。

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

成功!
剩下最后一个问题:通过随机USER-AGENT,IP能否用cookie登录豆瓣。

基于Scrapy框架的豆瓣影评及评分爬取相关推荐

  1. 朴素贝叶斯情感分析评分python_「豆瓣影评」从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(上) - seo实验室...

    豆瓣影评 一.爬取豆瓣影评 基本思路:先获取每个电影的评论区链接,然后依次进入其评论区爬取评论.选取10部电影,每部200条评论. 用到的包为:BeautifulSoup,urllib 这里选取的链接 ...

  2. 【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

    基于Scrapy框架的图片管道实现图片抓取 前言 本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取,并以抓取 360 图片为例进行展示. 正文 1.Scrapy框架抓取图片原理 利用 S ...

  3. 使用scrapy框架实现,房天下网站全站爬取,详情,动态,评论,户型,图片.

    scrapy  实现代码,代码有点多,没有优化,,下面有链接,不懂得留言 Github全部代码,https://github.com/Agile929/scrapy_fang # -*- coding ...

  4. 基于scrapy的B站UP主信息爬取

    文章目录 思路分析 项目目录 代码 结果 思路分析 本次爬取的信息,包括UP主的mid.昵称.性别.头像的链接.个人简介.粉丝数.关注数.播放数.获赞数. 我的思路是,首先,选择一位B站比较火的UP主 ...

  5. 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

    python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...

  6. 基于Scrapy框架爬取豆瓣《复联4》影评,并生成词云

    基于Scrapy框架爬取豆瓣<复联4>影评,并生成词云 1. 介绍及开发环境 2. 爬虫实现 2.1 新建项目 2.2 构造请求 2.3 提取信息 2.4 数据存储 2.4 运行结果 3. ...

  7. Python爬虫实战之二 - 基于Scrapy框架抓取Boss直聘的招聘信息

    Python爬虫实战之三 - 基于Scrapy框架抓取Boss直聘的招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于 ...

  8. Scrapy 框架获取豆瓣电影的信息(包括图片)和电影评论-1

    文章目录 一.项目目录 二.定义爬取结果存储的数据结构(items.py) 电影信息 评论信息 三.爬取到结果后的处理类(spiders 文件夹) 电影信息(movieInfo.py) 评论信息(co ...

  9. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...

最新文章

  1. C#实现php的hash_hmac函数
  2. Mysql show Status参数详解
  3. win服务器管理器“丢失”了怎么办?
  4. java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
  5. srtvlet filter
  6. ListBox和ComboBox绑定数据简单例子
  7. 机器学习--逻辑斯谛回归(Logistic Regression)
  8. HTTP摘要认证原理以及HttpClient4.3实现
  9. zoom在win7上安装失败
  10. 如何下载央视网视频,下载视频播放花屏怎么办
  11. 在电脑上通过手机发短信
  12. MapReduce的执行流程
  13. SSM疫情防控志愿者管理系统 志愿者服务信息系统 大学志愿者管理系统Java
  14. C指针之初始化(三)
  15. nginx locating匹配问题(1) ---cookie
  16. 11 Tornado - 使用模板
  17. php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
  18. 电子商务计算机网络的定义,网络营销的定义概念是什么
  19. 016:Django商城短信和邮箱注册
  20. 计算机睡眠模式游戏开着,win10,win7玩游戏频繁进入睡眠模式,求解。

热门文章

  1. CSDN编程竞赛第6期-参赛心得以及个人题解
  2. python——自学入门
  3. 【gin学习笔记】07初识GROM使用GORM进行数据库操作
  4. 小米消息限制 极光推送接入小米通道https://api.xmpush.xiaomi.com/v1/trace/quota/get
  5. matlab中的三维可视化实现
  6. ggplot2--饼状图
  7. 学习故事:在学习中研究,最给力的学法
  8. 【人工智能与深度学习】监督方法的成功故事: 前置训练
  9. 微信小程序入门笔记-1
  10. 118_IMtoken中,代币名字后面多了数字