我最近一直在尝试使用Python抓取包含pdf化学考试的网站。我使用了python的请求,一切进展顺利,直到一些下载缩小到非常小的大小,即2KB。但是有什么好奇的 - 它完全随机发生,每次运行的文件都是不同的。我现在已经摸不着头脑了,决定在这里问问。手动下载它们可能现在已证明更快,但我想知道为什么脚本不能正常工作,以备将来参考。
我已经将脚本编写为异步,因此我想到我可以使用DoSing服务器。但是,我已经用同步for循环替换了每个Pool,甚至在这里和那里添加time.sleep() - 它没有帮助。使用这种方法,没有一个文件被完全下载 - 实际上每个文件都以2KB停止。
请原谅我,如果问题是天真的,或者我的错误是愚蠢的,因为我只是一个业余爱好程序员。我会感激任何帮助。
P.S。我已经使用Chrome中的Postman拦截了标题,但没有它们的回复是500,但我不会包含它们,因为它们包含会话ID,可以让您登录我的帐户。
脚本如下:
from shutil import copyfileobj
from multiprocessing.dummy import Pool as ThreadPool
from requests import get
from time import sleep
titles = {
"95": "Budowa atomu. Układ okresowy pierwiastków chemicznych",
"96": "Wiązania chemiczne",
"97": "Systematyka związków nieorganicznych",
"98": "Stechiometria",
"99": "Reakcje utleniania-redukcji. Elektrochemia",
"100": "Roztwory",
"101": "Kinetyka chemiczna",
"102": "Reakcje w wodnych roztworach elektrolitów",
"103": "Charakterystyka pierwiastków i związków chemicznych",
"104": "Chemia organiczna jako chemia związków węgla",
"105": "Węglowodory",
"106": "Jednofunkcyjne pochodne węglowodorów",
"107": "Wielofunkcyjne pochodne węglowodorów",
"108": "Arkusz maturalny"
}
#collection = {"120235": "Chemia nieorganiczna", "120586": "Chemia organiczna"}
url = "https://e-testy.terazmatura.pl/print/%s/quiz_%s/%s"
def downloadTest(id):
with ThreadPool(2) as tp:
tp.starmap(downloadActualTest, [(id, "blank"), (id, "key")])
def downloadActualTest(id, dataType):
name = titles[str(id)]
if id in range(95, 104):
collectionId = 120235
else:
collectionId = 120586
if dataType == "blank":
with open("Pulled Data/%s - pusty.pdf" % name, "wb") as test:
print("Downloading: " + url % (collectionId, id, "blank") + '\n')
r = get(url % (collectionId, id, "blank"),
stream=True,
headers=headers)
r.raw.decode_content = True
copyfileobj(r.raw, test)
elif dataType == "key":
with open("Pulled Data/%s - klucz.pdf" % name, "wb") as test:
print("Downloading: " + url % (collectionId, id, "key") + '\n')
r = get(url % (collectionId, id, "key"),
stream=True,
headers=headers)
r.raw.decode_content = True
copyfileobj(r.raw, test)
with ThreadPool(3) as p:
p.map(downloadTest, range(95, 109))