社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

无法下载github仓库中的数据?网页跳转的原理与 Stata、R、Python 解决方案

连享会 • 2 天前 • 13 次点击  


👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:连享会:2025社会网络分析·线上
嘉宾:杨张博,西安交通大学
时间:2025 年 7 月 30-31 日
咨询:王老师 18903405450(微信)


温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者: 连玉君 (中山大学)
邮箱:arlionn@163.com


本文写作过程中借助了 AI 工具:ChatGPT,豆包


1. 背景:你看到的网址,不一定能直接下载

在数据分析中,我们经常需要从网页上获取文件,比如:

  • 从 GitHub 下载 .csv 数据
  • 从 政府网站 抓取公告
  • 使用  DOI 链接 获取学术文献

但你可能遇到这样令人抓狂的报错:

HTTP error 403File not foundCannot open URL

这些错误,往往不是你代码写错了,而是踩到了 网页跳转(redirect) 的坑:你访问的网址其实只是 “入口”,背后被 网页跳转(redirect) 指向了另一个真正的地址。

类比:你收藏了图书馆旧网址,结果它早搬家了

你打开旧链接,看到的是个跳转页面: “我们的网站已迁移,3 秒后自动跳转至新地址”, 浏览器很听话,自动替你跳过去。 但程序(尤其是爬虫和下载命令)若没有开启“自动跳转”,就会卡在旧页面。


这些看似简单的跳转行为,是造成程序抓取失败的常见原因之一。 接下来,我们将通过具体例子,解释网页跳转的工作原理,并提供在 Stata、R 和 Python 中应对这些跳转的实用方案。


2. 网页跳转:你看到的不是你拿到的

网页跳转是服务器告诉客户端“你应该去另一个地址”,浏览器会自动跳过去,但程序不一定跟跳。

例 1:DOI 链接跳转

在论文引用中,我们常常看到形如 https://doi.org/{DOI} 的链接,例如:

URL1:https://doi.org/10.1257/aer.109.4.1197

但当你点击该链接时,浏览器中实际显示的网址往往是:

URL2:https://www.aeaweb.org/articles?id=10.1257/aer.109.4.1197

这是因为 DOI 系统一开始并不指向论文所在网站,而是将所有文献的入口统一托管在 doi.org。这个网站本身并不存储论文内容,而是作为一个 标准化的跳转服务,根据 DOI 查询注册信息,再将用户跳转到对应出版社的网页。

这种跳转一般通过 HTTP 301(永久跳转)或 HTTP 302(临时跳转)实现。 浏览器会自动跟随跳转,但程序或爬虫若未开启跳转功能,就无法获取真实的 PDF 或页面地址。

这一机制也被广泛应用于 SSRN、arXiv、Nature、Science 等期刊和论文平台,统一管理引用链接与实际访问路径。

下图展示了整个 DOI 跳转的过程:

例 2:GitHub 网页跳转

以 github 仓库 lianxhcn/data 中的 03-sales.csv 文件为例,你看到的文件链接是:

# Link00
https://github.com/lianxhcn/data/blob/main/03-sales.csv

这个地址其实是网页地址 (用于展示文件概况),不是文件下载地址

进入 03-sales.csv 的浏览页后,有些人会 右击 该页面的 Raw 按钮 → **复制链接地址 (E)**,得到如下网址:

# Link01
https://github.com/lianxhcn/data/raw/refs/heads/main/03-sales.csv

或者根据 github 的说明文档,使用如下网址:

# Link02
https://github.com/lianxhcn/data/blob/main/03-sales.csv?raw=true

上述 Link01 和 Link02 虽然在多数情况下都可以用于下载数据,但也都是 二次跳转地址,它们最终都会跳转到文件下载地址 (唯一地址,可以单击 Raw 按钮后,在地址栏中看到):

# Link_final
https://raw.githubusercontent.com/lianxhcn/data/main/03-sales.csv

