Scrapy标识重定向和停止循环

2024-10-04 05:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着反复浏览一些页面。网站的不同页面标有or10、or20、or30等。i、 e

/Restaurant_Review

是第一页吗

/Restaurant_Review-or10

是第二页吗

/Restaurant_Review-or20

第3页等

问题是,如果-or-version不存在,我会从这些站点重定向到正常的url(第一个)。我目前正在for循环中的一个范围内循环,并动态更改-or-value。你知道吗

 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\u page()函数返回告诉parse()函数停止的内容。你知道吗


Tags: or函数selfurlforparseresponsedef
2条回答

这不是对实际问题的回答,而是不需要重定向检测的替代解决方案。你知道吗

在HTML中,您可以使用以下方法找到所有分页URL:

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

关于@Anton在评论中提出的问题,关于我是如何做到这一点的:

你可以通过打开一个随机的餐厅评论页面来检查这一点:

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

在shell中,您可以使用以下工具在浏览器中查看收到的HTML:

view(response)

在这里,您将看到它包含用于分页链接的HTML(和那个特定的类)。真正的网站确实使用Javascript来呈现下一页,但它是通过基于URL检索下一页的完整HTML来实现的。基本上,它只是取代了整个页面,很少涉及额外的处理。所以这意味着如果你自己打开链接,你也会得到完整的HTML。因此,Javascript问题与此无关。你知道吗

例如,您可以检查response.meta.get('redirect_urls')中的内容。如果您在那里有什么,请用dont_filter重试原始url。 或者试着用RetryMiddleware抓住这样的案子。你知道吗

相关问题 更多 >