Scrapy给出URLError:<urlopen error =“”timed =“”out =“”>

时间:2015-06-25 10:44:54

标签: python web-scraping scrapy

所以我有一个scrapy程序,我试图开始,但我不能让我的代码执行它总是出现以下错误。

我仍然可以使用scrapy shell命令访问该网站,因此我知道了网址和所有工作。

这是我的代码

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>

EDIT2:

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

Edit3:

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

Edit4: 那么如何在运行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'

3 个答案:

答案 0 :(得分:18)

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

虽然它似乎只是其他平台的警告。

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

DOWNLOAD_HANDLERS = {
  's3': None,
}

答案 1 :(得分:5)

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

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

正如issue

中所述

答案 2 :(得分:1)

这很烦人。发生的事情是您拥有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 = ""