凡是过往,皆为序章

0%

Python爬虫_09(CrawlSpider)

本篇是python中 CrawlSpider 的介绍,还有Scrapy Shellrequest 和 response 对象、发送POST请求 等。


CrawlSpider

在之前的爬虫中定义了新的功能,可以定义爬取url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request

创建CrawlSpider

之前创建爬虫的方式是通过 scrapy genspider [爬虫名] [域名] 的方式创建的。如果想要创建CrawlSpider爬虫,则通过以下命令:

1
scrapy genspider -t crawl [爬虫名] [域名]

LinkExtractors链接提取器

使用LinkExtractors 可以不用我们手动提取想要的URL,然后发送请求。这些工作可以交给LinkExtractors ,它会在所有爬的页面中找到满足规则的URL,实现自动爬取。下面是简单介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
class scrapy.linkextractors.LinkExtractor(
allow = (),
deny = (),
allow_domains = (),
deny_domains = (),
deny_extensions = None,
restrict_xpaths = (),
tags = ('a', 'area'),
attrs = ('href'),
canonicalize = True,
unique = True,
process_value = None
)

主要参数讲解:

  • allow:允许的URL,所有满足里面正则表达式的URL都会被提取
  • allow_domains:允许的域名,只有这里指定的域名的URL才会被提取

Rule规则类

定义爬虫的规则类。

1
2
3
4
5
6
7
8
class scrapy.spiders.Rule(
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
)

主要参数讲解:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import scrapy


class RenrenSpider(scrapy.Spider):
name = 'renren'
allowed_domains = ['renren.com']
start_urls = ['http://renren.com/']


# 模拟登录,重写该方法(因为在父类中,该方法默认发送GET请求)
def start_requests(self):
url = 'http://www.renren.com/PLogin.do'
data = {'email':'13287857692', 'password':'dongao123'}

# 专门发送POST请求,并且携带表单数据
request = scrapy.FormRequest(url, formdata = data, callback = self.parse_page)

yield request

def parse_page(self, response):
# with open ('renren.html', 'w', encoding='utf-8') as f:
# f.write(response.text)
# 请求只有登录才能访问的个人主页
request = scrapy.Request(url='http://www.renren.com/974726184/profile',callback=self.parse_profile)
yield request

def parse_profile(self, response):
with open('myprofile.html', 'w', encoding='utf-8') as f :
f.write(response.text)
~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------