Как указать 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-адресе, указанном в терминале?
Ответы
Ответ 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.