一、背景
最近比较有时间,于是学习了一下python,并尝试爬取了自己比较感兴趣的几个网站,如纵横中文小说网、千图网以及GIF动态图网站,成功爬取这几个网站的数据后,在这里总结下爬取此类网站的一些固定套路以及遇到的一些问题
二、项目架构
本人使用的Python环境时python3.8,爬虫主要依赖的是scrapy框架以及requests库,这些第三库可以使用pip工具安装,如果安装速度很慢,可以更换下载源,操作方式请自行百度或询问我,pip直接安装scrapy时可能出现安装失败的情况,如果安装失败可以参考scrapy安装进行安装
三、案例说明
学习了scrapy框架后,我第一个练手的项目就是纵横中文网,这里我的目的是爬取指定小说的全部内容,刚开始做的时候比较low,数据全部保存在一个txt文件中。项目代码地址:纵横中文网爬虫项目
使用scrapy框架创建一个爬虫项目非常的简单:在命令窗口执行命令 scrapy startproject 你的项目名 即可
这时查看对应的目录下就会多出一个名为demo的项目,我们用vscode打开此项目查看下项目结构
这就是一个基本版的scrapy项目框架,其中items.py是用来书写保存爬虫数据的对象,pipelines.py是用来编写处理爬取数据的位置,settings.py使用来更改环境配置的位置,而spiders文件夹下面用来编写具体的爬虫操作的python对象
下面让我们以纵横中文网的爬虫案例讲解下如何使用scrapy框架
第一步:编写item
其实就是定义要爬取的内容
第二步:编写爬虫文件,在spiders文件夹下创建对应的爬虫文件
重点来了,创建好这个文件后,文件名和其中的爬虫类名不重要,重要的是爬虫的类的name字段的要和文件名保持一致,
其次是allowed_domains设置为你希望爬取的网站的域名
start_urls存储的是开始爬虫的第一个地址
最重要的是parse函数,这个函数是爬虫开始后获取到响应数据第一个调用的函数,我们在这个函数里编写解析响应数据的代码
首先我们查看下要爬取的页面:
可以看到这个页面上直接展示了所有的章节数据,我们要做的第一步就是找到对应的详情页的链接地址,这里我采用的xpath方式
'//ul[@class="chapter-list clearfix"]/li/a/@href',获取到对应的链接地址列表后,我们采用循环的方式异步调用
这个地方创建的item就是需要保存的数据对象,通过yield请求详情页的地址并指定回调函数为parseText,传递item数据
接下来就是在parseText函数中处理详情页的数据,解析数据的方式也是xpath
然后将对应数据存入item对象;至此数据解析完毕
第三步:处理解析到的爬虫数据
在pipelines.py中编写对应的代码,其实就是处理获取到的item数据
这个类中默认有一个方法process_item方法处理解析到的数据,但爬取小说数据时,我们不能直接在这个函数里进行处理,因为小说章节都是由顺序的,而scrapy框架是异步编程,这样就会导致写入文件的顺序变乱,为了解决这个问题,我们需要重写open_spider和close_spider方法,在close_spider中完成文件的写入操作,这个应该比较容易理解,就相当于我们存储了多次item,process_item在每次获取到item时都会调用,而open_spider和close_spider只会在连接和关闭时调用一次,这样就可以自行处理获取到的数据
第四步:配置setttings.py
在这个文件中配置对应的环境数据,如浏览器请求参数和爬虫处理的管道数等
至此,爬虫项目编写完成。
既然爬取这样的小说网站可以,那么我们也可以参照这个方式爬取图片网站的数据,这里我选择的千图网的gif动图数据
项目代码地址:千图网爬虫
核心的爬虫代码如下所示:
完成这个项目后我又找了福利汇的网站进行爬取
项目地址福利汇
在这个项目里实现了保存数据至数据库,如下图所示
这些数据量挺大的,全部下载要比较久的时间,所以我就直接存在数据库了
针对上面三个练手项目,我们可以轻易的掌握使用scrapy这个框架进行爬虫,我作为一个python的初学者,编写一个这样的项目也只需要一个小时以内而已。此外我还编写了一个爬取买家秀的项目,欢迎大家访问我的码云主页查看。
使用这个框架的基本套路是:
编写item,定义需要的字段,编写爬虫文件,针对分页的数据,就按照如下的套路,在parse函数中获取详情的链接,以循环的方式请求详情页的数据解析,循环结束后,继续请求下一页的数据,在pipelines文件中编写处理爬虫数据,是不是感觉很简单呢,今日的分享到此为止,欢迎大家有任何问题加我微信交流技术,大家一起进步。