【问题标题】:Using "requests" (in ipython) to download pdf files使用“请求”(在 ipython 中)下载 pdf 文件
【发布时间】:2017-12-12 21:31:46
【问题描述】:

我想从http://imaging.occeweb.com/imaging/UIC1012_1075.aspx下载与“API#”值列表对应的所有 pdf 文档

到目前为止,我已成功发布“API#”请求,但不知道下一步该做什么。

import requests
headers = {'User-Agent': 'Mozilla/5.0'}
url = 'http://imaging.occeweb.com/imaging/UIC1012_1075.aspx'
API = '15335187'
payload = {'txtIndex7':'1','txtIndex2': API}
session = requests.Session()
res = session.post(url,headers=headers,data=payload)

【问题讨论】:

  • 看看res.content。该 URL 返回一个表单。您需要先弄清楚如何填写该表格(您将手动输入什么值?)。从那里开始构建一个 POST 请求来下载每个文件。
  • 使用lxmlBeautifulSoupres.content 解析它,然后您可以在HTML 中搜索标签并获取信息。
  • 这个页面似乎是使用 Microsoft DotNet 生成的,因此它发送了许多隐藏元素 - 例如 __VIEWSTATE - 您也必须发送这些元素。您可以在 Chrome/Firefox 中使用 DevTool 来查看从浏览器发送到服务器的所有标头/参数。

标签: python web-scraping web python-requests


【解决方案1】:

比这更复杂一些,您需要考虑一些额外的事件验证隐藏输入字段。为此,您首先需要获取页面,收集所有隐藏的值,设置 API 的值,然后使用 HTML 响应的以下 HTML 解析发出 POST 请求。

幸运的是,有一个名为MechanicalSoup 的工具可能有助于在您的表单提交请求中自动填充这些隐藏字段。这是一个完整的解决方案,包括用于解析结果表的示例代码:

import mechanicalsoup


url = 'http://imaging.occeweb.com/imaging/UIC1012_1075.aspx'
API = '15335187'
browser = mechanicalsoup.StatefulBrowser(
    user_agent='Mozilla/5.0'
)
browser.open(url)

# Fill-in the search form
browser.select_form('form#Form1')
browser["txtIndex2"] = API
browser.submit_selected("Button1")

# Display the results
for tr in browser.get_current_page().select('table#DataGrid1 tr'):
    print([td.get_text() for td in tr.find_all("td")])

【讨论】:

  • 谢谢@alecxe。很大的帮助!我仍然必须打开每个 pdf,然后在本地下载/保存它。我可以在循环中添加类似 >> file = open("document.pdf", 'w') >> file.write(td.read()) >> file.close() 的内容吗?
  • @JasonGr 是的,当然,您可以继续进一步自动化它,但这是另一个主题的故事。让我们解决这个问题,查看stackoverflow.com/help/someone-answers。谢谢。
  • 如果我必须严格,即使答案确实很有帮助,代码也不会输出pdf文件。而且我还不够熟练,无法弄清楚如何做到这一点。
【解决方案2】:
import mechanicalsoup
import urllib

url = 'http://imaging.occeweb.com/imaging/UIC1012_1075.aspx'
Form = '1012'
API = '15335187'
browser = mechanicalsoup.StatefulBrowser(
  user_agent='Mozilla/5.0'
)
browser.open(url)

# Fill-in the search form
browser.select_form('form#Form1')
browser["txtIndex7"] = Form
browser["txtIndex2"] = API
browser.submit_selected("Button1")

# Display the results
for tr in browser.get_current_page().select('table#DataGrid1 tr')[2:]:
  try:
    pdf_url = tr.select('td')[0].find('a').get('href')
  except:
    print('Pdf not found')
  else:
    pdf_id = tr.select('td')[0].text
    response = urllib.urlopen(pdf_url) # for python 2.7, for python 3. urllib.request.urlopen()
    pdf_str = "C:\\Data\\"+pdf_id+".pdf"
    file = open(pdf_str, 'wb')
    file.write(response.read())
    file.close()
    print('Pdf '+pdf_id+' saved')

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多