我正在尝试在某些页面上迭代。网站的不同页面标记为OR10,OR20,OR30等。即。
/Restaurant_Review
是第一页
/Restaurant_Review-or10
是第二页
/Restaurant_Review-or20
第三页等。
问题在于,如果不存在-or版本,我将从这些站点重定向到普通URL(第一)。我目前正在循环循环循环,并动态更改 -或值。
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()函数停止的东西。
您可以检查response.meta.get('redirect_urls')
中的内容。如果您在那里有东西,请用dont_filter
重试原始URL。或尝试使用重新构造件捕获此类案例。
这不是对实际问题的答案,而是不需要重定向检测的替代解决方案。
在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"
在外壳内部,您可以在浏览器中查看接收到的HTML:
view(response)
在那里您会看到它包含了分页链接的HTML(和特定类)。真实的网站确实使用JavaScript渲染下一页,但是通过根据URL检索下一页的完整 html来做到这一点。基本词,它只是替换了整个页面,涉及的其他处理很少。因此,这意味着,如果您自己打开链接,您也会获得完整的HTML。因此,JavaScript问题在这里是无关紧要的。