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),将不排 除任何链接。