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

 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以帮你解决这个问题。 首先,你需要安装selenium和chromedriver。你可以通过以下命令安装selenium: ``` pip install selenium ``` 然后,你需要下载对应浏览器版本的chromedriver,并将其添加到系统环境变量中。 接下来,你可以使用以下代码爬取https://data.eastmoney.com/xg/xg/?mkt=kzz页面信息: ```python from selenium import webdriver # 创建Chrome浏览器对象 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') # 无头模式,不显示浏览器窗口 browser = webdriver.Chrome(chrome_options=chrome_options) # 打开页面 browser.get('https://data.eastmoney.com/xg/xg/?mkt=kzz') # 获取页面源代码 html = browser.page_source # 关闭浏览器 browser.quit() print(html) ``` 这段代码将使用Chrome浏览器访问https://data.eastmoney.com/xg/xg/?mkt=kzz页面,并获取页面源代码。你可以在代码中添加其他操作,比如查找特定元素、点击按钮等。 ### 回答2: 使用Selenium库可以实现对https://data.eastmoney.com/xg/xg/?mkt=kzz页面的爬取。 首先,我们需要安装并导入selenium库,并且也需要安装浏览器驱动程序,例如Chrome驱动程序。 接下来,我们可以通过实例化一个浏览器对象驱动程序,打开该页面。 ```python from selenium import webdriver # 使用chrome驱动程序 driver = webdriver.Chrome() # 打开页面 driver.get("https://data.eastmoney.com/xg/xg/?mkt=kzz") ``` 爬取页面信息时,可以使用xpath或者css选择器来定位元素,并提取相应的信息。 ```python # 使用xpath选择器 title = driver.find_element_by_xpath("//h1").text print(title) # 使用css选择器 content = driver.find_element_by_css_selector(".content").text print(content) ``` 以上代码演示了如何获取页面中的标题和内容,并打印输出。 最后,别忘记关闭浏览器对象。 ```python # 关闭浏览器对象 driver.quit() ``` 这样就完成了对https://data.eastmoney.com/xg/xg/?mkt=kzz页面信息的爬取。 ### 回答3: 使用Selenium爬取https://data.eastmoney.com/xg/xg/?mkt=kzz页面信息,可以按照以下步骤进行操作: 1. 导入Selenium库和相关模块: ``` from selenium import webdriver from selenium.webdriver.chrome.options import Options ``` 2. 设置Chrome浏览器的选项: ``` chrome_options = Options() chrome_options.add_argument('--headless') # 无头模式,不显示浏览器界面 chrome_options.add_argument('--disable-gpu') # 禁用GPU加速 ``` 3. 创建Chrome浏览器对象: ``` driver = webdriver.Chrome(chrome_options=chrome_options) ``` 4. 打开目标页面: ``` url = 'https://data.eastmoney.com/xg/xg/?mkt=kzz' driver.get(url) ``` 5. 获取页面中需要的信息: ``` # 例如获取页面标题 title = driver.title print(title) # 例如获取页面中的内容 content = driver.find_element_by_xpath('//div[@class="content"]') print(content.text) ``` 6. 关闭浏览器对象: ``` driver.quit() ``` 通过以上步骤,就可以使用Selenium自动打开指定页面,获取页面中的信息。在实际应用中,还可以根据页面的DOM结构和需要获取的具体信息,使用Selenium提供的定位元素方法(如xpath、id、class等)来获取指定元素的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值