python - 剖析 Aaron Swartz 用来从 Jstor 文件中下载数千篇文章的脚本

标签 python python-2.7 web-scraping

Aaron Swartz 在早期塑造互联网方面发挥了重要作用。对于熟悉 Aaron 的人,你可能知道他在facing up to 35 years in prison之后自杀了用于从 jstor 下载大量文章的文件,学术期刊和书籍的数字图书馆。他用来下载文章的脚本已经发布,如下图所示。 (这里是 a link Aaron 为感兴趣的人准备的纪录片。)

keepgrabbing.py

这是代码:

import subprocess, urllib, random
class NoBlocks(Exception): pass
def getblocks():
    r = urllib.urlopen("http://{?REDACTED?}/grab").read()
    if '<html' in r.lower(): raise NoBlocks
    return r.split()


import sys
if len(sys.argv) > 1:
    prefix = ['--socks5', sys.argv[1]]
else:
    prefix = []#'-interface','eth0:1']
line = lambda x: ['curl'] + prefix + ['-H', "Cookie: TENACIOUS=" + str(random.random())[3:], '-o', 'pdfs/' + str(x) + '.pdf', "http://www.jstor.org/stable/pdfplus/" + str(x) + ".pdf?acceptTC=true"]


while 1:
    blocks = getblocks()
    for block in blocks:
        print block
        subprocess.Popen(line(block)).wait()

我猜这是某种致敬。亚伦的故事和他的逝世一直让我深受影响。他是互联网的杰出先驱,创立了知识共享、网络订阅格式 RSS 和 Reddit,所有这一切都发生在他 26 岁自杀之前。

我想尽可能多地了解导致一名男子死亡的事件 did many great things对于互联网及其不断增长的用户社区。

上下文

Jstor 是一个大型学术出版物图书馆。当 Aaron 在 2010 年从他们的文件中下载文章时,JSTOR 对麻省理工学院的学生免费提供,但不向公众免费提供。 虽然我们不知道 Aaron 究竟想用这些信息做什么,但可以肯定的是,他想把它传播给那些无法访问的人。

我的问题

我看到他创建了一个函数 Getblocks(),它使用 urllib 模块来访问 Jstor 的数字文件,将网页的 HTML 读入一个变量并将页面内容。

我看不懂的是代码的命令行部分,从他导入sys模块之后到if/else语句的结尾。

他创建了一个命令行参数,允许他定义..什么?他来这里做什么?

如果命令行参数的长度小于 1 并且调用了 else 条件,那么他的 lambda 函数在这里完成了什么?

if len(sys.argv) > 1:
    prefix = ['--socks5', sys.argv[1]]
else:
    prefix = []#'-interface','eth0:1']
line = lambda x: ['curl'] + prefix + ['-H', "Cookie: TENACIOUS=" + str(random.random())[3:], '-o', 'pdfs/' + str(x) + '.pdf', "http://www.jstor.org/stable/pdfplus/" + str(x) + ".pdf?acceptTC=true"]

如能深入了解 Aaron 的大文件攻城机制,我们将不胜感激。

安息吧,亚伦。

附加说明

案件相关法律文件可见here .在这些文档中,有一个链接指向 Aaron 下载所有文档后 Jstor 员工之间的几次对话。在 one email exchange ,一名 Jstor 员工描述了 Aaron 如何规避“按 IP 的 session ”规则进行下载。

“通过清除他们的 cookie 并开始新 session ,他们有效地避开了 Literatum 中的滥用工具...... 每个 IP 规则的 session 数没有触发,因为它是逐个服务器进行的,并且用户在多个服务器之间进行了负载平衡。 8500 个 session 只需要两台服务器即可规避规则。 我们可以降低 session 次数,但我请求数据以找到一个有效级别,该级别可以在不中断其他地方正常用户的情况下捕获事件使用我们的 MDC 和服务器数量,可能没有同时实现两者的最佳点。”

最佳答案

您对代码图像的转录缺少最后一行,这是非常关键的。在循环内部,它在 line lambda 函数的输出上调用 subprocess.Popen:

subprocess.Popen(line(block)).wait()

getblocks 函数从经过编辑的网站(可能不是 jstor)中读取,以获取要下载的 pdf 文件列表。这允许远程控制脚本。

line lambda 函数生成一个命令行参数列表,Popen 将使用这些参数来调用 curl 命令行实用程序,实际下载。在您的“补充说明”部分中引用的 cookie 是在 lambda 中生成的(它生成一个随机数,将其转换为字符串,然后将除前三个字符以外的所有字符切片以获得 cookie 值)。

关于python - 剖析 Aaron Swartz 用来从 Jstor 文件中下载数千篇文章的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711153/

相关文章:

python - 使用装饰器链在程序退出时注册类方法

python - 如何使用 Python 裁剪通过鼠标单击选择的区域?

python - Python 是否有 .pdbinit 文件(类似于 .gdbinit 文件)?

python - 使用python在cmd中传递变量

node.js - 如何从 Google Cloud Function(Cheerio、Node.js)发出多个 http 请求

python - 如何在 Tornado 路由中实现多个 URL 参数?

python - 同一文件的多个文件句柄

python - del self vs self.__del__() - 在 python 中清理的正确方法是什么?

python - Pandas 将多个数据帧转换为单个数据帧

python - 网页源代码的固有保存方式