【问题标题】:Scrapy gives URLError: <urlopen error timed out>Scrapy 给出 URLError: <urlopen error timed out>
【发布时间】:2015-09-11 22:17:51
【问题描述】:

所以我有一个scrapy程序,我正试图启动,但我无法让我的代码执行它总是出现以下错误。

我仍然可以使用scrapy shell 命令访问该站点,因此我知道 URL 和其他东西都可以正常工作。

这是我的代码

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from Malscraper.items import MalItem

class MalSpider(CrawlSpider):
  name = 'Mal'
  allowed_domains = ['www.website.net']
  start_urls = ['http://www.website.net/stuff.php?']
  rules = [
    Rule(LinkExtractor(
        allow=['//*[@id="content"]/div[2]/div[2]/div/span/a[1]']),
        callback='parse_item',
        follow=True)
  ]

  def parse_item(self, response):
    mal_list = response.xpath('//*[@id="content"]/div[2]/table/tr/td[2]/')

    for mal in mal_list:
      item = MalItem()
      item['name'] = mal.xpath('a[1]/strong/text()').extract_first()
      item['link'] = mal.xpath('a[1]/@href').extract_first()

      yield item

编辑:这是踪迹。

Traceback (most recent call last):
  File "C:\Users\2015\Anaconda\lib\site-packages\boto\utils.py", line 210, in retry_url
    r = opener.open(req, timeout=timeout)
  File "C:\Users\2015\Anaconda\lib\urllib2.py", line 431, in open
    response = self._open(req, data)
  File "C:\Users\2015\Anaconda\lib\urllib2.py", line 449, in _open
    '_open', req)
  File "C:\Users\2015\Anaconda\lib\urllib2.py", line 409, in _call_chain
    result = func(*args)
  File "C:\Users\2015\Anaconda\lib\urllib2.py", line 1227, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "C:\Users\2015\Anaconda\lib\urllib2.py", line 1197, in do_open
    raise URLError(err)
URLError: <urlopen error timed out>

编辑2:

因此,使用scrapy shell command 我可以操纵我的回复,但我只是注意到在访问该网站时再次出现相同的错误

编辑3:

我现在发现错误出现在我使用 shell command 的每个网站上,但我仍然能够操纵响应。

编辑4: 那么我如何验证我在运行crawl command 时至少收到了来自 Scrapy 的响应? 现在我不知道是我的代码导致我的日志为空还是错误?

这是我的 settings.py

BOT_NAME = 'Malscraper'

SPIDER_MODULES = ['Malscraper.spiders']
NEWSPIDER_MODULE = 'Malscraper.spiders'
FEED_URI = 'logs/%(name)s/%(time)s.csv'
FEED_FORMAT = 'csv'

【问题讨论】:

  • 能否发布异常回溯?
  • 您还确定您的网址返回正确的响应吗?也许网站只是超时?你爬的是哪个网站
  • 我 100% 确定它会返回正确的响应,我使用 shell 命令来验证我的 xpath。
  • 这不是scrapy错误这看起来像boto错误\Users\2015\Anaconda\lib\site-packages\boto\utils.py你的错误是boto试图连接某处并超时它不是scrapy蜘蛛
  • 您的安装中似乎有一些疯狂的东西,您可以尝试打开文件“C:\Users\2015\Anaconda\lib\site-packages\boto\utils.py”插入:来自 pdb导入设置跟踪;第 210 行的 set_trace() 并检查 boto 尝试连接的位置?你应该有 urllib 请求对象,所以你应该得到它尝试请求的 url

标签: python web-scraping scrapy


【解决方案1】:

这个问题有一个公开的scrapy issue:https://github.com/scrapy/scrapy/issues/1054

虽然在其他平台上似乎只是一个警告。

您可以通过添加到您的 scrapy 设置来禁用 S3DownloadHandler(导致此错误):

DOWNLOAD_HANDLERS = {
  's3': None,
}

【讨论】:

  • 有没有办法在 Scrapy 包中更改这个而不是每次在 scrapy 脚本中设置这个?
  • 你的意思是在你的机器上全局设置它以便它适用于所有项目吗?我认为这是不可能的。
【解决方案2】:

您还可以从可选包中删除 boto 添加:

from scrapy import optional_features
optional_features.remove('boto')

正如issue中所建议的那样

【讨论】:

    【解决方案3】:

    这很烦人。发生的情况是您拥有 Null 凭据,而 boto 决定使用 _populate_keys_from_metadata_server() 从元数据服务器(如果存在)为您填充它们。请参阅 herehere。如果您不在 EC2 实例中运行,或者不在运行元数据服务器的东西中运行(侦听自动魔术 IP:169.254.169.254),则尝试超时。这很好而且很安静,因为scrapy 处理了异常here,但不幸的是,boto 开始记录它here 因此,这是令人讨厌的消息。除了如前所述禁用 s3...看起来有点吓人之外,您只需将凭据设置为空字符串即可获得类似的结果。

    AWS_ACCESS_KEY_ID = ""
    AWS_SECRET_ACCESS_KEY = ""
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2012-02-22
      • 2020-11-11
      • 2011-05-13
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多