Подтвердить что ты не робот

Как указать URL-адрес для скрининга для сканирования?

Я хочу использовать scrapy для обхода веб-страниц. Есть ли способ передать стартовый URL из самого терминала?

В документации указывается, что либо имя паука, либо URL-адрес можно указать, но когда я даю URL-адрес, он бросает ошибка:

//Я называю мой паук примером, но вместо имени моего паук я указываю url (он отлично работает, если я даю имя паука).

scraw crawl example.com

ERROR:

Файл "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", строка 43, в создании     raise KeyError ( "Паук не найден:% s" % spider_name) KeyError: "Паук не найден: example.com"

Как я могу сделать scrapy для использования моего паука на URL-адресе, указанном в терминале?

4b9b3361

Ответ 1

Я не уверен в опции командной строки. Однако вы можете написать своего паука следующим образом.

class MySpider(BaseSpider):

    name = 'my_spider'    

    def __init__(self, *args, **kwargs): 
      super(MySpider, self).__init__(*args, **kwargs) 

      self.start_urls = [kwargs.get('start_url')] 

И начните: scrapy crawl my_spider -a start_url="http://some_url"

Ответ 2

Еще более простой способ разрешить множественные url-аргументы, чем то, что предложил Питер, - это указать их как строку с URL-адресами, разделенными запятой, например:

-a start_urls="http://example1.com,http://example2.com"

В паук вы просто разделите строку на ',' и получите массив URL-адресов:

self.start_urls = kwargs.get('start_urls').split(',')

Ответ 3

Используйте команду parse parse. Вы можете проанализировать URL-адрес вашего паука. url передается из команды.

$ scrapy parse http://www.example.com/ --spider=spider-name

http://doc.scrapy.org/en/latest/topics/commands.html#parse

Ответ 4

Это расширение для подхода, данного Sjaak Trekhaak в этой теме. Подход, поскольку он пока работает, только если вы указали ровно один URL-адрес. Например, если вы хотите предоставить более одного URL-адреса, например:

-a start_url=http://url1.com,http://url2.com

тогда Scrapy (я использую текущую стабильную версию 0.14.4) завершится со следующим исключением:

error: running 'scrapy crawl' with more than one spider is no longer supported

Однако вы можете обойти эту проблему, выбрав другую переменную для каждого URL-адреса запуска вместе с аргументом, который содержит количество переданных URL-адресов. Что-то вроде этого:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2

Затем вы можете сделать следующее в своем пауке:

class MySpider(BaseSpider):

    name = 'my_spider'    

    def __init__(self, *args, **kwargs): 
        super(MySpider, self).__init__(*args, **kwargs) 

        urls_num = int(kwargs.get('urls_num'))

        start_urls = []
        for i in xrange(1, urls_num):
            start_urls.append(kwargs.get('start_url{0}'.format(i)))

        self.start_urls = start_urls

Это несколько уродливый взлом, но он работает. Конечно, утомительно явно записывать все аргументы командной строки для каждого URL-адреса. Поэтому имеет смысл обернуть команду scrapy crawl в Python subprocess и сгенерировать аргументы командной строки в цикле или что-то в этом роде.

Надеюсь, это поможет.:)

Ответ 5

Sjaak Trekhaak имеет правильную идею, и вот как разрешить мультипликаторы:

class MySpider(scrapy.Spider):
    """
    This spider will try to crawl whatever is passed in `start_urls` which
    should be a comma-separated string of fully qualified URIs.

    Example: start_urls=http://localhost,http://example.com
    """
    def __init__(self, name=None, **kwargs):
        if 'start_urls' in kwargs:
            self.start_urls = kwargs.pop('start_urls').split(',')
        super(Spider, self).__init__(name, **kwargs)

Ответ 6

Вы также можете попробовать следующее:

>>> scrapy view http://www.sitename.com

Он откроет окно в браузере запрашиваемого URL.