如何刮取受密码保护的ASPX(PDF)页面

时间:2019-08-09 23:54:39

标签: python asp.net pdf web-scraping download

我正试图从代理商的网络服务中获取有关乐队即将举行的演出的数据(例如场地容量,场地地址,设置的长度,设置的开始时间...)。

使用Python 3.6和Selenium,我已经成功登录该站点,从主页上抓取了一些数据,并打开了交易单,该交易单是类似PDF的ASPX页面。我无法从那里刮下交易单。我已经成功将Selenium驱动程序切换到了交易单。但是当我检查该页面时,没有任何内容,只有一个JavaScript脚本列表。

我尝试过...

innerHTML = driver.execute_script("return document.body.innerHTML") 

...但是这会产生相同的脚本列表,而不是我在浏览器中看到的PDF内容。

我已经尝试过建议的解决方案:Python scraping pdf from URL

但是解决方案返回的HTML用于登录页面,而不是交易单。我的问题有所不同,因为PDF受密码保护。

2 个答案:

答案 0 :(得分:1)

您将无法使用PDF来读取Selenium Python API bindings文件,解决方法是:

  1. 使用requests库从网页下载文件。鉴于您需要登录,我的期望是您可能需要通过cookies命令从浏览器会话中获取driver.get_cookies()并将其添加到将下载PDF文件的请求中
  2. 下载文件后,您将可以使用PyPDF2
  3. 来读取其内容。

答案 1 :(得分:0)

此三部分解决方案对我有用:

第1部分(获取受密码保护的PDF的网址)

# with selenium
driver.find_element_by_xpath('xpath To The PDF Link').click()

# wait for the new window to load
sleep(6)

# switch to the new window that just popped up
driver.switch_to.window(driver.window_handles[1])

# get the URL to the PDF
plugin = driver.find_element_by_css_selector("#plugin")        
url = plugin.get_attribute("src")    

页面上带有url的元素可能有所不同。 Michael Kennedy还建议#embed和#content。

第2部分(使用python请求创建持久会话,如此处所述:How to "log in" to a website using Python's Requests module?。并下载PDF。)

# Fill in your details here to be posted to the login form.
# Your parameter names are probably different. You can find them by inspecting the login page.
payload = {
    'logOnCode': username,
    'passWord': password
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as session:
    session.post(logonURL, data=payload)

    # An authorized request.
    f = session.get(url) # this is the protected url
    open('c:/yourFilename.pdf', 'wb').write(f.content)

第3部分(按照PyPDF2的建议,用Dmitri T刮擦PDF)