解决爬虫在重定向(Redirect)情况下,URL没有变化的方法
在爬虫中处理重定向,确保URL不变,可以通过以下方法:
- 使用requests库时,可以使用
allow_redirects
参数。将其设置为False
可以阻止重定向,但是响应对象中会包含重定向的URL。
import requests
url = 'http://example.com'
response = requests.get(url, allow_redirects=False)
if response.is_redirect:
print('Redirect to:', response.headers['Location'])
else:
print('No redirect')
- 使用Scrapy框架时,可以覆写
from_crawler
方法,在这里配置重定向相关的中间件。
from twisted.internet.defer import Deferred
from twisted.web.http import HTTPRedirect
from scrapy.crawler import CrawlerRunner
from scrapy.extensions.httpcache import HttpCacheStorage
from scrapy.spiders import CrawlSpider
from scrapy.http import Request, Response
class MySpider(CrawlSpider):
# Your spider code here
@classmethod
def from_crawler(cls, crawler):
spider = super().from_crawler(crawler)
# Configure middlewares to handle redirects
crawler.engine.download.middleware.insert(0, cls.redirect_middleware)
return spider
@staticmethod
def redirect_middleware(next_middleware):
@Deferred.inlineCallbacks
def redirect_middleware_func(request):
response = yield next_middleware(request)
if isinstance(response, HTTPRedirect):
# Handle redirect here
pass
return response
return redirect_middleware_func
# Run the spider
runner = CrawlerRunner()
d = runner.crawl(MySpider)
d.addBoth(lambda _: reactor.stop())
reactor.run()
在这些例子中,我们展示了如何在不同的爬虫库中处理重定向,确保在重定向发生时,URL不变,从而能够正确地处理页面。这些方法可以帮助你保持爬虫的逻辑不受重定向影响,同时允许重定向发生。
评论已关闭