学习Scrapy一点总结
1、安装
先安装twiste
pip install twisted
再安装scrapy
pip install scrapy
中途会遇到pywin32错误
安装pypiwin32
pip install pypiwin32
2、scrapy学习网址
3、scrapy目录结构
scrapy.cfg
myproject/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
scrapy.cfg:存放的目录被认为是项目的根目录,项目的配置文件。
myproject:项目的python模块,将会从这里引用代码。
items.py:定义了存储数据的字段名,在编辑此文件前需先分析要提取哪些信息,定义好名称即可
pipelines.py:此文件是用来处理提取的数据,可以将数据转存为其他格式或数据库中,如果要用此文件,需要先在settings.py中指明pipelines.py中的类,并且如果有多个类的话,还要定义优先级,就是后面的数字,越小优先级越高,在每个pipeline类中必有一个process_item的函数,函数是数据处理的具体流程。
settings.py:一些项目的设置
Scrapy的运行机制
(1)、引擎从调度器中取出一个URl,用于接下来的抓取
(2)、引擎把URL封装成请求(Request)传给下载器,下载器把资源下载后封装成答应包(Response)
(3)、爬虫解析Response
(4)、若解析出实体(Item),则交给实体管道进行进一步的处理
(5)、若解析出的是URL,则把URL交给Scheduler等待抓取
Scrapy运行离不开各个组件相互合作和调度
引擎(Scrapy):处理整个系统的数据流,触发事物(框架核心)
调度器(Scheduler):接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
下载器(Downloader):用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器的运行原理是基于Twisted框架实现的)
爬虫(Spiders):从特定的网页中提取自己需要的信息,即实体(Item)。也可以从中提出URl,让Scrapy继续抓取下一个页面。
项目管道(Item Pipeline):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体,验证实体的有效性,清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middleware):位于Scrapy引擎和下载器之间的框架,处理引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middleware):介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middleware):介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
4、创建项目
1、创建项目目录
scrapy startproject huangzhounews
2、创建一个新的spider项目
scrapy genspider hangzhou hznews.hangzhou.com.cn
# 后面加的是域名
创建完毕之后,就会在spiders目录下生成一个hangzhou.py的文件
import scrapy
class HangzhouSpider(scrapy.Spider):
name = 'hanghzou'
allowed_domains = ['hznews.hangzhou.com.cn']
start_urls = ['http://hznews.hangzhou.com.cn/']
def parse(self,response):
pass
1、name = ‘’:这个爬虫的识别名称,必需是唯一的,在不同的爬虫必需定义不同的名字。(一般和文件名一样)
2、allow_domains = []:是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
3、start_urls = ():爬取的url元组/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URl中继承性生成。
4、parse(self,response):解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
负责解析返回的网页数据(response.body),提取结构化数据(生成item)生成需要下一页的URL请求
查看所有爬虫
scrapy list
5、scrapy shell
1、执行爬虫,并且把结果保存到指定文件
scrapy crawl hanghzou -o hanghou.json
2、在执行之前,也可以用scrapy shell对xpath()/css()表达式进行验证,能否提取到数据。
之所以用scrapy shell运行项目来检测,是因为有的网站对于访问次数和频率有限制,如果频繁运行项目,向对方网站发送过多请求,就可能导致网站拒绝访问。
而scrapy shell 在调试的时候,一旦和某一个页面建立链接,这个链接就不会中断,可以不停的测试css和xpath,在此期间scrapy shell只向某一个url发送了一次请求,所以可以减轻对网站的访问率,而且调试也方便。
可用方法
- shelp():打印可用的对象和方法
- fetch(url[,redirect=True]):爬取新的url并更新相关对象
- fetch(request):通过request爬取,并更新相关对象
- view(response):使用本地浏览器打开爬取页面
- response.xpath(xpath):用于验证是否匹配成功
6、中间件
Scrapy框架中的中间件主要分两类:爬虫中间件和下载中间件。其中最重要的是下载中间件,反爬策略都部署在下载中间件。
爬虫中间件
爬虫中间件是介入到Scrapy的spider处理机制的钩子框架,可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。
- 当蜘蛛传递请求和items给引擎的过程中,蜘蛛中间件可以对其进行处理(过滤出 URL 长度比 URLLENGTH_LIMIT 的 request。)
- 当引擎传递响应给蜘蛛的过程中,蜘蛛中间件可以对响应进行过滤(例如过滤出所有失败(错误)的 HTTP response)
下载中间件
下载中间件是处于引擎(Engine)和下载器(Downloader)之间的一层组件,可以有多个下载中间件被加载运行。
- 当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);
- 在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)