scrapy爬取⾖瓣电影教程
最近在做爬⾍,也很久没更博客了,这篇长⽂就算是⼀个开更礼吧,Duang
在爬取之前,你得确保你已经有以下的条件:
python3 环境 (在我的机⼦上是python 3.6.5)
scrapy 已经安装
有⼀个Python的IDE 我这⾥是Spyder
为了⽅便调试,在这⾥我们先在Windows10系统进⾏编码,然后在阿⾥云服务器上运⾏
需求分析
在这⾥呢我们要爬取某个特定电影的评论信息,包括:
1. 这个电影的整体评分,实时评分⼈数,各个星段的评价分布。由于这个评分是动态更新的,所以我们不是爬⼀次就完事了,要按照⼀定的时间间隔去爬取更新
源代码大电影2. 这个电影的观众评论内容,评论观众的昵称,ID,评论⽇期,该评论的“有⽤”数
需求不多,我们先来看⼀下该怎么爬
熟悉scrapy
scrapy的架构如下:
⼯欲善其事,必先利其器。在这⾥我们的有⼒⼯具就是scrapy,它是⼀个⾼级Python爬⾍框架,将爬⾍的流程模块化,让你专⼼于爬⾍逻辑的处理,请求调度和⽂件保存的事情它帮你包了。
scrapy的官⽅⽂档写的很良⼼,对scrapy的学习建议从官⽅⽂档下⼿
不过在这个项⽬⾥你没必要从头到尾把官⽅⽂档看⼀遍,我会挑需要的展⽰在这⾥,等你做完这个项⽬对scrapy产⽣了兴趣,再花⼀天时间仔细看下吧。
⾸先我们来建⼀个scrapy项⽬
看看官⽹是怎么说的
我们先新建⼀个⽂件夹,我建在了桌⾯上(F:\Desktop\scrapydouban\),这个地⽅就会是你打算放置scrapy代码的⽬录,然后按住shift+右键在当前⽬录打开cmd窗⼝,我这⾥是默认⽤的powershell,这
并不影响。在命令⾏输⼊
scrapy startproject scrapydouban
来新建⼀个⼯程,相关的⽂件scrapy会给你⽣成好。
如果你打算在别的⽬录建⼯程,在你的项⽬名称后⾯加上路径就好
建⽴好的scrapy⼯程结构会是这个样⼦的
下⾯来分析⼀下每个⽂件的作⽤:
scrapy.cfg 这是scrapy的配置⽂件,⾥⾯配置了这个项⽬的设置和项⽬的名称,使⽤它默认的就好
__init__.py 这个是使得这个⽂件夹的内容成为模块必须的⽂件,保留默认的就好
这个⽂件⽤来定义你爬回来的东西怎样保存
这个是中间件,定义了在请求发送之前可以做的处理(加cookie加useragent等),以及获得响应之后的预处理(状态判断、重定向等等)
这个⽂件定义如何处理爬回来已经存放在items⾥⾯的数据
不须多说,这个⽂件⾥定义了对项⽬的各种设置(采⽤哪个middware,设置爬取时间间隔等等)
spiders/
__init__.py 跟外⾯⽂件夹下的是⼀样的作⽤,留着不⽤改
创建完项⽬框架之后,我们来开始爬数据
⾖瓣⽹址链接分析
我们以4⽉初上映的⾼分电影《头号玩家》为例,
我们要爬的⽹站是这个
我们往下拉到最后,点击后页,跳转之后查看浏览器的URL,发现变成了这个链接
movie.douban/subject/4920389/comments?start=20&limit=20&sort=new_score&status=P&percent_type=
其中,
1.
2. subject/4920389/表⽰是头号玩家这个电影的资料
3. start=20表⽰当前页⾯是从第⼆⼗条评论开始加载
4. sort=new_score表⽰按照热门程度排序
5. limit 应该是每页加载的最多评论数
6. status=P表⽰这是已经看过的⼈的评论,如果status=F则是想看的⼈的评论
7. percent_type= 空表⽰全部评论 percent_type=h表⽰只看好评 percent_type=m表⽰只看中评,percent_type=l表⽰只看差评
那我们要爬的时候,其实只要把URL中的start每次加20就可以了,⼜或者,根据返回的页⾯,查看它的“下页”对应的⽹页元素,从中提取下⼀页的URL,再yield出去
开始写代码
我们得在项⽬的spiders⽂件夹中新建⼀个python⽂件,名称为douban_spyder.py,这个⽂件是爬⾍的主⽂件,必须继承scrapy.Spider 这个类
在我们的douban_spyder.py中,必须实现三个东西:name属性、start_requests()⽅法和parse()⽅法
其中,
1. name是定义这个爬⾍的名字
2. start_requests()⽅法是构造将要爬的⽹页URL,⼀般采⽤yield⽅式返回每个URL,它们将交给scrapy框架去调度。
3. parse() 这个⽅法定义了返回响应之后如何解析,这个是scrapy默认的回调函数,如果你想分别对不同的URL进⾏解析,那么定义⾃
⼰的回调函数也是可以的,只需要在start_requests()⾥构造request的时候加⼊callback=<;你的回调函数>就可以了
我们在start_requests()中构造这个Request,返回给⾃⼰定义的回调函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论