1

我正在尝试抓取craiglist。当我尝试在蜘蛛中获取 https://tampa.craigslist.org/search/jjj?query=bookkeeper时,出现以下错误:

(为了便于阅读,添加了额外的换行符和空格)

[scrapy.downloadermiddlewares.retry] DEBUG:
    Retrying <GET https://tampa.craigslist.org/search/jjj?query=bookkeeper> (failed 1 times):
    [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost:
    Connection to the other side was lost in a non-clean fashion: Connection lost.>]

但是,当我尝试在scrapy shell上抓取它时,它被成功抓取了。

[scrapy.core.engine] DEBUG:
    Crawled (200) <GET https://tampa.craigslist.org/search/jjj?query=bookkeeper>
    (referer: None)

我不知道我在这里做错了什么。我曾尝试强制使用 TLSv1.2,但没有运气。我将衷心感谢您的帮助。谢谢!

4

1 回答 1

0

我在评论中要求提供MCVE,这意味着您应该提供一个最小、完整和可验证的示例。为了帮助您,这就是它的全部内容:

import scrapy


class CLSpider(scrapy.Spider):
    name = 'CL Spider'
    start_urls = ['https://tampa.craigslist.org/search/jjj?query=bookkeeper']

    def parse(self, response):
            for url in response.xpath('//a[@class="result-title hdrlnk"]/@href').extract():
                yield scrapy.Request(response.urljoin(url), self.parse_item)

    def parse_item(self, response):
        # TODO: scrape item details here
        return {
            'url': response.url,
            # ...
            # ...
        }

现在,简单地说,这个 MCVE 可以完成您想做的所有事情:

  • 访问其中一个搜索页面
  • 遍历结果
  • 访问每个项目进行解析

这应该是您调试的起点,删除所有不相关的样板。

请测试上述内容并验证它是否有效?如果可行,请逐步添加更多功能,以便找出是哪个部分引入了问题。如果它不起作用,请在找出原因之前不要添加任何其他内容。

更新:

在请求之间添加延迟可以通过两种方式完成:

  1. settings.py通过指定例如DOWNLOAD_DELAY = 2每次下载之间的 2 秒延迟, 为所有蜘蛛在全局范围内。

  2. 每个蜘蛛通过定义一个属性download_delay

例如:

class CLSpider(scrapy.Spider):
    name = 'CL Spider'
    download_delay = 2

文档:https ://doc.scrapy.org/en/latest/topics/settings.html#download-delay

于 2018-05-14T07:43:52.930 回答