Как дать URL для scrapy для сканирования? - PullRequest
24 голосов
/ 13 марта 2012

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

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

// имя моего паука является примером, но я даю URL вместо моего имени паука (Это нормально работает, если я даю имя паука).

scrapy crawl example.com

ОШИБКА:

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

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

Ответы [ 6 ]

50 голосов
/ 13 марта 2012

Я не совсем уверен насчет опции командной строки. Тем не менее, вы могли бы написать свой паук, как это.

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"

12 голосов
/ 08 марта 2013

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

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

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

self.start_urls = kwargs.get('start_urls').split(',')
4 голосов
/ 15 марта 2012

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

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

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

3 голосов
/ 16 февраля 2015

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)
3 голосов
/ 05 октября 2012

Это расширение подхода, данного Сяаком Трехааком в этой теме.Пока этот подход работает, только если вы предоставите ровно один 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 и сгенерировать аргументы командной строки в цикле или что-то в этом роде.

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

0 голосов
/ 28 августа 2015

Вы также можете попробовать это:

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

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

...