Scrapy - 根据HTTP状态代码动态构建URL?

时间:2017-01-06 01:32:23

标签: python scrapy web-crawler scrapy-spider dynamic-url

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

场景:

假设我有一个我想抓取的网站。内容基于在url中传递的查询参数动态呈现。我需要根据“类别”的URL pram抓取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,所以我知道max在哪里(或者如果需要的话减少)。​​

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以在scrapy中配置要配置的状态,这样您就可以根据response.statusclass MySpider(CrawlSpider): handle_httpstatus_list = [404] 方法中做出决策。检查如何处理the documentation中的状态。例如:

SELECT
  XDocument
    .value('(/Book/Chapter[@verse="allo"])[2]',
      nvarchar(max)')
FROM XBiblos
WHERE Version = 666