簡體   English   中英

Scrape網頁未進行Ajax調用,但數據不在DOM中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM