scrapy- how to stop Redirect (302)
我正在尝试使用Scrapy抓取网址。但这会将我重定向到不存在的页面。
1 | 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不存在不是,因此搜寻器找不到此内容。我也爬过许多其他网站,但在其他任何地方都没有这个问题。有什么办法可以阻止此重定向?
任何帮助将不胜感激。谢谢。
更新:这是我的蜘蛛课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 |
是的,您可以简单地通过添加像
这样的元值来做到这一点
1 | meta={'dont_redirect': True} |
您还可以针对特定的响应代码(如
)停止重定向
1 | meta={'dont_redirect': True,"handle_httpstatus_list": [302]} |
它将停止仅重定向302响应代码。您可以添加尽可能多的http状态代码,以避免重定向它们。
示例
1 2 3 4 5 6 | yield Request('some url', meta = { 'dont_redirect': True, 'handle_httpstatus_list': [302] }, callback= self.some_call_back) |
在查看了文档并浏览了相关资源之后,我得以弄清楚了。如果您在源代码中查找start_requests,则会看到它为所有URL调用make_requests_from_url。
我修改了make_requests_from_url
,而不是修改start_requests
1 2 3 4 5 | def make_requests_from_url(self, url): return Request(url, dont_filter=True, meta = { 'dont_redirect': True, 'handle_httpstatus_list': [301, 302] }) |
并将其添加为我的蜘蛛的一部分,就在
默认情况下,Scrapy使用
请参阅文档。
如此处所述:Scrapy docs
使用请求元
1 2 3 | request = scrapy.Request(link.url, callback=self.parse2) request.meta['dont_redirect'] = True yield request |