在配置好Python3
的环境以后,能够在cmd
或者编辑器的终端窗口里使用pip3 list
查看已安装的Python
模块。
安装scrapy框架:
Windows上:在cmd
或者编辑器的终端窗口里使用pip3 install scrapy
,等待提示便可完成。输入scrapy -v
能够查看版本以及帮助命令。如图:
html
scrapy startproject projectname
能够建立爬虫项目,建立完成以后会出现以下图所示的文件结构:scrapy
无关,只是在vscode
中的一些运行配置文件,能够忽略。
在mySpider
文件夹下面有一个spiders
子文件夹和五个.py
文件和一个.cfg
文件。这里对结构作一个简要介绍。spiders
文件夹下面是爬虫文件,__init__.py
为此项目的模块文件,默认为空,暂时不用。items.py
主要用来定义咱们须要获取的数据。middlewares.py
中间件文件,主要用来定义下载中间件和爬虫中间件的内容。pipelines.py
处理获取到数据的文件。settings.py
为项目配置文件,能够对项目进行一些自定义设置,好比开启或者关闭中间件,日志警告等级,启用或者关闭pipelines
,以及其优先级的设置,是否开启cookies
等。scrapy.cfg
内的内容为下图: shell
settings.py
,项目为建立的项目名称。
scrapy genspider spidername domain[starturl]
能够建立一个爬虫,使用命令以后如图:
使用scrapy crawl spidername
能够启动爬虫项目。浏览器
关于数据流向总体大体分为5个部分:
一、Scheduler
:常称为调度器,存放Requests
对象,其中包括url
地址、headers
、post
数据,cookies
、代理等等。Scheduler
会将Requests
对象经过Engine
发送到Downloader
模块进行处理。
二、Downloader
:常称为下载器,此模块在得到Requests
对象以后会对服务器发送请求,而且获得Response
,随后将Response
经过Engine
发送给Spiders
模块。
三、Spiders
:此模块用于提取所须要的数据,能够分为两个部分。第一部分,提取url
,headers
,cookis
,post
等数据组装成Requests
对象经过Engine
发给调度器。第二部分,将提取到有用的数据经过Engine
传递到Item Pipeline
模块。
四、Item Pipeline
:将爬取到的数据列入一个队列,另外是对爬取到的数据进行保存和其余的一些操做。
五、Scrapy Engine
:为整个框架的调度,传递各个模块之间的数据,使得其余4个模块相互独立。除过Item Pipeline
,每一个模块会首先将数据传给Scrapy Engine
,而后由Scrapy Engine
传递给下一个模块。大体的数据流以下图:
服务器
Downloader
和
Engine
之间存在一个
Downloader Middlewares
称为下载中间件,能够对本身的
Requests
请求做出一些修改,好比设置代理
IP
,修改
UA
等。在这里
Requests
和
Response
都是通过这个组件的。
Spiders
和
Engine
之间存在着一个
Spider Middlewares
称为爬虫中间件,处理来自
Downloader
的
Response
,能够对组成的
Requests
对象进行一些过滤操做。在这里
Spider Middlewares
不对想要获得的数据进行处理,由于有专门的
Item Pipeline
模块对想要获得的数据进行处理。
一、关于Scrapy Engine
模块,这一部分在项目创建的时候其实已经实现好了,不用咱们再去手动编写,对于数据在各个模块之间的流动,Scrapy Engine
会自行进行调度。
二、调度器主要是处理来处理创建爬虫开始的url
地址和通过组装以后的Requests
对象,将其列成一个队列,有序的送给Scrapy Engine
交给下一个模块。在传递给下载器以前会先通过下载中间件,若是开启了Downloader Middlewares
组件的话,对象会先通过这个组件进行处理,作出相应的自定义修改,而后给下载器想服务器发送请求。
三、下载器想服务器发送请求以后,服务器会给咱们一个响应,这个响应能够经过response.text
查看,返回的是一个网页的源代码(Ajax请求的方法可能另有不一样),而后可使用正则或者Xpath选择器对须要的数据进行提取。随后将响应结果交还给Engine
,再由Engine
交给spider
。
四、在交给spider
以前会有一个爬虫中间件,默认是关闭状态的。通常不用,并且在中间件中内置了一些方法,能够在作出相应操做的时候对方法进行调用。在middlwares.py
文件中有相应的模板。通过中间件以后就到了spider
模块了,这个地方是须要咱们编写的,由于对于每次数据的获取均可能不太同样,因此要作出相应的改变。主要就是在咱们新建的爬虫文件下的parse
方法下进行处理获得数据。本身能够新建方法,可是这个方法不能被更名,并且是经过这个方法来将item
数据传给pipeline
的。
五、pipeline
模块主要是对拿到的数据进行处理,而在settings.py
文件中,pipeline
模块是默认关闭的,因此须要手动开启。取消掉pipeline
的注释便可。pipeline
里的默认内容以下图: cookie
settings.py
文件中有
ITEM_PIPELINES
这个项目,而且是个字典,键为一个
pipeline
类,意味着在管道处理模块能够设置多个
pipeline
来处理数据,一方面是处理来自不一样爬虫文件的数据,能够经过爬虫类的
name
属性来判断是哪一个爬虫,以此来作出相应的数据处理。另外一方面就是对于一个爬虫来讲能够创建多个
pipeline
来处理数据,假设一个
pipeline
对数据进行处理,另一个
pipeline
对数据进行保存工做。而这个字典的值就是当前
pipeline
的优先级,数字越小说明优先级越高,就越早执行。
在使用scrapy genspider spidername
以后,会在spider
目录下建立一个spidername
的py
文件,这个文件就是须要编写爬虫的地方,在建立好了爬虫文件以后如图: 框架
DtyySpider
类,下面有三个属性和一个方法,这个
parse
方法就是处理来自引擎的
response
。类的
name
属性为这个爬虫的名称,以后可使用
scrapy crawl dytt
能够启动当前爬虫,固然这个属性还能够用来判断是哪一个爬虫,能够在一个框架下面建立多个不一样的爬虫。经过
name
属性来判断是哪一个爬虫,而后能够在
pipeline
里面对不一样的爬虫作相应的处理。
这里建议使用scrapy shell url
进行调试,这里能够调试本身的正则、CSS
、Xpath
等语句是否正确,查看是否能够准确的提取到数据。而后再运行爬虫便可,这样作的好处是,在没有配置IP
池的状况下,能够不用对网址进行请求,防止请求屡次以后被网站禁封IP
。
dom
以前粗略的讲过这个类里面的属性和方法,这里详细讲解一下。
爬虫如何建立以及建立以后默认内容是什么上面已经说了。首先就是DyttSpider
这个类,继承的是scrapy.Spider
这个类,有兴趣的能够看看源码,这里再也不多说。allowed_domains
属性就是这个爬虫能够爬取的域名范围。start_urls
就是这个爬虫开始的url
地址。下面的parse
方法就是对返回结果进行处理的函数,并且返回结果保存在response
里面,咱们可使用正则、Xpath
、CSS
选择器等方法提取到咱们想要的值。 这里使用一个我本身作过的例子来说解:
我这里是对电影天堂电影信息的爬取,大约200余页的电影信息。代码如图:异步
对于非Ajax请求的网址,reponse
能够返回咱们在网页上看到的内容,经过一个按钮会跳转到另一个html
页面,一样的仍是能够在源代码中看见网页上的内容。
然而对于Ajax形式的请求,在网页源代码处不能直接看到,是经过js
进行异步加载的,意思就是在浏览器地址栏的那个网址不是咱们须要请求的网址,真正的网址须要在开发者工具经过抓包找到,而后对真正的url
地址进行请求。
这个时候对于新找到的url
可能为get
请求,也可能为post
请求,要看清楚,而后再进行操做。scrapy