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.status
在parse
方法中做出决定。检查如何处理 the documentation 中的状态。示例:
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]
我刚刚开始使用 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.status
在parse
方法中做出决定。检查如何处理 the documentation 中的状态。示例:
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]