Scrapy无法爬取folhadirigida.com.br页面的原因咨询
为什么我的Scrapy爬虫无法正确爬取folhadirigida.com.br首页?
先看看你贴出来的爬虫代码:
# -*- coding: utf-8 -*- import scrapy class ProvasSpider(scrapy.Spider): name = 'provas' allowed_domains = ['folhadirigida.com.br'] start_urls = ['https://folhadirigida.com.br/'] def parse(self, response): #criando pagina page = response.url.split ("/")[-3] filename = '%s.html' % page with open(filename, 'wb') as f: f.write(response.body)
我帮你分析下可能的问题:
1. 文件名生成逻辑的坑
你用response.url.split("/")[-3]来生成文件名,但首页的URL是https://folhadirigida.com.br/,用/分割后得到的列表是['https:', '', 'folhadirigida.com.br', ''],取索引-3对应的是空字符串,最终生成的文件名是.html——在Linux/macOS系统里这是隐藏文件,你可能根本没注意到它存在,误以为爬虫没输出结果。
而其他页面的URL结构不一样(比如https://folhadirigida.com.br/categoria/noticias/),分割后[-3]能拿到有效字符串,所以文件名正常,你能看到爬取的文件。
2. 首页可能有反爬拦截
有些网站会对首页做更严格的反爬校验,比如检查请求的User-Agent。Scrapy默认的User-Agent是类似Scrapy/2.8.0 (+https://scrapy.org)的标识,很容易被网站识别为爬虫并拦截,导致你拿到的内容不完整或者是空的。而其他内页的反爬规则可能更宽松,所以能正常爬取。
对应的解决方案
修复文件名生成逻辑
可以给首页单独指定文件名,或者用更鲁棒的方式提取页面标识:
def parse(self, response): # 处理首页的特殊情况 if response.url == self.start_urls[0]: page = "index" else: # 从URL中提取最后一个非空的部分作为文件名 url_parts = [part for part in response.url.split("/") if part] page = url_parts[-2] if len(url_parts) >=2 else url_parts[-1] filename = '%s.html' % page with open(filename, 'wb') as f: f.write(response.body)
自定义User-Agent绕过反爬
在Scrapy项目的settings.py文件里添加浏览器的User-Agent:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
你也可以换成你当前使用的浏览器的真实User-Agent,这样更难被识别。
如果还是不行,还可以尝试在settings.py中开启CookiesMiddleware,或者添加下载延迟:
DOWNLOAD_DELAY = 2
内容的提问来源于stack exchange,提问作者luiz coutinho
相关产品推荐
相关产品推荐

