Ответ на запрос 200, но файл все равно загружается как пустой. Пожалуйста, помогите решить эту задачу.
import requests
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
r = requests.get(link, stream=True, headers=HEADERS)
with open(output_filename, 'wb') as f:
f.write(r.content)
@DarkKnight тогда как это сделать
Вам нужно выяснить, где находятся PDF-файлы. Изучение HTML/JavaScript может помочь вам
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.
@ninja_haze_developer2484 Почему ты удалил ссылку?






На странице html есть форма. Вы можете отправить эту форму или получить ключ/закодированную строку и отправить запрос на pdf с новой ссылкой/url.
import requests
import re
from bs4 import BeautifulSoup as bs
url = "url1"
# get key from html page -> <form> -> <script> {encodedString = dfsfsdfs}</script>
with requests.Session() as session:
res = session.get(url)
soup = bs(res.text, 'html.parser')
form = soup.select_one('form#SummaryForm > script', string=re.compile('encodedString'))
key = re.findall(r"encodedString = '([^']*)'", form.text)[0]
# fid from url string
fid = re.findall(r'fundid=(\d+)', url)[0]
# For the download link, searched for xhr, by going to inspect devtools, -> Network tabs, and filter by fetch/xhr.
link = f'new_url_to_pdf?key = {key}&fid = {fid}'
output_filename = 'file.pdf'
r = requests.get(link)
with open(output_filename, 'wb') as f:
f.write(r.content)
Этому есть альтернатива — Selenium и Requests-html. Поскольку вам нужно очень меньше взаимодействия с браузером, вы можете попробовать запросы-html.
from requests_html import HTMLSession
url = 'url2'
script = """
window.addEventListener('load', function () {
iframe = document.selector('iframe:not([style* = "display: none"])')[0].click();
e = $.Event("keydown");
e.which = 83; // S
e.ctrlKey = true; // CTRL
$(document).trigger(e);
})
"""
session = HTMLSession()
res = session.get(url)
res.html.render(sleep=2, keep_page=True, script=script)
Он автоматически загрузит веб-драйвер при первом запуске кода. Таким образом, первый запуск может занять немного времени, следующий запуск будет быстрее.
Редактировать 2:requests-html не работает из-за наличия iframe
СПАСИБО @daniel за спасение!
как вы получаете данные ссылки
замените (\w+) на (.+) в key. изначально он показывал только буквенно-цифровое значение, я предполагал, что это так.
для ссылки для скачивания, искал xhr, зайдя в devtools, -> Сетевые краны, фильтровать по fetch/xhr. Там вы увидите что-то вроде pro?key=I9.... Нажмите на него и сбоку выберите Заголовки
Возможно, вам придется нажать F5 или Ctrl+R, если вы уже загрузили страницу.
как написать код, чтобы он работал для всех ссылок
на обоих вышеуказанных сайтах вы можете найти ссылку запроса, как я упоминал выше. для ссылки потребуется некоторый ключ, который вы можете найти в html или сценариях. Что касается кода, который будет работать на любом/каждом сайте, то его не существует. Каждый сайт создается по-своему. Таким образом, всегда будут некоторые различия, чтобы очистить их.
Можем ли мы написать некоторую логику на стороне html, чтобы автоматически получать эти ссылки. Просто спросите, я знаю, что ваши усилия достойны похвалы.
Я не понял, что вы имеете в виду, когда пишете логику на стороне html.
Используя requests+bs4, вам нужно будет получить url-of-pdf через xhr/fetch для каждого сайта (не для каждого URL). Но для ваших URL-адресов, поскольку сайты кажутся довольно похожими с кнопкой загрузки, вы можете использовать Selenium, который имеет функцию щелчка. Итак, вы пишете код для передачи URL-адреса и нажимаете кнопку с надписью «Загрузить», и все готово.
@DanielSabrel У меня не получилось с регулярным выражением ключа. Моя довольно грубая key = re.findall(r"encodedString = '([^']*)'?", form.text)[0]. Могу я дать совет, пожалуйста?
@ConstantinHong да, ты прав. Не проверял это.
res.html.render(sleep=2, keep_page=True, script=script) -> сбой на этом этапе
PDF-файл отображается на этой странице, но ваш URL-адрес не является прямой гиперссылкой на PDF-документ.