Scrapy LinkExtractor指定URL爬取问题:遭遇重定向无法按目标URL爬取
解决Scrapy LinkExtractor重定向无法爬取目标URL的问题
嘿,我来帮你搞定这个Scrapy LinkExtractor的重定向问题!咱们一步步排查和解决:
1. 先修正LinkExtractor的URL匹配规则
你的目标URL格式是http://www.example.com/book/diff/,其中diff是除/外的任意内容,那对应的正则规则得写对,不然会匹配到不符合的URL引发重定向。正确的规则应该是:
from scrapy.linkextractors import LinkExtractor # 严格匹配 /book/xxx/ 格式的路径,xxx不含/字符 link_extractor = LinkExtractor(allow=r'^/book/[^/]+/$')
^/book/:确保路径以/book/开头,避免匹配到其他包含book的无关路径[^/]+:匹配任意非/的字符(对应你的diff部分)/$:确保路径以/结尾,和目标URL格式完全对齐
如果之前的正则没写全,比如少了^或$,可能会匹配到像/book/xxx/another/page/这类深层路径,这类URL很可能会触发网站的重定向逻辑。
2. 检查Scrapy的重定向相关设置
Scrapy默认会自动处理重定向,但有时候网站的重定向逻辑比较特殊,你可以调整这些设置:
- 在
settings.py里确保REDIRECT_ENABLED = True(默认是True,但如果之前被误改要改回来) - 如果网站多次重定向导致失败,可以调高
REDIRECT_MAX_TIMES(默认是20,按需调整) - 有些网站会因为请求头不规范(比如没有真实的User-Agent)把请求重定向到验证页面,记得在
settings.py里配置正常的User-Agent:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
3. 确认allowed_domains和爬取范围
在你的爬虫类里,allowed_domains必须包含目标域名example.com,不然Scrapy会直接过滤掉相关URL,看起来就像是重定向失败:
class BookSpider(scrapy.Spider): name = 'book_spider' allowed_domains = ['example.com'] start_urls = ['http://www.example.com/book/'] # 这里填你的起始入口URL
4. 调试提取到的URL,排查问题
可以在爬虫的parse方法里打印LinkExtractor提取到的URL,看看是不是匹配到了正确的目标:
def parse(self, response): link_extractor = LinkExtractor(allow=r'^/book/[^/]+/$') links = link_extractor.extract_links(response) print("提取到的目标URL:", [link.url for link in links]) # 打印提取结果,方便排查 for link in links: yield scrapy.Request(link.url, callback=self.parse_book)
如果打印出来的URL里有不符合目标格式的,那就是正则规则的问题;如果URL是对的但还是重定向,那大概率是网站的反爬策略或者请求头的问题。
5. 处理重定向后的请求(可选)
如果网站确实需要重定向才能访问目标页面,你可以在回调方法里检查响应的最终URL:
def parse_book(self, response): # 验证响应的URL是否符合目标格式 if response.url.startswith('http://www.example.com/book/') and response.url.endswith('/'): # 这里写你的爬取逻辑,比如提取书籍信息 yield { 'url': response.url, 'title': response.css('h1.book-title::text').get() } else: # 如果被重定向到非目标页面,记录日志方便排查 self.logger.warning(f"请求被重定向到非目标URL:{response.url}")
内容的提问来源于stack exchange,提问作者Snooze
相关产品推荐
相关产品推荐

