Scrapy识别重定向并停止循环

时间:2019-02-13 13:05:59

标签: python function scrapy web-crawler

我正在尝试遍历某些页面。网站的不同页面都标有or10,or20,or30等。即

/Restaurant_Review

是第一页

/Restaurant_Review-or10

是第二页

/Restaurant_Review-or20

第三页等

问题是,如果-or-版本不存在,我将从那些站点重定向到普通URL(第一个)。我目前正在for循环中遍历一个范围,并动态更改-or-值。

 def parse(self,response):
     l = range(100)
     reviewRange = l[10::10]

     for x in reviewRange:
          yield((url+"-or"+str(x)), callback=self.parse_page)

def parse_page(self,response):
    #do something
    #How can I from here tell the for loop to stop
    if(oldurl == response.url):
         return break
     #this doesnt work

问题是,即使页面不存在,我也需要执行请求,并且该页面不可扩展。我已经尝试过比较URL,但是仍然不明白如何从parse_page()函数返回某些信息,该信息会告诉parse()函数停止。

2 个答案:

答案 0 :(得分:1)

例如,您可以检查response.meta.get('redirect_urls')中的内容。如果那里有东西,请用dont_filter重试原始URL。 或者尝试使用RetryMiddleware来捕获此类情况。

答案 1 :(得分:1)

这不是对实际问题的答案,而是一种不需要重定向检测的替代解决方案。

在HTML中,您已经可以通过使用以下命令找到所有这些分页URL:

response.css('.pageNum::attr(href)').getall()

关于@Anton的问题,有关我如何获得它的评论:

您可以通过使用Scrapy Shell打开随机的餐厅评论页面来进行检查:

scrapy shell "https://www.tripadvisor.co.za/Restaurant_Review-g32655-d348825-Reviews-Brent_s_Delicatessen_Restaurant-Los_Angeles_California.html"

在外壳内,您可以通过以下方式在浏览器中查看收到的HTML:

view(response)

您将看到其中包含用于分页链接的HTML(以及该特定类)。真正的网站确实使用Javascript来呈现下一页,但是它是根据URL检索下一页的 full HTML来实现的。 Basicallty,它只是替换整个页面,几乎没有涉及其他处理。因此,这意味着如果您自己打开链接,您也会获得完整的HTML。因此,此处的Javascript问题无关紧要。