基於selenium爬取帶有iframe/frame標籤的網站數據

URL: http://code.nhsa.gov.cn:8000/search.html?sysflag=80

如圖所示, 將左邊每一章的數據都爬取下來

網站結構特點:該網站有個特點, 點一下左邊的章節,這一章的所有數據都會在右邊展現出來,所以這個網站有兩iframe標籤嵌套組成,一個是最大的包含的所有章節以及包含存儲每一張數據的小的iframe標籤, 一個是右邊根據點擊的章節包含該章節的所有數據的被嵌套在iframe標籤

如圖:

網站結構大體總結爲:

所以要想獲取每一章數據所有, 就需要先進入最大的iframe標籤中去依次點擊每一章, 點擊一章之後再進入包含每一章所有數據的iframe標籤中去獲取每一章所有數據, 接着重複此操縱座進行下一章(注意:因爲該網站是iframe嵌套, 所以xpath helper工具會失效, 但是xpath依然有效, 所以xpath helper工具定位不到數據, 並不是真的定位不到)

 

 

# import requests
import re
from lxml import html
from lxml import etree
import time

"""
//*[@id="treeDemo1"]/li/ul/li
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
import re
import pandas as pd


num = 1
# 總共23章
while num < 23:

    url = "http://code.nhsa.gov.cn:8000/search.html?sysflag=80"
    # url = 'http://code.nhsa.gov.cn:8000/jbzd/public/dataOperationSearch.html?batchNumber='
    try:
        # 打開頁面
        browser = webdriver.Chrome()
        browser.get(url)
    except:
        # 頁面打開不了就刷新
        browser.refresh()
    page1 = 0
    page2 = 0
    # browser.find_element_by_xpath('//*[@id="dataContent"]/div/div/div[1]/div/label[2]').click()

    try:
        # 進入到最大的iframe標籤
        browser.switch_to_frame('dataInfo')
        page1 = browser.page_source
        # print(page1)
        # print(re.findall(r'操作和介入不能分類於他處', page1))
        # 因爲網頁反應較慢, 所以停50秒, 讓它反應一下
        time.sleep(50)
        # 點擊每一章
        click1 = browser.find_element(By.ID, 'treeDemo1_{}_a'.format(num))  # //*[@id="treeDemo1_2_a"]
        click1.click()
        time.sleep(5)
    except Exception as e:
        print(e)
        print(f'手術第{num}章數據爬取失敗, 重新爬取第{num}章')
        browser.close()
        continue


    try:
        # 進入到包含每一章所有數據的iframe標籤中
        browser.switch_to_frame('ICDMainframe')
        # 獲取頁面內容
        page2 = browser.page_source
        print(page2)
        # print(page2)
        # print(re.findall(r'其他治療性超聲', page2))

    except Exception as e:
        print(e)
        print('手術第{}章數據爬取失敗, 重新爬取第{}章數據'.format(num, num))
        browser.close()
        continue


    # print(page2)
    # print(re.findall(r'舌尖及側緣的惡性腫瘤', page2), '2-1')
    # 用xpath對頁面進行解析
    html = etree.HTML(page2)
    # mes = html.xpath('//*[@id="11764a92-7938-11e9-9611-8cec4bd010f3"]/div/a/text()')
    # 定位數據
    mes = html.xpath('//*[@id="classicont"]/div//a/text()')
    # names = html.xpath('//*[@id="11764a92-7938-11e9-9611-8cec4bd010f3"]/div/span/text()')
    names = html.xpath('//*[@id="classicont"]/div//span/text()')
    print(mes)
    print(names)
    message = {}

    message['診斷編碼'] = mes
    message['診斷名稱'] = names

    mes1 = []
    for i in mes:
        mes1.append(i.strip())

    message = {}

    message['診斷編碼'] = mes
    message['診斷名稱'] = names

    df = pd.DataFrame(message, columns = ['診斷編碼', '診斷名稱'])
    df.to_excel('第{}章.xlsx'.format(num))
    browser.close()
    print('第{}章數據爬取成功'.format(num))
    break
    num += 1
    time.sleep(10)




# url = 'http://code.nhsa.gov.cn:8000/jbzd/public/dataOperationSearch.html?batchNumber='
# browser = webdriver.Chrome()
# browser.get(url)
# page = browser.page_source
# # print(page)
# html = etree.HTML(page)
# print(html.xpath('//*[@id="treeDemo1"]/li[1]/ul/li//span[2]/text()'))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章