使用美丽汤或硒(Py)下载ASPX PDF链接

时间:2019-03-19 15:58:08

标签: python asp.net selenium web-scraping beautifulsoup

我要抓取的网站是这样的: http://www.imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx

它使用ASPX生成指向所需PDF的链接。

我试图适应的旧代码是:

import requests, sys, webbrowser, bs4, os

# v1 - this finds links but due to asp does not click through
print('Checking for Calendars')
res = requests.get('https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx')
res.raise_for_status

soup = bs4.BeautifulSoup(res.text, 'html.parser')

os.makedirs('Calendars', exist_ok=True)

for link in soup.findAll('a', href=True):
    if link.string == 'Misdemeanor':
        linkUrl = 'http:' + link.get('href')

        res = requests.get(linkUrl) # this line is in error because aspx
        #link in html d/n = link after click

        res.raise_for_status()

        pdfFile = open(os.path.join('Calendar', os.path.basename(linkUrl)), 'wb')
        for chunk in res.iter_content(100000):
            pdfFile.write(chunk)
        pdfFile.close

该代码在另一个站点上起作用,在该站点上,首页上的链接地址=链接地址,但在这里没有动态ASPX链接。

我当时在考虑使用KEYS右键单击每个链接,然后在新选项卡中打开并下载,但这似乎过多。 (而且我不确定如何在Selenium中管理多个选项卡。)

有没有一种方法可以简单地下载if循环中的每个链接?

我开始的另一种选择是:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx')

# using singular find_element, then click
# this gets one of the links, but not all
# per git, need to use find elements and loop through

#beneath gets 0 new tabs
linkElems = browser.find_elements_by_link_text('Misdemeanor')
totalLinks = len(linkElems)

for i in linkElems:
    i.send_keys(Keys.CONTROL + 't')

但是基本上我还是不确定如何单击并下载(或打开,下载,关闭)每个。

谢谢。

2 个答案:

答案 0 :(得分:1)

我敢打赌它之所以中断,并不是因为它是一个ASPX文件,而是因为它是一个相对路径。 如果这样做,它应该可以工作:

linkUrl = 'https://imperial.courts.ca.gov/CourtCalendars/Public/' + link.get('href')

答案 1 :(得分:1)

使用Chrome选项。

chromeOptions=webdriver.ChromeOptions()
prefs = {"plugins.always_open_pdf_externally": True}
chromeOptions.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get("https://imperial.courts.ca.gov/CourtCalendars/Public/MCalendars.aspx")

linkElems = driver.find_elements_by_link_text('Misdemeanor')

for i in linkElems:
    driver.get(i.get_attribute('href'))