部署到Scraping Hub和spider run

时间:2017-10-28 21:13:16

标签: python-2.7 scrapy scrapy-spider

问题

我的蜘蛛依赖于.txt文件,其中包含蜘蛛进入的网址。我已将该文件放在蜘蛛代码所在的同一目录中,并放在它之前的每个目录中(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仪表板运行我的蜘蛛时,会出现这个问题。蜘蛛的部署成功了,我制作了一个requirements.txt文件来下载我蜘蛛中使用的Pandas包。

我的代码

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

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)

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

1 个答案:

答案 0 :(得分:2)

您需要在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,因为在某些情况下可能需要这样做。

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

import pkgutil

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