注意:與可用于類似問題的其他 SO 答案(Selenium Webdriver:如何使用 Python 下載 PDF 檔案?)相比,這是一個非常不同的問題。
這是因為 URL:https://webice.ongc.co.in/pay_adv?TRACKNO=8262#不直接回傳 pdf 而是依次進行其他幾個呼叫,其中之一是回傳 pdf 檔案的 url。
我希望能夠使用查詢引數的變數呼叫 url,TRACKNO并能夠使用 python 保存 pdf 檔案。
我能夠使用 selenium 做到這一點,但是當瀏覽器在無頭模式下使用時我的代碼無法作業,我需要它在無頭模式下作業。我寫的代碼如下:
import requests
from urllib3.exceptions import InsecureRequestWarning
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
def extract_url(driver):
advice_requests = driver.execute_script("var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;")
print(advice_requests)
for request in advice_requests:
if(request.get('initiatorType',"") == 'object' and request.get('entryType',"") == 'resource'):
link_split = request['name'].split('-')
if(link_split[-1] == 'filedownload=X'):
print("..... Successful")
return request['name']
print("..... Failed")
def save_advice(advice_url,tracking_num):
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
response = requests.get(advice_url,verify=False)
with open(f'{tracking_num}.pdf', 'wb') as f:
f.write(response.content)
def get_payment_advice(tracking_nums):
options = webdriver.ChromeOptions()
# options.add_argument('headless') # DOES NOT WORK IN HEADLESS MODE SO COMMENTED OUT
driver = webdriver.Chrome(options=options)
for num in tracking_nums:
print(num,end=" ")
driver.get(f'https://webice.ongc.co.in/pay_adv?TRACKNO={num}#')
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'ls-highlight-domref')))
time.sleep(0.1)
advice_url = extract_url(driver)
save_advice(advice_url,num)
except:
pass
driver.quit()
get_payment_advice['8262']
可以看出,我在extract_url函式的第一行獲取了瀏覽器進行的所有網路呼叫,然后決議每個請求以找到正確的請求。但是,這不適用于headless mode
有沒有其他方法可以做到這一點,因為這似乎是一種解決方法?如果沒有,這可以修復以在無頭模式下作業嗎?
uj5u.com熱心網友回復:
我修復了它,我只更改了一個功能。正確的 url 位于驅動程式的給定 page_source 中(使用beatuifulsoup,您可以決議 html、xml 等):
from bs4 import BeautifulSoup
def extract_url(driver):
soup = BeautifulSoup(driver.page_source, "html.parser")
object_element = soup.find("object")
data = object_element.get("data")
return f"https://webice.ongc.co.in{data}"
可以從驅動程式中提取主機名部分。我想我沒有改變任何其他東西,但如果它不適合你,我可以粘貼完整的代碼。
舊答案:
如果您列印回傳頁面 ( print(driver.page_source))的文本,我想您會收到一條訊息,內容如下:“由于您的系統配置,無法加載 pdf”
這是因為所請求的站點會檢查一些偏好,以決定您是否是機器人。也許改變一些引數(螢屏大小、用戶代理)來解決這個問題會有所幫助。以下是有關如何檢測無頭瀏覽器的一些資訊。
下次您應該將所有相關代碼粘貼到問題(匯入)中,以便于測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351545.html
上一篇:總計第四列
