Python请求 - 下载剪短

时间:2017-02-04 04:12:21

标签: python python-3.x download web-scraping python-requests

我最近一直在尝试使用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))

0 个答案:

没有答案