[英]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.