URL 部署到 Scraping Hub 和蜘蛛时找不到文本文件 运行

URL text file not found when deployed to Scraping Hub and spider run

问题

我的蜘蛛依赖于一个 .txt 文件,其中包含蜘蛛要去的 URLs。我将该文件放在蜘蛛代码所在的同一目录中,并放在它之前的每个目录中(Hail Marry 方法);最终结果是这样的:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/scrapy/core/engine.py", line 127, in _next_request
    request = next(slot.start_requests)
  File "/app/__main__.egg/CCSpider1/spiders/cc_1_spider.py", line 41, in start_requests
    for line in fileinput.input({url_file}):
  File "/usr/local/lib/python2.7/fileinput.py", line 237, in next
    line = self._readline()
  File "/usr/local/lib/python2.7/fileinput.py", line 339, in _readline
    self._file = open(self._filename, self._mode)
IOError: [Errno 2] No such file or directory: 'url_list_20171028Z.txt' 

问题

如何确保在我 运行 我的蜘蛛时总能找到 url_list_20171028Z.txt?此 URL 文本文件每天更新​​(新的文件会在第二天标记 -- e.x:url_list_20171029Z.txt,等等)。

背景

感谢您解决我的问题。我是 Python 的新手(2017 年 6 月开始学习),我把这个抓取项目当作乐趣和学习经验。我最近才开始使用 scrapy(2017 年 10 月),所以对于我脑海中闪过的任何明显的简单性,我深表歉意。

此项目已上传到 Scraping Hub 网站。当我尝试从 Scraping Hub 仪表板 运行 我的蜘蛛时,这个问题会弹出。 spider部署成功,我做了一个requirements.txt文件来下载我的spider中使用的Pandas包。

我的代码

下面的代码是调用 URL 文本文件的地方。我重新设计了新项目启动时启动的默认蜘蛛。当我 运行 我自己电脑上的蜘蛛时;它按需要运行。这是调用“url_list_20171028Z.txt”文件以获取 URLs 以从以下位置获取数据的代码部分:

def start_requests(self):
        s_time = strftime("%Y%m%d" ,gmtime())
        url_file = 'url_list_{0}Z.txt'.format(s_time)
        for line in fileinput.input({url_file}):
            url = str.strip(line)
            yield scrapy.Request(url=url, callback=self.parse)

非常感谢您花时间帮助我解决这个问题。如果您需要我添加更多信息,请告诉我!谢谢!

您需要在 setup.py 文件的 package_data 部分声明文件。

例如,如果你的Scrapy项目有以下结构:

myproject/
  __init__.py
  settings.py
  resources/
    cities.txt
scrapy.cfg
setup.py

您可以在 setup.py 中使用以下内容来包含 cities.txt 文件:

setup(
    name='myproject',
    version='1.0',
    packages=find_packages(),
    package_data={
        'myproject': ['resources/*.txt']
    },
    entry_points={
        'scrapy': ['settings = myproject.settings']
    },
    zip_safe=False,
)

请注意,zip_safe 标志设置为 False ,因为在某些情况下可能需要这样做。

现在您可以像这样从 setting.py 访问 cities.txt 文件内容:

import pkgutil

data = pkgutil.get_data("myproject", "resources/cities.txt")