和Scrapy接触不久,做一个项目学习并记录一下,这个代码倒是写了有段时间了,一直没来写博客,这爬虫集合的更新也耽误好久了。随着疫情的好转,我这也恢复正常写博文(糊脸,疫情不是自己不写博文的理由),大家一起加油呀,加油加油,一起都已经好起来了。
实战项目是爬取简书网(https://www.jianshu.com/
) 二级页面信息的Scrapy项目,这也就个入门,大佬看见了一定请指点一下。
目录
一、我对Scrapy的一些浅显的理解
Scrapy就是个爬虫框架,它像个房子的钢筋混凝土框架一样,使得我们可以在这个框架里自由发挥,我们只需要在该安装“门”的地方装上“门”(做填空一样),接下来就可以打开爬虫的大门了,十分的便捷。
我这些浅显的话还是要搭一些科普,不然就太没营养了,我从百*百科cv大法了这个图,下面就我的理解解释一下这图中五大部件:Scrapy Engine(引擎)、Scheduler(调度器)、Downloader(下载器)、Spider(爬虫)、Item Pipeline(管道),及两个中间件:Downloader Middlewares(下载中间件)、Spider Middlewares(爬虫中间件)。
1.1、五大部件
Scrapy Engine(引擎):顾名思义,看到引擎,我就想到了汽车的发动机,这肯定是一个十分十分重要的东西。引擎关联着其他的所有部件,从图里也看出,引擎起到一个信号塔的作用,传递着各部件之间的信息、数据等。
Scheduler(调度器):调度器调度器,调度两个字尤其突出,那我们可以想到调度些什么呢?调度爬虫下载的请求,它会将从引擎传来的请求加入队列当中,当引擎需要的时候再给回引擎。
Downloader(下载器):下载器,啊哈,简单,就是下载网页嘛,不就是爬虫了嘛,错错错,这个下载器不是爬虫,Scrapy分工十分明确的。下载器是按照引擎给的网页请求,下载网页的内容然后返回给引擎,由引擎交给爬虫,它就专门下载网页,也是后面Spider代码里面的response的由来。
Spider(爬虫):这里就比较熟悉了,自己编写爬虫逻辑,进行网页的解析跳转等等操作,我们使用Scrapy绝大功夫都在这里了。
Item Pipeline(管道):这个啊,就是对Spider获取到的数据进行一些处理,包括(清洗,过滤,储存等等)。
1.2、两个中间件
Downloader Middlewares(下载中间件):可以在这里设置下载的请求头,下载的时间间隔,代理等等操作,在一定程度上使Spider更加纯粹了。
Spider Middlewares(爬虫中间件):看图它位于引擎和spider之间,而经由这条线路上的是request请求和response请求的返回还有items爬取结果(就那三根绿线),这个中间件意味可以自己定义扩展request、response和items。
1.3、项目简说
前面讲的五大部件,两个中间件都太理论了,感觉Scrapy离我们还是有点远,下面就简单讲一下项目的知识,后面还有实战。
1、先要安装呢,我这里不介绍普通python安装Scrapy,太复杂了,要安装好多库,我用的是Anaconda,特别方便,在终端cmd输入conda install scrapy
就行,还是有不明白的可以参考Anaconda按照Scrapy。
2、安装好后,输入这条指令,会在你输入指令的那个目录下生成自定义项目名的Scrapy项目。
scrapy startproject 项目名
比如这是我在testScrapy目录下执行了scrapy startproject study
后指定生成的目录,没有任何改动下,我们就是这么多文件。
3、而且它会提示你cd到项目目录下,输入指令生成一个spider文件。
这里我解释一下genspider后接的参数,第一个就是spider的名字,第二个是该爬虫的限定网域,以保证不会爬到别的网页去。
scrapy genspider test www.baidu.com
4、到上面我们这个框架算是完备了,看一下完整的目录。
(这是我的理解,有错误望指点一下)我们要需要修改的也就是test.py(Spider)、item.py、pipelines.py、settings.py。
而我们完成Scrapy项目大体的步骤如下,在后面实战项目中也有所体现:
- 新建爬虫项目
- 分析网页确定爬取的内容,修改items.py
- 编写spider爬虫,准备开始爬取网页了
- 编写pipelines.py,看看数据怎么处理(Scrapy也自带了数据处理)
好了,理论大概都讲完了,下面来个项目感觉一下,在项目里继续学习基础知识。
二、Scrapy简书网项目
1、思路步骤
生成Scrapy项目
scrapy startproject jianshu
生成Spider
scrapy genspider jianshuwang jianshu.com
1.1、分析网页
打开开发者工具看看,这是第一页的url。
因为这个网页没有具体的分页,滑动侧边进度条刷新出了新的内容且网页也没变,所以它是个异步加载,去看一下XHR文件。
我这复制下来了,方便大家看,可以看出它是由多个seen_snote_ids%5B%5D和一个page参数拼接成的,也就是说后面的网页都可以这样来请求,可是seen_snote_ids%5B%5D这个哪来的呢?
https://www.jianshu.com/?seen_snote_ids%5B%5D=60076928&seen_snote_ids%5B%5D=63913898&seen_snote_ids%5B%5D=59873546&seen_snote_ids%5B%5D=63405402&seen_snote_ids%5B%5D=59679766&seen_snote_ids%5B%5D=60717313&seen_snote_ids%5B%5D=62921759&page=2
我们随机取了其中一个全局查找了一下,发现这个id就是文章的data-note-id,ok了,这个问题解决了。
1.2、解析网页
我本来是想爬这些信息的,但考虑到meta的参数还是比较常用的,想分享给大家,于是改爬取详情页的信息(后面那张截图)。
1.3、编写item.py
这个文件会给你一个默认的模板,很方便,跟着修改就行,下面是我们需要的信息。
from scrapy import Item, Field
class JianshuItem(Item):
title_url = Field() # 标题链接
title = Field() # 标题
author = Field() # 作者
author_url = Field() # 作者主页链接
content = Field() # 文章内容
like = Field() # 点赞数
# time = Field() # 发布时间
# word_number = Field() # 文章字数
# reading_volume = Field() # 阅读量
1.4、编写Spider
我们先获取每个文章的url,分析网页可以发现每个文章都是在一个个的li标签内,那先把li解析出来,在Scrapy中,是直接利用xpath解析response,这个response也就是下载器下载下来的网页(之前有提到,大家没忘记吧)。
这里也可以直接用xpath解析文章的url然后用extract()返回一个url的列表,能够理解的可以自己改改,这里为了演示的易懂些。
item = JianshuItem()
li_xpath = '//li'
for li in response.xpath(li_xpath):
# 标题链接
item['title_url'] = 'https://www.jianshu.com' + li.xpath('div/a/@href').extract_first