欢迎光临散文网 会员登陆 & 注册

Scrapy爬取豆瓣电影TOP250并保存数据、下载海报图片

2023-03-14 15:14 作者:码夫破石  | 我要投稿

利用scrapy爬取数据并保存到Excel,Sqlite,Mysql,Json,Csv。其中Json和csv文档,scrapy是集成了的,这里主要解决一下中文乱码的问题。目标网站——https://movie.douban.com/top250。需要爬取的字段为排名中文标题评分评价人数电影的主题,内页的片长,上映日期还有电影简介

环境:

    ---windows 11

    ---python 3.8.9

    ---Pycharm

    ---scrapy 2.7.1

首先打开windows命令终端,切换到想保存项目的文件夹,如:D:\Python Porjects:

新建scrapy项目:

切换到douban文件夹:

在该文件夹下创建两个爬虫模板:

创建好后,在windows资源管理器中打开项目所在目录,右键Open Folder as PyCharm Project。也可以先打开PyCharm,在PyCharm的欢迎界面将项目文件夹拖入。

打开之后,为项目创建一个虚拟环境,懒的话可以直接用略过。虚拟环境的用处一般是项目需要给别人用,需要打包当前环境下所有的依赖项的时候。

虚拟环境创建方法:在PyCharm中,File——settings——Project:(项目名)——单击Python Interpreter,找到Python Interpreter最右边的齿轮,单击它,Add,在弹出的选项中(Virtualenv Environment)选择Location(路径),Base interpreter为默认当前默认解释器就好。其他的不用填,直接点ok。

创建好虚拟环境后,所有的依赖项都从虚拟环境安装。在当前项目下的PyCharm中,选择底部的Terminal,打开Pycharm内置的终端,查看当前虚拟环境下的依赖项:

当自己的项目需要给别人用时,依赖项打包:

正文开始

1,设置爬虫字段

安装好依赖项后,切换到项目下的items.py文件,先来设置预爬取的字段,代码如下:

2,编写爬虫文件:

接着切换到项目文件夹下的爬虫文件db.py,开始解析响应。代码如下:

在终端运行scrapy crawl db,字段都采集到了,并且数据格式都正确。但是,这仅仅是第一页的数据,接下来修改一下爬虫代码:

修改的部分在第一个回调函数parse()的最后,next_page_urls部分的代码就是翻页的逻辑。

有一些逻辑(比如scrapy的crawl模板),再比如从开始请求的时候就构造好十个页面的链接,代码如下:

上面的两种情况可能会导致多爬25条,那是因为第一页的链接有两个:

上面这两个链接,在scrapy调度器里是两个不同的url,它会给两个链接进行排队,然后交给引擎,引擎再交给下载器下载,下载后引擎交给爬虫处理,爬虫处理出来的数据是一样的,但是链接不一样,所以会多出25条。要解决这个问题,最简单的办法就是将start_urls改为:https://movie.douban.com/top250?start=0&filter=,釜底抽薪。

3,下载器中间件设置COOKIES:

a, 为请求设置cookies

实现好了翻页之后,最重要要做的事就是模拟登录,豆瓣电影,请求过多,Ip就会被封了,登录后就可以无限访问。设置cookies是一种很好的办法。先从网页登录一下豆瓣账号,打开浏览器的开发者调试工具,将请求头中的cookies复制下来。然后切换到项目文件下的middlewares.py——下载器中间件,为请求设置cookies,代码如下:

为了简化代码,将原来的爬虫中间件全部pass掉了,下载器中间件的里的类方法也pass掉了。只在类方法process_request()中设置了cookies。运行的时候还是得加上。

b,随机的User-Agent

如果要切换随机的User-Agent,也是在中间件里定义,代码如下:

c,为请求设置代理或者代理池(略)

写好后,在项目文件夹下的settings.py文件中开启中间件,代码如下:

4,Scrapy数据管道保存数据

scrapy处理数据用到的是管道文件pipelines.py,我打算保存数据到csv(内置),json(这个其实scrapy内置了,但是中文会乱码,通过管道来处理,Excel,Sqlite,Mysql。

首先csv和json保存方法很简单,打开终端:

管道文件编写都在项目文件夹下的pipelines.py中。

a,保存Json文件数据的管道:

写好之后在项目文件夹下的settings.py文件中配置管道:

b,保存数据到csv文件的管道:

只要将encoding的值写成utf-8-sig,用excel打开的时候就不会出现乱码的情况。写好之后在settings.py中配置管道。

c,保存数据到Excel文档的管道:

管道写好后,在项目文件夹下的settings.py中启用管道:

d,保存数据到sqlite数据库的管道:

同样的,在settings.py中开启管道:

e,第五个管道是MySql,代码如下:

写好之后在settings.py中配置管道:

f,保存海报图片的管道:

我在预设字段的时候预设了电影的海报,那就最后再配置一个下载文件的管道,这个管道要继承scrapy内置的文件管道,对海报图片进行重命名(以电影名称命名),代码如下:

写好之后在settings.py中配置管道并开启文件存储路径:

下载海报图片没有继承scrapy的ImagesPipeline,因为scrapy的图片管道是继承文件管道的,而且scrapy在请求图片下载的时候可能会多几个字节少几个字节都是有可能的,但是下载文件肯定是原数据下载,也就是说,如果在下载高清图片的时候,图片管道和文件管道的质量可能会相差很多。用scrapy下载文件,推荐用文件管道。如果遇到因为robots文件规则禁止下载图片的话,在settings.py里将遵循robots的规则设定改为False就行了:

至此,一个爬取豆瓣电影TOP250的爬虫就制作完成了。

最后运行:

scrapy crawl db

不出意外的话,所有数据都会保存到指定的位置。

Scrapy爬取豆瓣电影TOP250并保存数据、下载海报图片的评论 (共 条)

分享到微博请遵守国家法律