Scrapy CrawlSpider parse_item用于302重定向响应

问题描述 投票:2回答:2

我正在使用Scrapy CrawlSpider来抓取网站并处理其页面内容。为此,我使用Scrapy Docs Crawlspider Example

链接上的特定页面通过GET请求(例如target)接收参数http://www.example.com?target=x,并且如果值是错误的,则重定向(302)。收到此302 HTTP响应后,scrapy会跟随重定向,但不会按照我的意图处理response方法中的parse_item

我遇到了一些建议meta/dont_redirect/http_status_list的解决方案,但似乎都没有生效。

请建议如何解析302重定向的响应,不在/之前在302重定向位置。

Scrapy版本:0.24.6

redirect web-scraping scrapy web-crawler
2个回答
2
投票

要禁用重定向,您应该将meta={'dont_redirect': True)添加到您生成的scrapy.Requests中。 所以你的蜘蛛应该看起来像这样:

import scrapy
class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com',]
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, meta={'dont_redirect':True})

这里发生的是scrapy有一个名为RedirectMiddleware的默认下载中间件,它默认启用并处理所有重定向,通过提供这个meta参数,你告诉这个中间件不要为这个特定请求做这个工作。

如果你想为每个请求禁用重定向(这通常不是最好的主意),你可以添加

REDIRECTS_ENABLED = False

在scrapy项目中你的settings.py

scrapy文档中有一个关于所有scrapy片段(如中间件和蜘蛛)如何协同工作的精彩插图:http://doc.scrapy.org/en/latest/topics/architecture.html


0
投票
class LagouSpider(CrawlSpider):
    handle_httpstatus_list = [302]
    meta = {'dont_redirect': True, "handle_httpstatus_list": [302]}
    name = 'lagou'
    allowed_domains = ['www.lagou.com']
    start_urls = ['https://www.lagou.com']
    login_url = "https://passport.lagou.com/login/login.html"
    custom_settings = {'REDIRECT_ENABLED': False}
    rules = (
        Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
        Rule(LinkExtractor(allow=("gongsi/j\d+.html",)), follow=True),
        Rule(LinkExtractor(allow=r'jobs/\d+.html'), callback='parse_job', follow=True),
    )
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Host': 'www.lagou.com',
        'Referer': 'https://www.lagou.com/',
        'X-Anit-Forge-Code': '0',
        'X-Anit-Forge-Token': 'None',
        'Accept-Encoding': 'gzip, deflate, br',
        'X-Requested-With': 'XMLHttpRequest'
    }


    def start_requests(self):
        global rc, im
        browser = webdriver.Chrome(executable_path="/home/wqh/下载/chromedriver")
        browser.get(self.login_url)
        # ··········(some code)

       return [scrapy.Request(self.start_urls[0], cookies=cookie_dict, 
        meta=self.meta)]
    def parse_job(self, response):
        if response.status == 302:
            print("302")
            time.sleep(100)
© www.soinside.com 2019 - 2024. All rights reserved.