簡體   English   中英

無法強制scrapy使用重定向的url進行回調

[英]Unable to force scrapy to make a callback using the url that got redirected

我使用scrapy創建了一個python腳本來抓取某個網頁中的一些可用信息。 問題是我嘗試使用的鏈接經常被重定向。 但是,當我嘗試使用請求幾次時,我得到了所需的內容。

在scrapy的情況下,我無法重用鏈接,因為無論我嘗試多少次,我都發現它會重定向。 我什至可以使用response.meta.get("redirect_urls")[0]來捕獲主 url,該 url 旨在在parse方法中遞歸使用。 但是,它總是被重定向,因此不會發生callback

這是我目前的嘗試( the link used within the script is just a placeholder ):

import scrapy
from scrapy.crawler import CrawlerProcess

class StackoverflowSpider(scrapy.Spider):

    handle_httpstatus_list = [301, 302]
    name = "stackoverflow"
    start_url = 'https://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean'

    def start_requests(self):
        yield scrapy.Request(self.start_url,meta={"lead_link":self.start_url},callback=self.parse)


    def parse(self,response):

        if response.meta.get("lead_link"):
            self.lead_link = response.meta.get("lead_link")
        elif response.meta.get("redirect_urls"):
            self.lead_link = response.meta.get("redirect_urls")[0]

        try:
            if response.status!=200 :raise
            if not response.css("[itemprop='text'] > h2"):raise
            answer_title = response.css("[itemprop='text'] > h2::text").get()
            print(answer_title)

        except Exception:
            print(self.lead_link)
            yield scrapy.Request(self.lead_link,meta={"lead_link":self.lead_link},dont_filter=True, callback=self.parse)


if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',
    })
    c.crawl(StackoverflowSpider)
    c.start()

問題:如何強制scrapy 使用重定向的url 進行callback

據我了解,您想抓取一個鏈接,直到它停止重定向並最終獲得 http 狀態 200

如果是,那么您必須首先從代碼中刪除handle_httpstatus_list = [301, 302]然后在middlewares.py創建一個CustomMiddleware

class CustomMiddleware(object):

    def process_response(self, request, response, spider):

        if not response.css("[itemprop='text'] > h2"):
            logging.info('Desired text not found so re-scraping' % (request.url))
            req = request.copy()
            request.dont_filter = True

            return req
        if response.status in [301, 302]:
            original_url = request.meta.get('redirect_urls', [response.url])[0]
            logging.info('%s is redirecting to %s, so re-scraping it' % (request._url, request.url))
            request._url = original_url
            request.dont_filter = True

            return request

        return response

那么你的蜘蛛應該看起來像這樣

class StackoverflowSpider(scrapy.Spider):

    name = "stackoverflow"
    start_url = 'https://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean'

    custom_settings = {
        'DOWNLOADER_MIDDLEWARES': {
            'YOUR_PROJECT_NAME.middlewares.CustomMiddleware': 100,
        }
    }

    def start_requests(self):
        yield scrapy.Request(self.start_url,meta={"lead_link":self.start_url},callback=self.parse)

    def parse(self,response):

        answer_title = response.css("[itemprop='text'] > h2::text").get()
        print(answer_title)

如果你告訴我你正在抓取哪個網站,那么我可以幫助你,你也可以給我發電子郵件,這在我的個人資料上

你可能想看看這個
如果您需要阻止重定向,可以通過請求元:

request = scrapy.Request(self.start_url,meta={"lead_link":self.start_url},callback=self.parse)
request.meta['dont_redirect'] = True
yield request

由於文檔,這是一種停止重定向的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM