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 pdnum = 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 = 0page2 = 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()continuetry:# 进入到包含每一章所有数据的iframe标签中browser.switch_to_frame('ICDMainframe')# 获取页面内容page2 = browser.page_sourceprint(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['诊断编码'] = mesmessage['诊断名称'] = namesmes1 = []for i in mes:mes1.append(i.strip())message = {}message['诊断编码'] = mesmessage['诊断名称'] = namesdf = pd.DataFrame(message, columns = ['诊断编码', '诊断名称'])df.to_excel('第{}章.xlsx'.format(num))browser.close()print('第{}章数据爬取成功'.format(num))breaknum += 1time.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()'))