本篇是python中 CrawlSpider 的介绍,还有Scrapy Shell、request 和 response 对象、发送POST请求 等。
CrawlSpider
在之前的爬虫中定义了新的功能,可以定义爬取url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request
。
创建CrawlSpider
之前创建爬虫的方式是通过 scrapy genspider [爬虫名] [域名]
的方式创建的。如果想要创建CrawlSpider
爬虫,则通过以下命令:
1 | scrapy genspider -t crawl [爬虫名] [域名] |
LinkExtractors链接提取器
使用LinkExtractors
可以不用我们手动提取想要的URL,然后发送请求。这些工作可以交给LinkExtractors
,它会在所有爬的页面中找到满足规则的URL,实现自动爬取。下面是简单介绍:
1 | class scrapy.linkextractors.LinkExtractor( |
主要参数讲解:
- allow:允许的URL,所有满足里面正则表达式的URL都会被提取
- allow_domains:允许的域名,只有这里指定的域名的URL才会被提取
Rule规则类
定义爬虫的规则类。
1 | class scrapy.spiders.Rule( |
主要参数讲解:
- link_extractor:一个
LinkExtractor
对象,用于定义爬取规则。 - callback:满足规则的URL,应该执行哪个回调函数。
- follow:根据该规则,指定response中提取的链接是否需要跟进。
- process_links:从link_extractor中获取的链接会传递给这个函数,用来过滤不需要爬取的链接。
Scrapy Shell
可以简单的运行Xpath、BeautifulSoup、正则表达式或CSS选择器等,来判断我们的提取规则是否正确。
在 cmd(或pycharm的Terminal)进入scrapy爬虫的工程目录(可以读取对应项目里的配置信息,若不进入,则只能运行一些通用测试,平常使用足够),运行下述代码:
1 | scrapy shell 域名 |
scrapy 中的 request 和 response 对象
Request对象
request对象在我们写爬虫,爬取一页的数据,需要重新发送一个请求的时候调用。这个类需要传递一些参数,其中比较常用的参数有:
- url:发送请求的url
- callback:在下载器完成相应的下载任务后执行的回调函数
- method:默认为GET方法
- headers:请求头,固定部分放入setting.py 中,需要改变的再可在发送时指定
- meta:比较常用,用于在不同的请求之间传递数据
- encoding:默认utf-8
- dot_filter:表示不由调度器过滤,在执行多次重复的请求时用的比较多
- errback:在发生错误时执行的函数
Response对象
Response对象一般是由scrapy自动生成的,因此我们只需关系如何使用。它有很多属性,主要用来提取数据,依次介绍:
meta:从请求穿过来的meta属性,可以用来保持多个请求之间的数据连接
encoding:返回字符串编码和解码格式
text:将返回来的数据作为Unicode字符串返回
body:将返回来的数据作为Bytes字符串返回
xpath:xpath选择器
css:css选择器
发送POST请求
有时我们想要在请求数据的时候发送POST请求,那么这时候需要使用 Request
的子类 FormRequest
来实现(专门为表单提交设计的类)。如果想要在爬虫一开始的时候就发送POST请求,那么需要在爬虫类中重写 start_requests(self)
方法,并且不再调用 start_url
里的URL。
模拟登录
案例一:模拟人人网登录
1 | import scrapy |