每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)
scrapy框架的安装
在安装了anaconda后,打开cmd输入:conda install scrapy可以快速安装,详细过程请看往期的内容。
scrapy框架结构图:
组成部分介绍
Scrapy Engine:
负责组件之间数据的流转,当某个动作发生时触发事件
Scheduler:
接收requests,并把他们入队,以便后续的调度
Downloader:
负责抓取网页,并传送给引擎,之后抓取结果将传给spider
Spiders:
用户编写的可定制化的部分,负责解析response,产生items和URL
Item Pipeline:
负责处理item,典型的用途:清洗、验证、持久化
Downloader middlewares:
位于引擎和下载器之间的一个钩子,处理传送到下载器的requests和传送到引擎的response(若需要在Requests到达Downloader之前或者是responses到达spiders之前做一些预处理,可以使用该中间件来完成)
Spider middlewares:
位于引擎和抓取器之间的一个钩子,处理抓取器的输入和输出
(在spiders产生的Items到达Item Pipeline之前做一些预处理或response到达spider之前做一些处理)
scrapy.spiders.Spider
scrapy.spiders.Spider是scrapy中最简单的spider。一般要爬取的操作都定义在Spider类中。重写Spider的parse方法来处理获取到的网页内容。
Spider主要属性和方法如下:
name:爬虫的名字,必选参数,scrapy crawl命令将查找这个name来确定要执行的爬虫是哪一个。 allowed_domains:列表,可选参数,定义了允许爬取的网页的域名列表,不在此列表内的域名的链接不会被爬取。 start_urls:列表,包含了scrapy开始爬取的所有链接,基本等于scrapy爬取的网页的入口页面。 custom_settings:dict,可选,定制化参数设置,在爬虫爬取的过程中,scrapy会使用这个参数中的内容替换scrapy运行时的配置,一般不需要设置该参数。 logger:日志记录对象。 from_crawler():scrapy用于创建爬虫的方法。这个方法会自动设置crawler和settings。 settings:爬虫运行的配置,是Settings的实例。 crawler:在类初始化后由from_crawler设置,链接到绑定的spider的Crawler类。 start_requests():scrapy开始爬取并且用于创建Request的方法。在爬虫开始运行后,scrapy会调用start_requests(),其内部会调用make_requests_from_url()方法从start_urls列表中对每一个链接生成Request。我们只需要把要开始爬取的链接放入start_urls中即可,也可以不定义start_urls,重新实现start_requests,生成自定义的Request对象,如FormRequest,然后获取到Response后传递给自定义的回调函数处理。start_requests在整个爬虫运行过程中只会执行一次。 make_requests_from_url(url):这个方法接收一个链接,返回一个Request对象。 parse(response):scrapy默认的回调函数。当通过Request获取到Response后,如果Request没有指定自定义的回调函数,那么会使用该函数作为回调函数。如果没有自定义start_requests()方法,那么必须实现这个函数,并且在里面定义网页数据的提取操作。 log(message[, level, component]):与logger类似,用于日志记录。 closed(reason):爬虫关闭时调用的方法。
官方使用示例:
import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'example.com' allowed_domains = ['example.com'] def start_requests(self): yield scrapy.Request('http://www.example.com/1.html', self.parse) yield scrapy.Request('http://www.example.com/2.html', self.parse) yield scrapy.Request('http://www.example.com/3.html', self.parse) def parse(self, response): for h3 in response.xpath('//h3').extract(): yield MyItem(title=h3) for url in response.xpath('//a/@href').extract(): yield scrapy.Request(url, callback=self.parse)
scrapy.spiders.CrawlSpider
CrawlSpider继承自Spider,是一个适用于爬取很规则的网站的爬虫。其定义了提取链接的规则,能够很方便的从Response中提取到想要的链接并且继续跟进这些链接。
CrawlSpider主要属性如下:
rules:列表,定义了从Response提取符合要求的链接的Rule对象。 parse_start_url:CrawlSpider默认的回调函数,我们在使用CrawlSpider时,不应该覆盖parse方法,而应 该覆盖这个方法。因为CrawlSpider使用了parse函数来处理自己的逻辑,所以我们不能覆盖parse方法。
其中,Rule有以下几个参数:
link_extractor:LinkExtractor对象,用于定义需要提取的链接。Link Extractors是链接提取器,一类用来从返回网页中提取符合要求的链接的对象。 callback:回调函数,当link_extractor获取到符合条件的链接时,就会使用这个参数的函数作为回调函数。注意不能使用parse作为回调函数、 follow:bool值,指定了根据link_extractor规则从response提取的链接是否需要跟进。callback为空是,follow默认为true,否则就是false。 process_links:函数或者函数名,用于过滤link_extractor提取到的链接。 process_request:函数或者函数名,用于过滤Rule中提取到的request。 其中LinkExtractor对象主要有以下几个参数: allow:字符串或元组,满足括号中所有的正则表达式的那些值会被提取,如果为空,则全部匹配。 deny:字符串或元组,满足括号中所有的正则表达式的那些值一定不会被提取。优先于allow参数。 allow_domains:字符串或元组,会被提取的链接的域名列表。 deny_domains:字符串或元组,一定不会被提取链接的域名列表。 restrict_xpaths:字符串或元组,xpath表达式列表,使用xpath语法和allow参数一起提取链接。 restrict_css:字符串或元素,css表达式列表,使用css语法和allow参数一起提取链接。
我们在使用scrapy写爬虫,一般要继承scrapy.spiders.Spider类,在这个类中,有个数组类型的变量start_urls,start_urls定义了爬虫开始爬取的那些链接,所以我们会把需要先爬取的页面链接放入start_urls中。然后,scrapy.spiders.Spider会通过调用start_requests()方法,以start_urls中的所有链接的每个链接生成对应的Request对象,该对象设置了默认的回调函数parse()方法。然后,scrapy主流程会用该Request对象发HTTP请求并且获取到相应内容,封装成Response对象,然后这个Response对象会被作为参数传递给Request设置的回调函数,也就是parse()方法。这里要注意,start_requests()方法是Spider提供的,本来就实现好的,一般情况下不需要自己去实现start_requests()方法。
scrapy的基本命令
1.创建一个新的项目
scrapy startproject +一个项目的名称
我们可以进入创建的项目执行相关的命令 cd +demo
2.生成爬虫
scrapy genspider +文件名+网址
3.运行(crawl)
scrapy crawl +爬虫名称
4.check检查错误
scrapy check
5.list返回项目所有spider名称
scrapy list