【问题标题】:How to submit on web page to download file using python如何在网页上提交以使用python下载文件
【发布时间】:2020-05-08 08:20:32
【问题描述】:

我查看了很多关于使用 python 在网页上单击按钮的建议,但不完全理解示例在做什么并且无法让它们工作(尤其是值的排序和组合) .

我正在尝试从网站下载 PDF。 第一次单击 PDF 进行下载时,它会将您带到一个页面,您必须单击“同意并继续”。一旦你这样做了,浏览器就会存储 cookie(所以你永远不需要再次同意),然后在浏览器中打开 PDF(这是我要下载的)。

这是接受页面的链接 - https://www.asx.com.au/asx/statistics/displayAnnouncement.do?display=pdf&idsId=02232753"

我使用 Chrome 开发者来获得这个:-

<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 表单的网页。我不确定它到底是什么,因为我是从我连接到(Pi)的服务器的命令行中执行此操作的。但我相信这不是我想要的 PDF。

作为最终解决方案,我希望 python 代码执行的是获取 PDF 链接,自动同意并继续,将 cookie 存储为 next 以避免将来的批准,然后下载 PDF。

希望这是有道理的,感谢您花时间阅读我的问题。

马库斯

【问题讨论】:

    标签: python web-scraping python-requests


    【解决方案1】:

    如果您想直接下载文件并且知道 URL,您可以在不使用 cookie 的情况下访问它:

    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,您可以从表单中读取它,然后直接访问它而无需 cookie:

    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)
    

    如果你想设置cookie:

    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)
    

    【讨论】:

    • 哇 Dan-Dev 一组很棒的答案,非常感谢。我对自己没有考虑从表单中提取 URL 并直接去那里感到失望。我想我认为如果不接受它就行不通。我也认为我需要更好地理解“请求”,从你的例子看来它几乎可以做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 2020-03-27
    • 2012-09-10
    • 2020-11-24
    • 2019-02-17
    • 2016-09-04
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多