[英]Scrape webpage no ajax calls made but data not in DOM
我正在練習從網站抓取數據。 例如, ZocDoc 。 我正在嘗試獲取所有保險提供者及其計划的列表(您可以在保險下拉列表的主頁上訪問此信息)。
看來頁面加載時所有數據都是通過<scipt>
標記加載的。 在“網絡”標簽中查看時,似乎沒有任何網絡調用返回JSON,包括計划名稱。 我可以使用以下所有保險計划(雖然很雜亂,但是可以使用)。
import requests
from bs4 import BeautifulSoup as bs
resp = requests.get('https://zocdoc.com')
long_str = str(soup.findAll('script')[17].string)
pop = data.split("Popular Insurances")[1]
json.loads(pop[pop.find("[["):pop.find("]]")+2])
在返回的HTML中沒有保險計划。 我也沒有在計划發回的“網絡”選項卡中看到任何請求(有一些主干文件)。 一個URL看起來已經編碼了,但是我不確定就是這樣,而我只是在想這個URL 。
我也嘗試過等待所有JS加載,以便使用dryscrape將數據保存在DOM中,但HTML中仍然沒有任何計划。
有沒有一種方法可以讓爬蟲無需單擊每個保險提供者來獲取其計划就可以收集此信息?
是的,保險清單深藏在script
標記內:
insuranceModel = new gs.CarrierGroupedSelect(gs.CarrierGroupedSelect.prototype.parse({
...
primary_options: {
name: "Popular Insurances",
group: "primary",
options: [[300,"Aetna",2,0,1,0],[304,"Blue Cross Blue Shield",2,1,1,0],[307,"Cigna",2,0,1,0],[369,"Coventry Health Care",2,0,1,0],[358,"Medicaid",2,0,1,0],[322,"UniCare",2,0,1,0],[323,"UnitedHealthcare",2,0,1,0]]
},
secondary_options: {
name: "All Insurances",
group: "secondary",
options: [[440,"1199SEIU",2,0,1,0],[876,"20/20 Eyecare Plan",2,0,1,1],...]
}
...
當然,你可以的,深入的JavaScript代碼奇妙世界在Python或者使用正則表達式或如Javascript解析器解析slimit
( 例如這里 ),而這可能導致到頭上頭發少。 另外,結果解決方案將非常脆弱。
在這種特殊情況下,我認為selenium
更合適 。 完整的工作示例-獲得受歡迎的保險:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.maximize_window()
wait = WebDriverWait(driver, 10)
insurance_dropdown = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "I'll choose my insurance later")))
insurance_dropdown.click()
for option in driver.find_elements_by_css_selector("[data-group=primary] + .ui-gs-option-set > .ui-gs-option"):
print(option.get_attribute("data-value"))
driver.close()
打印:
Aetna
Blue Cross Blue Shield
Cigna
Coventry Health Care
Medicaid
UniCare
UnitedHealthcare
請注意,在這種情況下,將使用無頭PhantomJS
瀏覽器,但是您可以使用Chrome或Firefox或硒具有可用驅動程序的其他瀏覽器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.