【发布时间】:2020-04-07 16:01:35
【问题描述】:
我创建了一个 python 脚本,使用 scrapy 来抓取某个网页中的一些可用信息。问题是我尝试使用的链接经常被重定向。但是,当我尝试使用请求几次时,我得到了所需的内容。
如果是scrapy,我无法重复使用该链接,因为无论我尝试多少次,我发现它都会重定向。我什至可以使用 response.meta.get("redirect_urls")[0] 捕获主 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?
【问题讨论】:
-
您还想要原始链接和重定向链接的响应吗?或者您想在可数重定向后获得引导链接的响应?要不然是啥?我试图弄清楚究竟是什么目的。
-
来自原始链接,即使它被重定向。
-
那么为什么不在解析回调中禁用重定向呢?您需要重定向 URL 中的任何内容吗?
-
可以分享链接吗?
-
您的代码似乎已经产生了对原始 URL 的新请求。我不明白你在问什么。
标签: python python-3.x redirect web-scraping scrapy