Вы можете попробовать еще несколько способов, возможно, вы найдете подходящий именно вам. Вот пример.
Если это всего лишь одна загрузка, вы можете использовать следующие методы.
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