【问题标题】:scrapy- how to stop Redirect (302)scrapy- 如何停止重定向 (302)
【发布时间】:2013-03-06 18:36:42
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: web-scraping web-crawler scrapy


    【解决方案1】:

    是的,你可以简单地通过添加元值来做到这一点

    meta={'dont_redirect': True}
    

    您也可以停止针对特定响应代码的重定向,例如

    meta={'dont_redirect': True,"handle_httpstatus_list": [302]}
    

    它将停止仅重定向 302 响应代码。您可以添加尽可能多的 http 状态代码以避免重定向它们。

    例子

    yield Request('some url',
        meta = {
            'dont_redirect': True,
            'handle_httpstatus_list': [302]
        },
        callback= self.some_call_back)
    

    【讨论】:

    • 感谢您的回复!但是我对将这行代码放在哪里有点困惑?我试图覆盖 start_requests,但它给了我一个错误“响应”对象没有属性“body_as_unicode”。我们可以同时退货和请求吗?
    • 您可以使用重定向调用 hxs = HtmlXPathSelector(response) 您必须测试 response.status ==302 并进行另一种处理。这种情况下的 hxs 将失败,因为 response.body 对于 302 状态为空
    • 有人测试过吗?它不适用于当前的scrapy版本,我已经用'handle_httpstatus_list': [404, 301]进行了测试,只有404个作品
    • 它会停止重定向,但它也不会从给定页面抓取内容,有什么解决方案吗?
    • 你可以把这段代码放到蜘蛛类的 start_requests 方法中。当蜘蛛执行首先在 init 方法中启动,然后转到 start_requests,此时请求还没有发送。你可以这样写:request = Request(url=self.start_urls[0], callback=self.parse) request.meta['dont_redirect'] = True return [request] 然后它会发送请求,如果没问题就会去解析方法,或者回调方法。
    【解决方案2】:

    在查看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】:

    默认情况下,Scrapy 使用RedirectMiddleware 来处理重定向。您可以将REDIRECT_ENABLED 设置为 False 以禁用重定向。

    documentation

    【讨论】:

    • 我试过了,如果我设置“REDIRECT_ENABLED=False”,scrapy会停止重定向,也无法获取html内容。
    【解决方案4】:

    这里解释:Scrapy docs

    使用请求元

    request =  scrapy.Request(link.url, callback=self.parse2)
    request.meta['dont_redirect'] = True
    yield request
    

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2019-11-13
      • 2020-03-16
      • 1970-01-01
      • 2015-04-22
      • 2014-09-23
      • 2017-05-12
      • 2014-03-31
      相关资源
      最近更新 更多