每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)

每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)

scrapy框架的安装

在安装了anaconda后,打开cmd输入:conda install scrapy可以快速安装,详细过程请看往期的内容。

scrapy框架结构图:

每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)

组成部分介绍

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

最后柠檬为大家准备了一些python的学习教程分享,希望可以帮助到大家。

每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)

每天五分袖python爬虫进阶—Scrapy框架详解(附python爬虫教程)

获取方式:请大家转发+关注并私信小编关键词:“资料”即可获取。

相关推荐