Python Рекурсивно скачивать все PDF-файлы с веб-сайта - PullRequest
0 голосов
/ 20 июня 2020

Недавно я узнал, что вы можете использовать wget -r -P ./pdfs -A pdf http://example.com/ для рекурсивной загрузки pdf файлов с веб-сайта. Однако это не кроссплатформенность, поскольку Windows не имеет wget. Я хочу использовать Python, чтобы добиться того же. Единственные решения, которые я видел, являются нерекурсивными - например, { ссылка }

Я также хотел бы иметь возможность просто получать имена файлов без загрузки, чтобы я мог проверить, файл уже загружен.

В Python доступно так много инструментов. Какое здесь хорошее решение? Должен ли я использовать один из «основных» пакетов, например scrapy или selenium, или, может быть, просто requests? Какой из них наиболее подходит для этой задачи и как мне это реализовать?

1 Ответ

0 голосов
/ 22 июня 2020

Вы можете попробовать еще несколько способов, возможно, вы найдете подходящий именно вам. Вот пример.

Если это всего лишь одна загрузка, вы можете использовать следующие методы.

from simplified_scrapy import req, utils
res = req.get("http://example.com/xxx.pdf")
path = "./pdfs/xxx.pdf"
utils.saveResponseAsFile(res, path)

Если вам нужно сначала загрузить страницу, а затем извлечь ссылку PDF из страницу, вы можете использовать следующий метод。

import os, sys
from simplified_scrapy import Spider, SimplifiedDoc, SimplifiedMain, utils
class MySpider(Spider):
    name = 'download_pdf'
    start_urls = ["http://example.com/"] # Entry page

    def __init__(self):
        Spider.__init__(self, self.name)  #necessary
        if (not os.path.exists('./pdfs')):
            os.mkdir('./pdfs')

    def afterResponse(self, response, url, error=None, extra=None):
        try:
            path = './pdfs' + url[url.rindex('/'):]
            index = path.find('?')
            if index > 0: path = path[:index]
            flag = utils.saveResponseAsFile(response, path, fileType="pdf")
            if flag:
                return None
            else:  # If it's not a pdf, leave it to the frame
                return Spider.afterResponse(self, response, url, error)
        except Exception as err:
            print(err)

    def extract(self, url, html, models, modelNames):
        doc = SimplifiedDoc(html)
        lst = doc.selects('a').containsReg(".*.pdf", attr="href")
        for a in lst:
            a["url"] = utils.absoluteUrl(url.url, a["href"])
        return {"Urls": lst, "Data": None}


SimplifiedMain.startThread(MySpider())  # Start download
...