亚伦·斯沃茨(Aaron Swartz)在早期塑造互联网的过程中发挥了重要作用。对于熟悉Aaron的人来说,您可能知道他是在facing up to 35 years in prison之后自杀的,因为他从jstor的文件馆(学术期刊和书籍的数字图书馆)中下载了大量文章。他用来下载文章的脚本已发布,如下图所示。 (这是对感兴趣的人的a link Aaron的纪录片。)
这是代码:
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()
我想这是一种致敬。我一直深受亚伦的故事和逝世的影响。他是互联网的杰出先驱,创立了创意共享空间,Web提要格式RSS和Reddit,所有这些都是他自己26岁之前的生活。
我想尽我所能了解这次事件,该事件导致一名为互联网及其不断发展的用户社区did many great things死亡的人死亡。
上下文
Jstor是一个大型学术出版物图书馆。当Aaron在2010年从他们的文件库中下载文章时,麻省理工学院的学生可以免费使用JSTOR,但公众则不能免费使用。
虽然我们不确切知道亚伦想对这些信息做些什么,但这是一个安全的赌注,他想将其传播给那些无法访问的人。
我的问题
我看到他创建了一个函数
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中找到。在这些文档中,有一个链接指向亚伦下载所有文档后Jstor员工之间的几次对话。 Jstor员工在one email exchange中描述了亚伦如何规避了“IP session ”规则的下载。
“通过清除cookie并开始新的 session ,他们有效地避开了Literatum中的滥用工具...。
每个IP规则的 session 数未触发,因为它是基于服务器的,并且用户在多台服务器之间实现了负载均衡。 8500个 session 只需要两台服务器即可规避规则。
我们可以减少 session 的数量,但要求数据找到可以捕获事件的有效级别,而又不会干扰其他地方的普通用户。有了我们的MDC和服务器数量,可能无法同时实现这两个目标。
最佳答案
您对代码镜像的转录缺少最后一行,这很关键。在循环内部,它在subprocess.Popen
lambda函数的输出上调用line
:
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/