【问题标题】:Dynamic start_urls value动态 start_urls 值
【发布时间】:2014-08-06 20:01:45
【问题描述】:

我是scrapy和python的新手。我已经编写了一个可以在初始化的 start_urls 值下正常工作的蜘蛛。

如果我在 Init 中的代码中添加一个文字,它也可以正常工作

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

但是,当我从一个 json 文件中读取值并创建一个列表时,我得到了关于缺少 %20 的相同错误

我觉得我在 scrapy 或 python 中遗漏了一些明显的东西,因为我是一个 nube。

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%20value

【问题讨论】:

  • 回溯错误:文件“/usr/lib/python2.7/dist-packages/scrapy/http/request/__init__.py”,第 61 行,在 _set_url raise ValueError('Missing scheme in request url: %s' % self._url) ValueError: Missing scheme in request url: Missing%20value
  • 请说明如何从 json 文件中读取值。
  • 文件被读入:js = None with open(filename) as fp: js = json.load(fp) assert js
  • 它被设置为一个名为 config_json 的类属性,然后从这个变量中加载各个字段。
  • def __init__(self, **config_json): """ 提取 json 并初始化公共提要属性 """ self.config_json = config_json self.title = str(self.config_json.get( 'title', '缺失值')) self.storage_file = str(self.config_json.get('storage_file', '缺失值')) self.log_file = str(self.config_json.get('log_file', '缺失值'))值'))

标签: python json scrapy


【解决方案1】:

而不是定义__init__() 覆盖start_requests() 方法:

这是 Scrapy 在打开爬虫时调用的方法 在未指定特定 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)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多