Динамическое значение start_urls

#python #json #scrapy

#python #json #scrapy

Вопрос:

Я новичок в scrapy и python. Я написал паук, который отлично работает с инициализированным значением start_urls.

Он также отлично работает, если я помещаю литерал в код при инициализации как

{ self.start_urls = ‘http://something.com ‘ }

Но, когда я считываю значение из файла json и создаю список, я получаю ту же ошибку об отсутствующем

Я чувствую, что мне не хватает чего-то очевидного ни в scrapy, ни в python, потому что я новичок.

 class SiteFeedConstructor(CrawlSpider, FeedConstructor):

    name = "Data_Feed"
    start_urls = ['http://www.cnn.com/']

    def __init__(self, *args, **kwargs):

    FeedConstructor.__init__(self, **kwargs)
    kwargs = {}
    super(SiteFeedConstructor, self).__init__(*args, **kwargs)

    self.name = str(self.config_json.get('name', 'Missing value'))
    self.start_urls = str(self.config_json.get('start_urls', 'Missing value'))
    self.start_urls = self.start_urls.split(",")
  

ОШИБКА:

 Traceback (most recent call last):
  File "/usr/bin/scrapy", line 4, in <module>
    execute()
  File "/usr/lib/python2.7/dist-packages/scrapy/cmdline.py", line 132, in execute
    _run_print_help(parser, _run_command, cmd, args, opts)
  File "/usr/lib/python2.7/dist-packages/scrapy/cmdline.py", line 97, in _run_print_help
    func(*a, **kw)
  File "/usr/lib/python2.7/dist-packages/scrapy/cmdline.py", line 139, in _run_command
    cmd.run(args, opts)
  File "/usr/lib/python2.7/dist-packages/scrapy/commands/runspider.py", line 64, in run
    self.crawler.crawl(spider)
  File "/usr/lib/python2.7/dist-packages/scrapy/crawler.py", line 42, in crawl
    requests = spider.start_requests()
  File "/usr/lib/python2.7/dist-packages/scrapy/spider.py", line 55, in start_requests
    reqs.extend(arg_to_iter(self.make_requests_from_url(url)))
  File "/usr/lib/python2.7/dist-packages/scrapy/spider.py", line 59, in make_requests_from_url
    return Request(url, dont_filter=True)
  File "/usr/lib/python2.7/dist-packages/scrapy/http/request/__init__.py", line 26, in __init__
    self._set_url(url)
  File "/usr/lib/python2.7/dist-packages/scrapy/http/request/__init__.py", line 61, in _set_url
    raise ValueError('Missing scheme in request url: %s' % self._url)
ValueError: Missing scheme in request url: Missing value
  

Комментарии:

1. Ошибка обратной трассировки: файл «/usr/lib/python2.7/dist-packages/scrapy/http/request/__init__.py «, строка 61, в _set_url вызывает ошибку ValueError(‘Отсутствует схема в URL-адресе запроса: %s’ % self._url) Ошибка ValueError: отсутствует схема в URL-адресе запроса: отсутствует value

2. Пожалуйста, покажите, как вы считываете значения из файла json.

3. Файл считывается с помощью: js = None с открытым (именем файла) как fp: js = json.load(fp) утверждает js

4. Для него устанавливается атрибут класса с именем config_json, а затем из этой переменной загружаются отдельные поля.

5. def __init__(self, **config_json): «»» Извлеките json и инициализируйте общие свойства канала «»» self.config_json = config_json self.title = str(self.config_json.get(‘title’, ‘Missing value’)) self.storage_file =str(self.config_json.get(‘storage_file’, ‘Отсутствующее значение’)) self.log_file = str(self.config_json.get(‘log_file’, ‘Отсутствующее значение’))

Ответ №1:

Вместо определения __init__() start_requests() метода переопределения:

Это метод, вызываемый Scrapy, когда spider открывается для очистки, когда не указаны конкретные URL-адреса. Если указаны конкретные URL-адреса, вместо этого для создания запросов используется функция make_requests_from_url(). Этот метод также вызывается только один раз из Scrapy, поэтому его безопасно реализовать как генератор.

 class SiteFeedConstructor(CrawlSpider, FeedConstructor):
    name = "Data_Feed"

    def start_requests(self):
        self.name = str(self.config_json.get('name', 'Missing value'))
        for url in str(self.config_json.get('start_urls', 'Missing value')).split(","):
            yield self.make_requests_from_url(url)
  

Комментарии:

1. Это устраняет ошибки, но я не получаю никаких выходных данных от паука.

2. @user3746535 хорошо, каков текущий результат? Спасибо.

3. если я запущу паук с «жестко запрограммированным» cnn.com присвоенный атрибуту, я получаю целый список ссылок в выходном CSV-файле:

4. веб-сайт, URL, имя, заголовок cnn.com /,http://www.cnn.com /,Пропущенное значение,Пропущенное значение cnn.com /,http://www.cnn.com/OPINION/?hpt=sitenav ,Пропущенное значение, Пропущенное значение cnn.com /,http://ireport.cnn.com/?hpt=sitenav ,Пропущенное значение, Пропущенное значение cnn.com /,http://www.cnn.com/2014/06/17/health /… значение, Пропущенное значение cnn.com /,http://www.cnn.com/2014/06/17/us/ohio-mummified-body /… значение, Пропущенное значение…. и т.д. и т.п….

5. Если я использую предложенное переопределение, выходной CSV-файл будет пустым.