2016-07-07 3 views
-2

Я хочу, чтобы scrapy очищала некоторые стартовые URL-адреса, а затем следила за ссылками на этих страницах в соответствии с правилами. Мой паук унаследован от CrawlSpider и имеет start_urls и «правила». Но, похоже, не используется функция синтаксического анализа, которую я определяю, чтобы разобрать start_urls. Вот коды:Какой метод анализа синтаксического анализа используется для разбора start_urls

<!-- language: lang-python --> 
class ZhihuSpider(CrawlSpider): 

    start_urls = ["https://www.zhihu.com/topic/19778317/organize/entire", 
     "https://www.zhihu.com/topic/19778287/organize/entire"] 

    rules = (Rule(LinkExtractor(allow= (r'topic/\d+/organize/entire')), \ 
      process_request='request_tagInfoPage', callback = 'parse_tagPage')) 

    # this is the parse_tagPage() scrapy should use to scrape 
    def parse_tagPage(): 
     print("start scraping!") # Explicitly print to show that scraping starts 
     # do_something 

Однако консоль показывает, что scrapy сканирует start_urls, но ничего не печатается. Поэтому я уверен, что функция parse_tagPage() не вызывается. Несмотря на то, что scrapy показывает, что URL-адреса сканируются [scrapy] DEBUG: Crawled (200) <GET https://www.zhihu.com/topic/19778317/organize/entire> (referer: http://www.zhihu.com)

Любые намеки на то, почему это произойдет и как настроить scrapy для использования parse_tagPage()?

+0

Вы должны прочитать документацию, когда вы укажете start_urls, scrapy посетит этот url с помощью метода start_request(), а затем увидит, совпадает ли он с указанными вами правилами, если он соответствует правилу, он посетит метод parse_tagPage() else ничего не сделает (вы можете определить метод обратного вызова по умолчанию, если не согласовано правило) http://doc.scrapy.org/en/latest/topics/spiders.html?highlight=start%20request#scrapy.spiders.Spider .start_requests – MrPandav

+0

Вы можете ответить на свой вопрос, а затем принять свой ответ вместо редактирования вопроса с ответом. –

+0

Спасибо, Бурхан! Не знал этого. – Skywalker326

ответ

0

1-й класс CrawlSpider использует метод parse() по умолчанию для обработки ВСЕХ запросов, которые не определяют функцию обратного вызова, в моем случае включая запросы, сделанные из start_urls. Этот метод parse() применяет только правила для извлечения ссылок и вообще не анализирует страницы start_url. Вот почему я не могу царапать что-либо со страниц start_url.

2-й, LinkExtractor как-то извлекает только первые ссылки с страниц start_urls. И, к сожалению, первые ссылки - это start_urls. Таким образом, механизм коррекции дублирования с помощью скрининга блокирует разбор этих страниц. Вот почему вызывается функция обратного вызова parse_tagPage().

Я работаю над фиксацией LinkExtractor.

Смежные вопросы