You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:48:00