我正在尝试使用Scrapy抓取网址。但它将我重定向到不存在的页面。
Redirecting (302) to <GET http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197> from <GET http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx>
问题是http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx存在,但http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197没有,因此抓取工具无法找到此问题。我也抓了很多其他网站,但在其他任何地方都没有这个问题。有没有办法可以阻止这种重定向?
非常感谢任何帮助。感谢。
更新:这是我的蜘蛛类
class Inon_Spider(BaseSpider):
name = 'Inon'
allowed_domains = ['www.shop.inonit.in']
start_urls = ['http://www.shop.inonit.in/Products/Inonit-Gadget-Accessories-Mobile-Covers/-The-Red-Tag/Samsung-Note-2-Dead-Mau/pid-2656465.aspx']
def parse(self, response):
item = DealspiderItem()
hxs = HtmlXPathSelector(response)
title = hxs.select('//div[@class="aboutproduct"]/div[@class="container9"]/div[@class="ctl_aboutbrand"]/h1/text()').extract()
price = hxs.select('//span[@id="ctl00_ContentPlaceHolder1_Price_ctl00_spnWebPrice"]/span[@class="offer"]/span[@id="ctl00_ContentPlaceHolder1_Price_ctl00_lblOfferPrice"]/text()').extract()
prc = price[0].replace("Rs. ","")
description = []
item['price'] = prc
item['title'] = title
item['description'] = description
item['url'] = response.url
return item
答案 0 :(得分:12)
是的,你可以通过添加像
这样的元值来做到这一点meta={'dont_redirect': True}
您也可以停止重定向特定的响应代码,例如
meta={'dont_redirect': True,"handle_httpstatus_list": [302]}
它将停止仅重定向302个响应代码。
例如
yield Request('some url',
meta = {
'dont_redirect': True,
'handle_httpstatus_list': [302]
},
callback= self.some_call_back)
答案 1 :(得分:7)
默认情况下,Scrapy使用RedirectMiddleware
来处理重定向。您可以将REDIRECT_ENABLED
设置为False以禁用重定向。
答案 2 :(得分:6)
在查看documentation并查看相关来源后,我能够弄明白。如果您查看start_requests的源代码,您会看到它为所有URL调用make_requests_from_url。
我没有修改start_requests,而是修改了make_requests_from_url
def make_requests_from_url(self, url):
return Request(url, dont_filter=True, meta = {
'dont_redirect': True,
'handle_httpstatus_list': [301,302]
})
并将其添加为蜘蛛的一部分,位于parse()
上方。
答案 3 :(得分:2)
如此处所述:Scrapy docs
使用Request Meta
request = scrapy.Request( link.url, callback=self.parse2)
request.meta['dont_redirect'] = True
yield request