一、第一步.....先把咱学习方向定一下....
scrapy二、开撸
啥都不说,先来一张经典图.....
Scrapy
1. 架构
引擎(Scrapy Engine)
引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。同时,它也是程序的入口。
调度器(Scheduler)
调度器从引擎接受爬取请求(Request)并将它们入列,以便之佛引擎请求它们时提供给引擎,它是由Scrapy主进程进行自动控制的
下载器(Downloader)
下载器负责获取页面数据并提供给引擎,而后将网站的响应结果对象提供个蜘蛛(Spider),具体点说,下载器负责处理产生最终发出的请求对象Requet并返回的响应生Response对象传递给蜘蛛
蜘蛛(Spiders)
Spider是用户编写用于分析响应(Response)结果并从中提取Item(即获取Item)或额外跟进的URL的类。
数据管道(Item Pipeline)
Item Pipeline负责处理被Spider提取出来的Item,典型的处理有清理、验证及持久化。
下载器中间件(Downloader middlewares)
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的Reponse.其提供一个简单的机制,通过插入自定义代码来扩展Scrapy的功能
Spider中间件(Spider middlewares)
Spider中间件是在引擎及Spiser之间的特定钩子(specific hook),处理Spider的输入(Response)和输出(Item 及 Requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy的功能
2. 流程
1). 引擎打开一个网站,找到处理该网站的Spider冰箱该Spider请求第一个要爬取的URL
2). 引擎从Spider中获取第一个要爬取的URL并在调度器中一Request调度
3). 引擎向调度器请求下一个要爬取的URL。
4). 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求reuqest方向)转发给下载器(Downloader)。
5). 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回Response方向)发送给引擎
6). 引擎从下载器中接受Response并通过Spider中间件(输入方向)发送给Spider给引擎
7). Spider处理Response并返回到的Item及(跟进的)新的Request给引擎
8). 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器
9). (从第二步)重复直到调度器中没有更多的Request,引擎关闭对该网站的执行进程
三、Request和Response对象
1. Request对象
Request对象用来描述一个HTTP请求
Request(url[, callback, method='GET', headers, body, cookies, meta,encoding='utf-8', priority=0, dont_filter=False, errback])
-
url(必选)
请求页面的url地址,bytes或str类型 -
callback
页面解析函数, Callable类型,Request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递该参数,默认调用Spider的parse方法。 -
method
HTTP请求的方法,默认为'GET'。 -
headers
HTTP请求的头部字典,dict类型,例如{'Accept': 'text/html', 'User-Agent':Mozilla/5.0'}。如果其中某项的值为None,就表示不发送该项HTTP头部,例如{'Cookie': None},禁止发送Cookie。 -
body
HTTP请求的正文,bytes或str类型。 -
cookies
Cookie信息字典,dict类型,例如{'currency': 'USD', 'country': 'UY'}。 -
meta
Request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件Item Pipeline。其他组件可以使用Request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,详见Response的meta属性。 -
encoding
url和body参数的编码默认为'utf-8'。如果传入的url或body参数是str类型,就使用该参数进行编码。 -
priority
请求的优先级默认值为0,优先级高的请求优先下载。 -
dont_filter
默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如,在多次爬取一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为True。 -
errback
请求出现异常或者出现HTTP错误时(如404页面不存在)的回调函数。
2. Response对象
Response对象用来描述一个HTTP响应,Response只是一个基类,根据响应内容的不同有如下子类:
● TextResponse
● HtmlResponse
● XmlResponse
当一个页面下载完成时,下载器依据HTTP响应头部中的Content-Type信息创建某个Response的子类对象。我们通常爬取的网页,其内容是HTML文本,创建的便是HtmlResponse对象,其中HtmlResponse和XmlResponse是TextResponse的子类。实际上,这3个子类只有细微的差别,这里以HtmlResponse为例进行讲解。
-
url
HTTP响应的url地址,str类型。 -
status
HTTP响应的状态码,int类型,例如200,404。 -
headers
HTTP响应的头头部,类字典类型,可以调用get或getlist方法对其进行访问,例如:
response.headers.get('Content-Type')
response.headers.getlist('Set-Cookie')
-
body
HTTP响应正文,bytes类型。 -
text
文本形式的HTTP响应正文,str类型,它是由response.body使用response.encoding解码得到的,即
reponse.text = response.body.decode(response.encoding)
-
encoding
HTTP响应正文的编码,它的值可能是从HTTP响应头部或正文中解析出来的。 -
request
产生该HTTP响应的Request对象。 -
meta
即response.request.meta,在构造Request对象时,可将要传递给响应处理函数的信息通过meta参数传入;响应处理函数处理响应时,通过response.meta将信息取出。 -
selector
Selector对象用于在Response中提取数据(选择器相关话题在后面章节详细讲解)。 -
xpath(query)
使用XPath选择器在Response中提取数据,实际上它是response.selector.xpath方法的快捷方式(选择器相关话题在后面章节详细讲解)。 -
css(query)
使用CSS选择器在Response中提取数据,实际上它是response.selector.css方法的快捷方式(选择器相关话题在后面章节详细讲解)。 -
urljoin(url)
用于构造绝对url。当传入的url参数是一个相对地址时,根据response.url计算出相应的绝对url。例如,response.url为http://www.example.com/a,url为b/index.html,调用response.urljoin(url)的结果为http://www.example.com/a/b/index.html。
四、安装
1. 安装xml和html解析库lxml
pip install lxml
2. 安装解析数字证书库pyOpenSSL
pip install pyOpenSSL
3. 安装网络传输及应用层协议库Twisted
pip install Twisted
4. 安装调用Windows API库pywin32
pip install pywin32
5. 安装scrapy
pip install scrapy
6.安装对JS的渲染库scrapy-splash
推荐一篇安装文章:Scrapy Splash
#配置貌似需要docker
pip install scrapy-splash
7. redis实现分布式队列爬虫scrapy-redis
推荐安装文章:scrapy-redis
pip install scrapy-redis
五、常用命令
#创建项目
scrapy startproject project_name
#使用模板创建爬虫
scrapy genspider spider_name URL
#运行spider_name蜘蛛
scrapy crawl spider_name
#调试网站
scrapy shell URL
#获取settings内属性名称
scrapy settings --get 属性名称
#手动运行单个爬虫
scrapy runspider scrapy_cn.py
#查看创建爬虫
scrapy list
#保存到外部文件格式
scrapy crawl spider_name -o 文件名.json/.csv/.xml/.pickle/.marshal
...
网友评论