Как отправить на веб-страницу для загрузки файла, используя python - PullRequest
0 голосов
/ 08 мая 2020

Я просмотрел довольно много предложений по нажатию на кнопки на веб-страницах, используя python, но не совсем понимаю, что делают примеры, и не могу заставить их работать (особенно порядок и комбинация значения).

Я пытаюсь загрузить PDF-файл с веб-сайта. Когда вы в первый раз щелкаете PDF-файл, чтобы загрузить его, вы попадаете на страницу, где вам нужно нажать «Принять и продолжить». Как только вы это сделаете, браузер сохранит файл Cook ie (так что вам больше не придется соглашаться), а затем откроет PDF-файл в браузере (это то, что я хочу загрузить).

Вот ссылка на страница принятия - https://www.asx.com.au/asx/statistics/displayAnnouncement.do?display=pdf&idsId=02232753 "

Я использовал Chrome Developer, чтобы получить это: -

<form name="showAnnouncementPDFForm" method="post" action="announcementTerms.do"> <input value="Decline" onclick="window.close();return false;" type="submit"> <input value="Agree and proceed" type="submit"> <input name="pdfURL" value="/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf" type="hidden"> </form>

и это это последняя страница, на которую вы попадете: - "https://www.asx.com.au/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf"

затем попытался использовать это следующим образом: -

import requests
values = {}
values['showAnnouncementRDFForm'] = 'announcementTerms.do'
values['pdfURL'] = '/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf'
req = requests.post('https://asx.com.au/', data=values)
print(req.text)

Я пробовал разные URL-адреса и изменил те значения, которые я предоставляю, но я не думаю, что это работает правильно. Печать в конце дает мне то, что выглядит как HTML в виде веб-страницы. Я не совсем уверен, что это такое, поскольку я выполняя это из командной строки сервера, я sh в (Пи). Но я уверен, что это не тот PDF-файл, который мне нужен.

В качестве окончательного решения я бы Например, код python, чтобы сделать, это взять ссылку PDF, автоматически принять и продолжить, сохранить повар ie рядом, чтобы избежать будущих одобрений, а затем загрузить PDF.

Надеюсь, Это имело смысл, и спасибо, что нашли время прочитать мой вопрос.

Маркус

1 Ответ

2 голосов
/ 09 мая 2020

Если вы хотите загрузить файл напрямую и знаете URL-адрес, вы можете получить к нему доступ, не используя повара. ie:

import requests
response = requests.get("https://www.asx.com.au/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf")
with open('./test1.pdf', 'wb') as f:
    f.write(response.content)

Если вы не знаете URL-адрес, вы можете прочитать его форма, затем обращайтесь к ней напрямую без повара ie:

import requests
from bs4 import BeautifulSoup
base_url = "https://www.asx.com.au"
response = requests.get(f"{base_url}/asx/statistics/displayAnnouncement.do?display=pdf&idsId=02232753")
soup = BeautifulSoup(response.text, 'html.parser')
pdf_url = soup.find('input', {'name': 'pdfURL'}).get('value')
response = requests.get(f'{base_url}{pdf_url}')
with open('./test2.pdf', 'wb') as f:
    f.write(response.content)

, если вы хотите установить повара ie:

import requests
cookies = {'companntc': 'tc'}
response = requests.get("https://www.asx.com.au/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf", cookies=cookies)
with open('./test3.pdf', 'wb') as f:
    f.write(response.content)

Если вы действительно хотите использовать POST:

import requests   
payload = {'pdfURL': '/asxpdf/20200506/pdf/44hlvnb8k3n3f8.pdf'}
response = requests.post('https://www.asx.com.au/asx/statistics/announcementTerms.do', params=payload)
with open('./test4.pdf', 'wb') as f:
    f.write(response.content)

Или прочтите pdfURL из формы и сделайте POST:

import requests
from bs4 import BeautifulSoup
base_url = "https://www.asx.com.au"
response = requests.get(f"{base_url}/asx/statistics/displayAnnouncement.do?display=pdf&idsId=02232753")
soup = BeautifulSoup(response.text, 'html.parser')
pdf_url = soup.find('input', {'name': 'pdfURL'}).get('value')
payload = {'pdfURL': pdf_url}
response = requests.post(f"{base_url}/asx/statistics/announcementTerms.do", params=payload)
with open('./test5.pdf', 'wb') as f:
    f.write(response.content)
...