Scrapy - 基于 HTTP 状态代码动态构建 URL?

Scrapy - Build URLs Dynamically Based on HTTP Status Code?

我刚刚开始使用 Scrapy,并且完成了教程,但是我 运行 遇到了一个问题,我在教程中找不到答案 and/or 文档,或者我现在已经多次阅读答案,但我只是没有正确理解...

场景:

假设我正好有 1 个网站要抓取。内容根据 url 中传递的查询参数动态呈现。我需要根据 "category" 的 URL 婴儿车抓取 3 "sets" 数据。

我需要的所有信息都可以从公共基础 URL 中获取,如下所示:

"http://shop.somesite.com/browse/?product_type=instruments"

每个类别的 URL 如下所示:

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=keyboards"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=guitars"

这里需要注意的是,网站每次初始请求仅加载 30 个结果。如果用户想查看更多,他们必须单击底部的按钮 "Load More Results..."。稍微调查了一下,在页面初始加载期间,只请求前 30 个(这是有道理的),单击 "Load More.." 按钮后,URL 更新为 "pagex=2" 追加,容器刷新并显示另外 30 个结果。在此之后,按钮消失,随着用户继续向下滚动页面,向服务器发出后续请求以获取接下来的 30 个结果,"pagex" 值递增 1,容器刷新并附加结果,冲洗和重复。

我不确定如何处理网站上的分页,但我想出的最简单的解决方案就是找出每个类别的最大数量 "pagex",然后设置 URLs 到初学者的那个数字。

例如,如果您在浏览器中传递 URL:

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums&pagex=22"

收到 HTTP 响应代码 200,所有结果都呈现到页面。伟大的!这给了我我需要的!

但是,比如说下周左右,又添加了 50 个项目,所以现在最大值是“...pagex=24”,我不会得到所有最新的。

或者是删除了 50 个项目并且新的最大值是“...pagex=20”,请求“22”时我会得到 404 响应。

我想发送一个测试响应,其中包含最后已知的 "good" 最大页码,并根据提供的 HTTP 响应,使用它来决定 URL 将是什么。

所以,在我开始任何爬行之前,我想在 "pagex" 上加 1 并检查 404。如果 404 我知道我还不错,如果我得到 200,我需要继续添加1 直到我得到 404,所以我知道 max 在哪里(或者如果需要的话减少)。​​

我似乎无法弄清楚我是否可以使用 Scrapy 来做到这一点,我必须首先使用不同的模块来 运行 此检查。我尝试在 "parse" 和 "start_requests" 方法中添加用于测试目的的简单检查,但没有成功。 start_requests 似乎无法处理响应,解析可以检查响应代码,但不会按照指示更新 URL。

我敢肯定这是我糟糕的编码技能(对这一切仍然陌生),但我似乎找不到可行的解决方案....

非常感谢任何想法或想法!

你可以在scrapy中配置配置哪些状态,这样你就可以根据response.statusparse方法中做出决定。检查如何处理 the documentation 中的状态。示例:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]