因此,在编写程序进行大规模数据下载时:

  • 使用 Link00无法下载数据;
  • 使用 Link01 / Link02 则缺乏稳定性,因为有些程序 (如 Stata 中的 copyuse 等命令) 不具备跳转功能;同时,二次定向规则发生变化时,这些中间网址也会失效。
  • 使用 Link_final 是最安全可靠的方式,因为它是 唯一的文件下载地址,不会发生跳转。


3. 如何判断一个网址是否会跳转?

方法 1:浏览器观察法

  • 复制原始链接,在新标签页粘贴打开;
  • 若地址栏变化,说明跳转发生。

方法 2:开发者工具法

  • 打开网页 → F12 → Network → 刷新页面;
  • 查找是否出现 3xx 状态码和 Location: 字段。

方法 3:使用命令行工具 curl 或  wget

curl -I https://github.com/lianxhcn/data/blob/main/03-sales.csv

输出:

HTTP/1.1 302 Found
Location: https://raw.githubusercontent.com/...

说明该链接发生了跳转。

加上 -L 参数即可跟踪跳转:

curl -L -o sales.csv https://github.com/lianxhcn/data/blob/main/03-sales.csv


4. Stata / R / Python 中如何处理跳转?

不同的编程工具在处理网页跳转时表现不同。有些工具(如 Python 的 requests、R 的 httr 包)默认支持自动跟踪跳转,能够顺利获取最终资源。而另一些工具(如 Stata 的  import delimitedcopy 命令)则不支持自动跳转,直接访问含跳转的网址时可能失败。此时,推荐结合外部工具(如 curl),先下载文件到本地,再用目标程序进行数据导入。这样可以有效应对跳转带来的下载障碍,提高数据获取的稳定性和成功率。

语言
工具 / 包
是否自动处理跳转
说明
Python
requests
urllib
✅ 默认支持
可用 r.url 查看最终网址
R
httr::GET()
✅ 默认支持
res$url
 可查看跳转后链接
Bash
curl
wget
✅ 使用 -L 参数
curl -I
 可查看跳转路径
Stata
import delimited
❌ 不支持
推荐结合 shell curl -L 使用

Python 示例

import requests

url = "https://github.com/lianxhcn/data/blob/main/03-sales.csv?raw=true"
res = requests.get(url, allow_redirects=True)
print(res.url)  # 会跳转到 raw.githubusercontent.com 的真实地址

注意,填写  url 时,务必添加 ?raw=true 参数,否则跳转机制无法生效。

因此,采用如下写法会更好一些:

url_html = "https://github.com/lianxhcn/data/blob/main/03-sales.csv"
url = url_html + "?raw=true"
res = requests.get(url, allow_redirects=True)

有关 Python 中如何处理跳转的更多细节,可以参考 requests 文档。

R 示例

library(httr)

url_html "https://github.com/lianxhcn/data/blob/main/03-sales.csv"
url "?raw=true")
res

res$url  # 跳转后的真实地址

有关 R 中如何处理跳转的更多细节,可以参考 httr 文档 和 GET 文档。

Stata 示例

* 使用 curl 下载后再导入
local url_html "https://github.com/lianxhcn/data/blob/main/03-sales.csv"
local url "`url_html'?raw=true"
shell curl -L -o sales.csv "`url'"

import delimited using "sales.csv", clear // 导入 Stata 

此处,我们使用了 Stata 的  [D] shell 命令调用 DOS 命令 curl 来处理跳转。详情参见如下推文:

  • 严子凯, 2022, Stata-DOS:事半功倍的DOS命令汇总, 连享会 No.1047.
  • Will Matsuoka, 2016, Stata and cURL, Link
  • curl tutorial


5. 进阶阅读

对于希望深入了解网页跳转及其在数据抓取中的应用,以下是一些有价值的参考资料。

首先,理解 HTTP 状态码 是基础,常见的跳转状态码如 301(永久跳转)和 302(临时跳转)对网站行为影响深远。你可以在 MDN Web Docs 中找到详细的解释。

对于爬虫开发者,requests 和  curl 是最常用的工具,相关文档提供了如何使用它们来处理跳转。requests 的使用方法请参考 requests 文档,而 curl 的详细手册可以在 curl: Manual 找到。

