CrawlSpiders是 Spider 的派?类,Spider 类的设计原则是只爬取 start_url 列表中的?页,?CrawlSpider 类定义了?些规则(rule)来提供跟进 link 的?便的机制(可以爬取下一页或跟进页面中其他的url),从爬取 的??中获取 link 并继续爬取的?作更适合。CrawlSpider 继承于 Spider 类,除了继承过来的属性外,还提供了?个新的属性和?法:
rules
在 rules 中包含?个或多个 Rule 对象,每个 Rule 对爬取?站的动作定义了特定 操作。如果多个 rule 匹配了相同的链接,则根据规则在本集合中被定义的顺 序,第?个会被使?。
from scrapy.linkextractors import LinkExtractor #提取链接 from scrapy.spiders import CrawlSpider,Rule #循环抓取规则 class CnblogsspiderSpider(CrawlSpider): ... rules = ( Rule(link_extractor=LinkExtractor(allow=r"/article/list/\d+"), process_links="parse_links"), # 自动翻页,没有callback自动翻页 Rule(link_extractor=LinkExtractor(allow=r"/article/details/\d+"), callback="parse_content"), # 子链接 )
link_extractor :是?个 Link Extractor 对象,?于定义需要提取的链接。callback : 从 link_extractor 中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受?个 response 作为其第?个参数。follow :是?个布尔(boolean)值,指定了根据该规则从 response 提取的链接是否需要跟进。 如果 callback 为 None,follow 默认设置为True , 否则默认为 Falseprocess_links :指定该 spider 中哪个的函数将会被调?,从link_extractor 中获取到链接列表时 将 会调?该函数。该?法主要?来过 滤请求.然后在执行回调函数
process_request :在回调函数之后调用spider中的一个函数. (?来过滤 request)
parse_start_url(response):当 start_url 的请求返回时,该?法被调?。
LinkExtractors
class scrapy.linkextractors.LinkExtractor
Link Extractors 的?的很简单: 提取链接? 每个 LinkExtractor 有唯?的公共?法是 extract_links(),它接收?个Response 对象,并返回?个 scrapy.link.Link 对象。
Link Extractors 要实例化?次,并且 extract_links ?法会根据不同的response 调?多次提取链接?
LinkExtractor(allow=r"/article/list/\d+")#从所有找到的连接中定义需要提取的url
主要参数:
allow :满?括号中“正则表达式”的值会被提取,如果为空,则全部匹
deny :与这个正则表达式(或正则表达式列表)不匹配的 URL?定不提
取。
allow_domains :会被提取的链接的 domains。
deny_domains :?定不会被提取链接的 domains。
restrict_xpaths :使?xpath 表达式,和 allow 共同作?过滤链接。
爬取规则(Crawling rules) 继续?腾讯招聘为
例,给出配合 rule 使?CrawlSpider 的例?: 1. ?先运?
scrapy shell "http://hr.tencent.com/position.php?&start=0#a"
CrawlSpiders
221
2. 导?LinkExtractor,创建 LinkExtractor 实例对象。:
from scrapy.linkextractors import LinkExtractor page_lx = LinkExtractor(allow=(‘position.php?&start=\d+‘))
allow : LinkExtractor 对象最重要的参数之?,这是?个正则表达式,必须要匹配这个正则表达式(或正则表达式列表)的 URL 才会被提取,如果没有给出(或为空), 它会匹配所有的链接?
deny : ?法同 allow,只不过与这个正则表达式匹配的 URL 不会被提 取 ) ?它的优先级?于 allow 的参数,如果没有给出 ( 或 None),将不排 除任何链接?