0

我刚刚开始使用 Scrapy 并完成了教程,但我遇到了一个问题,要么我无法在教程和/或文档中找到答案,要么我已多次阅读答案现在,但我只是没有正确理解......

设想:

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

我需要的所有信息都可以从常见的基本 URL 中获取,如下所示:

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

每个类别的 URls 如下所示:

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 个结果。如果用户想查看更多,他们必须点击底部的“加载更多结果...”按钮。经过一番调查,在页面的初始加载过程中,仅请求前 30 个(这是有道理的),单击“加载更多..”按钮后,URL 更新为附加“pagex=2”并且容器刷新了 30 多个结果。在此之后,按钮消失,当用户继续向下滚动页面时,向服务器发出后续请求以获取接下来的 30 个结果,“pagex”值增加 1,容器刷新并附加结果,冲洗并重复。

我不确定如何处理网站上的分页,但我想出的最简单的解决方案就是找出每个类别的最大“pagex”数,然后将 URL 设置为该数字以供初学者使用。

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

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

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

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

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

我想发送一个带有最后一个已知“良好”最大页码的测试响应,并根据提供的 HTTP 响应,使用它来决定 URL 将是什么。

所以,在我开始任何爬行之前,我想在“pagex”中加1并检查404。如果404我知道我仍然很好,如果我得到200,我需要继续加1直到我得到404,所以我知道最大值在哪里(或者如果需要减少)。

我似乎无法弄清楚是否可以使用 Scrapy 来执行此操作,我必须先使用不同的模块来运行此检查。我尝试在“parse”和“start_requests”方法中添加用于测试目的的简单检查,但没有运气。start_requests 似乎无法处理响应,并且 parse 可以检查响应代码,但不会按照指示更新 URL。

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

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

4

1 回答 1

0

您可以在 scrapy 中配置要配置的状态,这样您就可以parse根据response.status. 检查如何处理文档中的状态。例子:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]
于 2017-01-06T03:43:03.070 回答