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()'))