Scrapy登录后爬取GitHub用户信息时email字段返回None问题排查
Scrapy GitHub登录爬虫email字段为空问题排查方案
首先email字段返回None确实是未登录导致的,和你看到的Referer警告没有直接关联,警告只是Scrapy旧版本对新的Referrer-Policy格式兼容问题,不会阻断登录流程。
登录失败的具体排查点
- 表单参数不全:GitHub当前的登录表单除了你传递的账号、密码、authenticity_token之外,还有
commit、timestamp、timestamp_secret等多个必填隐藏参数,你只传三个参数会直接被登录接口拒绝。
你使用的FormRequest.from_response本身可以自动提取所有表单隐藏参数,不需要手动提取authenticity_token,手动提取反而可能出现取值错误的问题。 - 请求头缺失被反爬拦截:Scrapy默认的User-Agent会被GitHub直接识别为爬虫,登录请求会被拦截,你需要自定义符合浏览器特征的User-Agent。
- 没有校验登录结果:你当前的代码没有校验登录是否成功就直接跳转用户页,建议在
parse_after_login方法中先验证登录状态,比如检测响应中是否存在退出登录的按钮元素,确认登录成功后再继续爬取。
临时解决Referer警告的方法
你遇到的Referer警告是因为使用的Scrapy版本低于2.6,不支持空格分隔的多值Referrer-Policy,两种解决方法:
- 升级Scrapy到最新版本:
pip install --upgrade scrapy - 临时关闭Referer中间件:在项目
settings.py中添加配置REFERER_ENABLED = False
修改后的代码示例
import scrapy from scrapy.http import FormRequest class GitHubSpider(scrapy.Spider): name = "github" allowed_domains = ["github.com"] # 自定义浏览器UA避免被反爬拦截 custom_settings = { "USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" } start_urls = ["https://github.com/login"] def parse(self, response): # 不需要手动提取token,from_response会自动填充所有隐藏表单参数 return FormRequest.from_response( response, formdata={ "login": "你的GitHub账号", "password": "你的GitHub密码/个人访问令牌", }, callback=self.parse_after_login, ) def parse_after_login(self, response): # 先校验是否登录成功 if response.xpath('//form[@action="/logout"]').get(): self.logger.info("登录成功") yield scrapy.Request( url="https://github.com/willingc", callback=self.parse_engineer, ) else: self.logger.error("登录失败,响应前500字符:%s", response.text[:500]) def parse_engineer(self, response): yield { "username": response.css(".vcard-username::text").get().strip(), "email": response.xpath('//li[@itemprop="email"]/a//text()').get(), "url": response.xpath('//li[@itemprop="url"]/a//@href').get(), }
补充说明:如果你的GitHub账号开启了两步验证,不能直接用密码登录,需要生成个人访问令牌(PAT)代替密码传入password字段。
内容的提问来源于stack exchange,提问作者Joey Coder
相关产品推荐
相关产品推荐

