学生科研项目用代理,怎么做才规矩
为论文或课程作业收集网页数据?什么时候才需要代理,怎么保持礼貌、不越规矩,以及怎么把花费控制在很小的范围。
很多第一次买代理的人是手上有数据集要建的学生:为经济学论文比较各国价格,为语言学语料库收集公开帖子,为劳动力市场研究抓取招聘广告。学术研究在我们可接受使用政策的允许清单上,我们也乐意支持。但它也带着业余爬虫没有的义务,在导师或答辩老师问起之前把这些做对,是值得的。
你到底需不需要代理?
很多时候不需要。先不用代理试试。代理在科研项目里站得住,通常是因为以下几个具体原因:
- 学校网络被封了。 校园流量从少数几个地址出去,由成千上万的人共用。一个网站限制了某位同学的爬虫,最后可能连整个图书馆都一起被限制。
- 位置本身就是研究方法的一部分。 如果你要比较一个网站在不同国家显示的内容,你就需要在每个国家都有出口。我们的数据中心和 ISP 线路可以选国家、地区和城市;我们的住宅线路不提供国家选择。
- 网站对主机商网络和家庭网络区别对待。 那你就需要知道这一点,并在方法部分写明,因为它会影响你收集到的数据。
如果以上都不适用,在自己的网络上跑一个礼貌的爬虫更简单、更便宜,也更容易解释。
收集之前先问
- 你的导师,以及伦理审查流程。 很多大学要求,凡是涉及他人数据的研究都要经过伦理审查,即使数据是公开的。早点问;审批来得晚,可能让你耽误一个学期。
- 个人数据。 姓名、用户名、照片以及任何能识别出某个人的信息,在 GDPR 这类法律下都可能算个人数据,公开与否都一样。只收集研究问题需要的部分,并规划好怎么存储、假名化以及最终删除。
- 网站的条款。 读一读。有的明确禁止自动化访问;有的允许用于研究;有的提供 API 或数据导出,让抓取变得没有必要。
- 针对个人的画像。 为某个普通人建立画像,不管目的是什么,在我们的政策下都是禁止的。研究很多人的总体问题,是另一类研究。
robots.txt、频率和身份
robots.txt 是网站自己声明的:自动化客户端可以抓什么、多久抓一次。它不是法律,但在科研项目里无视它,很难为自己辩护。Python 可以替你读它:
import time
import urllib.robotparser
import requests
AGENT = "thesis-crawler ([email protected])"
PROXY = "http://USERNAME:PASSWORD@HOST:PORT"
PROXIES = {"http": PROXY, "https": PROXY}
robots = urllib.robotparser.RobotFileParser("https://www.example.org/robots.txt")
robots.read()
delay = robots.crawl_delay(AGENT) or 5
def polite_get(url, attempts=3):
if not robots.can_fetch(AGENT, url):
return None
for _ in range(attempts):
r = requests.get(url, headers={"User-Agent": AGENT}, proxies=PROXIES, timeout=30)
time.sleep(delay)
if r.status_code not in (429, 503):
return r
wait = r.headers.get("Retry-After", "")
time.sleep(int(wait) if wait.isdigit() else delay * 10)
return None
配套的几个习惯:
- 一次只发一个请求,除非你有理由加快。论文的截止时间很少是按分钟算的。
- 说明你是谁。 在 User-Agent 里留一个联系地址,网站管理员就可以给你发邮件,而不是直接封你。对科研来说,即使你为了位置用了代理,让别人找得到你通常也是合乎伦理的选择。
- 被要求时就退让。 429 或 503 是网站在告诉你慢一点。上面的代码会等待;别用更多 IP 去绕过它。
为方法部分留好记录
把每条请求都记下来:URL、时间、状态码,以及用的是哪个出口国家。写论文时,你就能准确说明收集了什么、什么时候、从哪里收集的,别人也能重复你的做法。这份记录也能向导师证明,你一直待在自己承诺的范围之内。
把花费控制住
- 下单之前先估算流量。按 GB 计费怎么算钱里有公式和脚本。
- 做位置研究的话,每个国家一个静态 IP,往往就够了;选哪一种见ISP 还是数据中心。
- 你的余额不会过期,所以预实验剩下的部分,正式收集时还在。如果项目提前结束,没用完的部分可以按我们的退款政策原路退回你付款的那张卡或那个加密货币钱包。