我要抓取的网站是这样的: 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')
但是基本上我还是不确定如何单击并下载(或打开,下载,关闭)每个。
谢谢。
答案 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'))