【问题标题】:Can't get rid of a problematic page even when using rotation of proxies within scrapy即使在scrapy中使用代理轮换,也无法摆脱有问题的页面
【发布时间】:2021-01-22 14:22:17
【问题描述】:

我创建了一个脚本,使用scrapy 在其中实现代理轮换,以解析来自数百个类似链接(如this)的address。我从脚本中的 csv 文件中提供了这些链接。

脚本运行良好,直到遇到像 https://www.bcassessment.ca//Property/UsageValidation 这样的任何响应 url。鉴于一旦脚本开始获取该链接,它就无法绕过它。仅供参考,我正在使用包含 lead_link 的元属性来使用原始链接而不是重定向链接作为重试,因此我应该能够绕过该障碍。

当我在请求库中使用代理时不会发生这种情况。更清楚一点 - 在使用 requests 库时,脚本确实遇到此页面 /Property/UsageValidation,但在重试几次后成功绕过。

蜘蛛是这样的:

class mySpider(scrapy.Spider):
    name = "myspider"

    custom_settings = {
        'DOWNLOADER_MIDDLEWARES': {
            'stackoverflow_spider.middlewares.ProxiesMiddleware': 100,
        }
    }

    def start_requests(self):
        with open("output_main.csv","r") as f:
            reader = csv.DictReader(f)
            for item in list(reader):
                lead_link = item['link']
                yield scrapy.Request(lead_link,self.parse,meta={"lead_link":lead_link,"download_timeout":20}, dont_filter=True)

    def parse(self,response):
        address = response.css("h1#mainaddresstitle::text").get()
        print(response.meta['proxy'],address)

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT':'Mozilla/5.0',
        'LOG_LEVEL':'ERROR',
    })
    c.crawl(mySpider)
    c.start()

怎样才能让脚本不碰到那个页面?

PS 我在text file 中附上了一些链接,以防有人想尝试一下。

【问题讨论】:

  • 这看起来奇怪地类似于this。你们认识吗?
  • 这与我期望在这里使用scrapy @baduker 的解决方案有什么关系吗?两天前我遇到了你的划线帖子并试图解决它,但不幸的是失败了。但是,我想用scrapy解决它但没有运气,所以我创建了这篇文章来找出我做错了什么。谢谢。
  • 看起来该网站并不想被抓取,这是完全合理的,正如我们在这里看到的那样,您不是第一个尝试这样做的人。如果它适用于requests,那么坚持下去也许是个好主意。正如我在answer 中所说的那样,抓取的主要目标是保持低调。
  • 由于 requests 库可以做到,scrapy 有什么问题?这就是为什么我有兴趣寻求解决方案的原因。此外,我没有遇到其他帖子的两个错误。谢谢。
  • 对于requests 中的代理池实现,您可能为每个requests.Session 对象设置proxy。使用默认设置的 Hovewer scrapy 应用程序将对所有代理使用单个会话 cookieJar object`。

标签: python python-3.x web-scraping scrapy


【解决方案1】:

为scrapy应用程序实现会话安全代理你 需要添加额外的 cookiejar 元键到您将代理分配给 request.meta 的位置,如下所示:

....
yield scrapy.Request(url=link, meta = {"proxy":address, "cookiejar":address})

在这种情况下,scrapy cookiesMiddleware 将为每个代理创建额外的 cookieSession。

answer中提到的scrapy代理实现的相关细节

【讨论】:

  • 在我当前的实现中,我发现它可以工作this way
猜你喜欢
  • 2018-08-01
  • 2021-06-09
  • 2015-09-04
  • 1970-01-01
  • 2020-01-31
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多