国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Scrapy框架CrawlSpiders的介紹以及使用詳解

2020-02-16 10:54:30
字體:
來源:轉載
供稿:網友

在Scrapy基礎——Spider中,我簡要地說了一下Spider類。Spider基本上能做很多事情了,但是如果你想爬取知乎或者是簡書全站的話,你可能需要一個更強大的武器。CrawlSpider基于Spider,但是可以說是為全站爬取而生。

CrawlSpiders是Spider的派生類,Spider類的設計原則是只爬取start_url列表中的網頁,而CrawlSpider類定義了一些規則(rule)來提供跟進link的方便的機制,從爬取的網頁中獲取link并繼續爬取的工作更適合。

一、我們先來分析一下CrawlSpiders源碼

源碼解析class CrawlSpider(Spider):  rules = ()  def __init__(self, *a, **kw):    super(CrawlSpider, self).__init__(*a, **kw)    self._compile_rules()  # 首先調用parse()來處理start_urls中返回的response對象  # parse()則將這些response對象傳遞給了_parse_response()函數處理,并設置回調函數為parse_start_url()  # 設置了跟進標志位True  # parse將返回item和跟進了的Request對象    def parse(self, response):    return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)  # 處理start_url中返回的response,需要重寫  def parse_start_url(self, response):    return []  def process_results(self, response, results):    return results  # 從response中抽取符合任一用戶定義'規則'的鏈接,并構造成Resquest對象返回  def _requests_to_follow(self, response):    if not isinstance(response, HtmlResponse):      return    seen = set()    # 抽取之內的所有鏈接,只要通過任意一個'規則',即表示合法    for n, rule in enumerate(self._rules):      links = [l for l in rule.link_extractor.extract_links(response) if l not in seen]      # 使用用戶指定的process_links處理每個連接      if links and rule.process_links:        links = rule.process_links(links)      # 將鏈接加入seen集合,為每個鏈接生成Request對象,并設置回調函數為_repsonse_downloaded()      for link in links:        seen.add(link)        # 構造Request對象,并將Rule規則中定義的回調函數作為這個Request對象的回調函數        r = Request(url=link.url, callback=self._response_downloaded)        r.meta.update(rule=n, link_text=link.text)        # 對每個Request調用process_request()函數。該函數默認為indentify,即不做任何處理,直接返回該Request.        yield rule.process_request(r)  # 處理通過rule提取出的連接,并返回item以及request  def _response_downloaded(self, response):    rule = self._rules[response.meta['rule']]    return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)  # 解析response對象,會用callback解析處理他,并返回request或Item對象  def _parse_response(self, response, callback, cb_kwargs, follow=True):    # 首先判斷是否設置了回調函數。(該回調函數可能是rule中的解析函數,也可能是 parse_start_url函數)    # 如果設置了回調函數(parse_start_url()),那么首先用parse_start_url()處理response對象,    # 然后再交給process_results處理。返回cb_res的一個列表    if callback:      #如果是parse調用的,則會解析成Request對象      #如果是rule callback,則會解析成Item      cb_res = callback(response, **cb_kwargs) or ()      cb_res = self.process_results(response, cb_res)      for requests_or_item in iterate_spider_output(cb_res):        yield requests_or_item    # 如果需要跟進,那么使用定義的Rule規則提取并返回這些Request對象    if follow and self._follow_links:      #返回每個Request對象      for request_or_item in self._requests_to_follow(response):        yield request_or_item  def _compile_rules(self):    def get_method(method):      if callable(method):        return method      elif isinstance(method, basestring):        return getattr(self, method, None)    self._rules = [copy.copy(r) for r in self.rules]    for rule in self._rules:      rule.callback = get_method(rule.callback)      rule.process_links = get_method(rule.process_links)      rule.process_request = get_method(rule.process_request)  def set_crawler(self, crawler):    super(CrawlSpider, self).set_crawler(crawler)    self._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普安县| 云安县| 泰兴市| 社旗县| 阳春市| 临江市| 阿尔山市| 宜川县| 潮安县| 和龙市| 大同县| 广安市| 康平县| 雷波县| 崇州市| 玉田县| 富锦市| 神农架林区| 海南省| 太保市| 通化市| 莆田市| 海盐县| 太原市| 棋牌| 塔城市| 齐齐哈尔市| 镇雄县| 洱源县| 海丰县| 颍上县| 额敏县| 甘南县| 扬中市| 浮梁县| 从化市| 浦县| 大冶市| 伊川县| 连城县| 手机|