此外,DOI 跳转机制在学术文献访问中非常重要,你可以通过 DOI.org 和 CrossRef 了解更多相关信息。

如果你遇到复杂的跳转链,如何跟踪每次跳转并获取最终 URL,Stack Overflow 上的 Redirect Loops 讨论提供了解决方案。

最后,学习如何解决验证码和动态内容等挑战,Scrapy 的 Documentation 是一个很好的资源,适合更复杂的爬虫任务。


6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh lianxh dos 爬, md nocat
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 严子凯, 2022, Stata-DOS:事半功倍的DOS命令汇总, 连享会 No.1047.
  • 修博文, 2024, 爬取政府工作报告文本-Python, 连享会 No.1354.
  • 初虹, 2022, Python爬虫1:小白系列之requests和json, 连享会 No.887.
  • 初虹, 2022, Python爬虫2:小白系列之requests和lxml, 连享会 No.888.
  • 吴浩然, 2024, 数据爬取:美国证监会EDGAR系统数据获取及Python实现, 连享会 No.1329.
  • 周豪波, 2020, Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化, 连享会 No.20.
  • 孙斯嘉, 2020, Python 调用 API 爬取百度 POI 数据, 连享会 No.60.
  • 左从江, 2020, Python: 批量爬取下载中国知网(CNKI) PDF论文, 连享会 No.54.
  • 李岸瑶, 2021, Stata爬虫:爬取地区宏观数据, 连享会 No.684.
  • 李岸瑶, 2021, Stata爬虫:爬取A股公司基本信息, 连享会 No.685.
  • 李青塬, 2022, Stata+Python:同花顺里爬取创历史新高的股票, 连享会 No.957.
  • 李青塬, 2022, Stata+Python:爬取创历史新高股票列表, 连享会 No.894.
  • 梁海, 2020, Python:爬取东方财富股吧评论进行情感分析, 连享会 No.440.
  • 游万海, 2020, Stata爬虫-正则表达式:爬取必胜客, 连享会 No.287.
  • 王文韬, 2020, Python爬虫: 《经济研究》研究热点和主题分析, 连享会 No.88.
  • 王颖, 2022, Python爬取静态网站:以历史天气为例, 连享会 No.921.
  • 王颖, 2022, Python:多进程、多线程及其爬虫应用, 连享会 No.935.
  • 王颖, 2022, Python:爬取动态网站, 连享会 No.932.
  • 秦利宾, 2020, Python:爬取上市公司公告-Wind-CSMAR, 连享会 No.131.
  • 秦利宾, 2021, Python:爬取巨潮网公告, 连享会 No.646.
  • 秦利宾, 许梦洁, 2021, Python+Stata:如何获取中国气象历史数据, 连享会 No.793.
  • 范思妤, 2023, Python:基于selenium爬取科创板审核问询, 连享会 No.1172.
  • 许梦洁, 2020, Python: 6 小时爬完上交所和深交所的年报问询函, 连享会 No.104.
  • 许梦洁, 2021, Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism, 连享会 No.744.
  • 许梦洁, 2021, Python爬虫:爬取华尔街日报的全部历史文章并翻译, 连享会 No.743.
  • 连享会, 2022, 连享会:助教入选通知-2022文本分析与爬虫, 连享会 No.908.
  • 陈卓然, 2023, Python:爬虫雅虎财经数据-selenium, 连享会 No.1306.
  • 陈波, 郑静怡, 江鑫, 2021, 在Stata里点首歌吧:imusic, 连享会 No.666.


🍓 课程推荐:连享会:2025暑期班·网络直播
嘉宾:连玉君 (初级+高级) || 张宏亮 (论文班)
时间:2025 年 8 月 4-14 日
咨询:王老师 18903405450(微信)

连享会微信小店上线啦!

Note:扫一扫进入“连享会微信小店”,你想学的课程在这里······

New! Stata 搜索神器:lianxh 和  songblGIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all


🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184014
 
13 次点击