Scrapy Crawler несколько доменов завершается без ошибок после получения исходных страниц - PullRequest
0 голосов
/ 03 июня 2018

Попытка заставить Scrapy сканировать несколько доменов.у меня это работало кратко, но что-то изменилось, и я понятия не имею, что.Насколько я понимаю, «CrawlSpider» с правилами, по которым ссылки должны следовать, должен следовать за любыми разрешенными ссылками до тех пор, пока не будет исчерпан параметр глубины или домен.

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class BbcSpider(CrawlSpider):
    name = 'bbcnews'
    allowed_domains = [
        'www.bbc.com']

    start_urls = [
        'http://www.bbc.com/news']

    rules = (Rule(LinkExtractor(allow=()), callback='parse', follow=True),)

    def parse(self, response):
        print(response.url)

и если бы я хотел сканировать несколько доменов, я быизмените значения «allow_domains» и «start_urls»

     allowed_domains = [
        'www.bbc.com',
        'www.voanews.com']

    start_urls = [
        'http://www.bbc.com/news',
        'https://www.voanews.com/p/6290.html']

Однако в обоих случаях, когда я запускаю «scrapy crawl bbcnews», сканер получает только исходные сайты, а затем завершает работу.

edit:

хорошо, этот код работает, пока есть только 1 домен и 1 начальный URL.если я добавлю более одного из них, паук сканирует только начальные страницы.

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class BbcfarsiSpider(CrawlSpider):
    name = 'bbcfarsi'
    allowed_domains = ['bbc.com']
    start_urls = ['http://bbc.com/persian']
    rules = (Rule(LinkExtractor(allow=('persian'),), callback='parse', follow=True), )

def parse(self, response):
    pass

edit # 2: если я переместу функцию разбора за пределы класса, это не сработает.Проблема в том, что я не могу ничего выводить таким образом.наличие функции parse в классе (даже если она просто заполнена pass) приводит только к запросу стартовых страниц и robot.txt

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я полагаю, что когда вы используете callback = 'parse' , он возвращается к встроенному методу разбора.Не могли бы вы вместо этого попробовать callback = 'self.parse' ?Это может вызвать ваш метод синтаксического анализа, а не по умолчанию

0 голосов
/ 04 июня 2018

не совсем уверен, почему, но если я изменил обратный вызов правила на callback = 'parse_link' и переименовал функцию, чтобы соответствовать, все работало просто отлично.код должен выглядеть примерно так, как показано ниже:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class BbcSpider(CrawlSpider):
    name = 'bbcnews'
    allowed_domains = [
        'www.bbc.com',
        'www.voanews.com',]

    start_urls = [
        'http://www.bbc.com/news',
        'https://www.voanews.com/p/6290.html',]

    rules = (Rule(LinkExtractor(allow=()), callback='parse_link', follow=True),)

    def parse_link(self, response):
        yield {
            'url' : response.url ,
        }

Редактировать: см. комментарий Четан Мишры ниже для объяснения.Я явно недостаточно внимательно изучил документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...