2017-01-06 88 views
0

我刚刚开始使用Scrapy,并且阅读了教程,但是我遇到了一个问题,无论是在教程和/或文档中找不到答案,或者我已阅读答案多次了,但我只是不理解正确...Scrapy - 基于HTTP状态码动态构建URL?

场景:

比方说,我有整整1个网站,我想抓取。内容是基于url中传递的查询参数动态呈现的。我将需要根据“类别”的URL pram搜索3套“数据”。

我需要可以从公共基本的URL来抓住这样的所有信息:

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

而且每种类别的网址,像这样:

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:

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。

我敢肯定,这是我糟糕的编码能力(仍然新的这一切),但我似乎无法找到一个可行的解决方案....

任何想法或意见都非常感谢!

回答

0

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

class MySpider(CrawlSpider): 
    handle_httpstatus_list = [404] 
+0

感谢您的回应,并为延误感到抱歉!我暂时放弃了我在网站爬行方面的一些小实验,以开展其他项目。我会在今晚在这里测试你的建议,如果确实能解决这个问题,请将其标记为答案。我很好奇你是否可以在整体上提供你对我的“策略”的看法。鉴于我期望做什么以及面临的具体挑战,你会认为这是克服这个问题的可接受的方式,或者你会提出一种不同的方法吗? –