• 欢迎来到本博客,希望可以y一起学习与分享

scrapy框架爬虫简单入门(四)–CrawlSpider进行整站爬取

Python benz 3年前 (2018-10-07) 77次浏览 0个评论 扫描二维码
文章目录[隐藏]

scrapy爬虫模板

scrapy为我们提供了多种爬虫模板,默认使用basic模板。查看scrapy为我们有多少爬虫模板,可以通过命令进行查看:scrapy genspider --list

使用crawl模板创建CrawlSpider爬虫

使用命令 :scrapy genspider -t crawl lagou www.lagou.com,其中,-t为指定创建的模板,-t crawl即为使用crawl模板创建CrawlSpider爬虫。

根目录变化导致创建CrawlSpider报错

在创建CrawlSpider爬虫模板的时候会报ModuleNotFoundError: No module named ‘utils’的错误。这是因为系统认为最顶层的、第一个的文件夹是根目录,但是我们选择的根目录却不一定是系统认为的那一个才是根目录。

如何告诉系统,以我指定的文件夹作为根目录?那我们可以到settings.py中去设定一下,告诉系统我们的真实想法。

然后,重新执行scrapy genspider -t crawl lagou www.lagou.com就可以正常创建文件了。
还有一个问题,就是,既然在settings.py都设置好了,为什么编辑器引入文件代码还是有红波浪线。这个是pycharm编辑器的问题,与settings.py里的代码设置是不相干的,没有任何联系。settings.py的代码是整个项目的配置,执行命令行,首先会读取这个配置文件。而红波浪线是由于pycharm在整个项目文件的索引上,以最顶层的目录作为根目录,pycharm不可能会自动读取settings.py里的代码,所以,红波浪线是pycharm自身的问题。如何解决呢?只要通过pycharm的设置,告诉pycharm,你指定的根目录在哪里就可以了。

CrawlSpider、LinkExtractors、Rule及爬虫示例

CrawlSpiderLinkExtractorsRulescrapy框架中的类,其中CrawlSpiderSpider的派生类,具有更多的方法和功能,LinkExtractor类是用作提取链接的,Rule表示的是爬取的规则

CrawlSpider

CrawlSpiderSpider的派生类,Spider类的设计原则是只爬取start_urls中的url,而CrawlSpider类定义了一些规则(rules)来提供跟进链接(link)的方便机制,从爬取的网页中获取link并继续爬取的工作更适合。

CrawlSpider除了Spider继承过来的属性外,还提供了一个新的属性:

rules

包含一个或多个Rule对象的集合。每个Rule对爬取网站的动作定义了特定规则。Rule对象会在下面介绍。

如果多个Rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。

CrawlSpider也提供了一个可复写的方法:

parse_start_url(response)

当start_url的请求返回时,该方法被调用。该方法分析最初的返回值并必须返回一个Item对象或一个Request对象或者一个可迭代的包含二者的对象

当编写爬虫规则时,请避免使用parse 作为回调函数。 由于CrawlSpider使用parse 方法来实现其逻辑,如果 您覆盖了parse 方法,CrawlSpider将会运行失败。

LinkExtractor

class scrapy.linkextractors.LinkExtractor

LinkExtractor是从网页(scrapy.http.Response)中抽取会被follow的链接的对象。

LinkExtractorCrawlSpider类(在Scrapy可用)中使用, 通过一套规则,但你也可以用它在你的Spider中,即使你不是从CrawlSpider继承的子类, 因为它的目的很简单: 提取链接

每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象,并返回一个 scrapy.link.Link 对象。

Link Extractors要实例化一次,并且 extract_links 方法会根据不同的 response 调用多次提取链接。

主要参数:

allow:满足括号中”正则表达式”的值会被提取,如果为空,则全部匹配。

deny:与这个正则表达式(或正则表达式列表)不匹配的url一定不提取

allow_domains:会被提取的连接的domains

deny_domains:一定不会被提取链接的domains。

restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。

Rule

Rule对象是一个爬取规则的类。

其类的定义如下:

class scrapy.contrib.spiders.Rule(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)

link_extractor:是一个Link Extractor对象。其定义了如何从爬取到的页面提取链接。

callback:是一个callablestring(该Spider中同名的函数将会被调用)。从link_extractor中每获取到链接时将会调用该函数。该回调函数接收一个response作为其第一个参数,并返回一个包含Item以及Request对象(或者这两者的子类)的列表。

cb_kwargs:包含传递给回调函数的参数(keyword argument)的字典。

follow:是一个boolean值,指定了根据该规则从response提取的链接是否需要跟进。如果callbackNonefollow默认设置True,否则默认False

process_links:是一个callablestring(该Spider中同名的函数将会被调用)。从link_extrator中获取到链接列表时将会调用该函数。该方法主要是用来过滤

process_request:是一个callablestring(该spider中同名的函数都将会被调用)。该规则提取到的每个request时都会调用该函数。该函数必须返回一个request或者None。用来过滤request

CrawlSpider 模板

局部配置setting,携带header头信息

custom_settings是一个用于配置局部setting的,scrapy提供的配置字典。其中,DEFAULT_REQUEST_HEADERS可以编写头信息。

CrawlSpider实例

lagou.py

items.py

pipelines.py


文章 scrapy框架爬虫简单入门(四)–CrawlSpider进行整站爬取 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!