基于selenium爬取带有iframe/frame标签的网站数据

您所在的位置:网站首页 frame表单 基于selenium爬取带有iframe/frame标签的网站数据

基于selenium爬取带有iframe/frame标签的网站数据

2023-10-17 21:45| 来源: 网络整理| 查看: 265

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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3