背景

最近有一个项目需要使用爬虫从某网站抓取全国的医院名称,等级,地址等信息

爬取的url为https://some/website/that/i/can/tell/you/sorry

用浏览器打开这个url会发现,切换不同的省市需要点击左上角的下拉框进行选择

问题

通常遇到这种下拉框页面,我们第一时间想到使用Selenium框架的Select类,这个类是Selenium框架专门用于处理页面下拉框的,使用方式如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Selectdriver=webdriver.Chrome() #初始化浏览器驱动url='https://some/website/that/i/can/tell/you/sorry'#页面url
driver.get(url)#访问相对应链接
windows_start=driver.window_handles[0] #文档列表窗口名#定位省市
ele=driver.find_element(By.XPATH,'//*[@id="Prov"]')
select_ele = Select(ele)
select_ele.select_by_visible_text("北京市")
time.sleep(1)#输入医院名称
driver.find_element(By.XPATH,'//*[@id="Unit_Name"]').send_keys('协和医院')

但是Select类只能用于下拉框实现方式是基于html的select标签的情况,针对本项目,打开页面源码发现

该页面的下拉框使用的是input标签!!!!

不慌!

既然不能用Select类一步到位,那我们就老老实实的模拟鼠标点击等操作来实现爬取页面过程的省市切换,找到Xpath,调用click()方法,简直不要太简单,呵呵呵

但是:

报错信息no such element,意思是说找不到这个元素

经过不断的排查发现这么一个现象:

第一次打开的时候下拉框的Xpath:

//*[@id="cascader-menu-7056-0-0"]/span/div

第二次打开的时候下拉框的Xpath:

//*[@id="cascader-menu-3644-0-0"]/span/div

下拉框的Xpath每次打开页面是变化着的,也就是说开发这个页面的前端工程师还是做了一点反爬措施的,每次点开页面以后下拉框的id可能是随机生成的,这可如何是好?

不慌!

解决思路

既然每次打开页面的时候Xpath是变化着的,主要是Xpath中间有个四位数的随机数

第一次打开的时候下拉框的Xpath:

//*[@id="cascader-menu-7056-0-0"]/span/div

第二次打开的时候下拉框的Xpath:

//*[@id="cascader-menu-3644-0-0"]/span/div

我们不去管随机数,只关心当前页面,想办法拿到当前页面的源码,再从中解析出下拉框的Xpath,在模

拟点击,则问题就迎刃而解!

基于这个思路,我们不必关心每次生成的随机数具体是什么,早知道它是四位数,而且前面为//*[@id="cascader-menu-,后面为-0-0"]/span/div,那么使用正则表达式来解析简直不要太简单!

正则表达式如下:

#获取随机的ID
bs = BeautifulSoup(driver.page_source, "html.parser") #解析页面源码
xpath_id = re.findall(r'cascader-menu-[0-9]+-[0-9].*city-select-component-span',driver.page_source)[0]
xpath_id = re.findall(r'cascader-menu-[0-9]+-[0-9]+', xpath_id)[0]xpath_id = re.findall(r'\d+', xpath_id)[0]

完整代码

def change_province(driver, province_id):"""点击下拉框切换特定省市"""#点击下拉框driver.find_element(By.XPATH,'//*[@id="app_main"]/div/form/div[1]/div/div/div/input').click()time.sleep(1)#获取随机的IDbs = BeautifulSoup(driver.page_source, "html.parser")xpath_id = re.findall(r'cascader-menu-[0-9]+-[0-9].*city-select-component-span',driver.page_source)[0]xpath_id = re.findall(r'cascader-menu-[0-9]+-[0-9]+', xpath_id)[0]xpath_id = re.findall(r'\d+', xpath_id)[0]#     点击切换固定id的省市driver.find_element(By.XPATH, '//*[@id="cascader-menu-{0}-0-{1}"]/span/div'.format(xpath_id, province_id)).click()time.sleep(np.random.randint(1, 3))def next_page(driver):"""点击切换下一页"""driver.find_element(By.XPATH,'//*[@id="app_main"]/div/div[2]/div/button[2]/i').click()time.sleep(np.random.randint(1,3))def get_info(driver):"""解析信息"""info_list=[]for i in range(1,11):try:info=driver.find_element(By.XPATH,'//*[@id="app_main"]/div/section/div[2]/div[3]/table/tbody/tr[{}]'.format(i)).text info=info.split('\n')info_list.append(info)except Exception as e:breakreturn info_listdriver=webdriver.Chrome()
ocr = ddddocr.DdddOcr()url='https://some/website/that/i/can/tell/you/sorry'#打开url
driver.get(url)#访问相对应链接
windows_start=driver.window_handles[0] #文档列表窗口名for province_id in range(0,32):change_province(driver,province_id) #顺序切换省市max_page=driver.find_element(By.XPATH,'//*[@id="app_main"]/div/div[2]/div/ul/li[6]').text #获取最大页数max_page=int(max_page) data=get_info(driver) #获取第一页的数据for i in range(0,max_page-1):next_page(driver)data_1=get_info(driver)data.extend(data_1)df_temp=pd.DataFrame(data,columns=['序号','医疗机构名称','医疗机构类型','医疗机构等级','详细地址','开通情况'])df_temp.to_excel("./{}.xlsx".format(province_id))

记一次Selenium框架的爬虫遇到下拉框页面的解决经历相关推荐

  1. selenium + python处理select标签下拉框的选项

    selenium + python处理select标签下拉框的选项 1. 背景 在爬取网页是,有时候我们会遇到下图中的下拉框,也就是< select > < /select > ...

  2. python selenium 下拉框 页面变化_python-selenium之select下拉框

    注意哦,这里的下拉框是select 属性,小伙伴们别看见下拉框就觉得是select 总结 select 选择:select_by_index()  :通过索引定位 select_by_value()  ...

  3. python selenium 下拉框 页面变化_selenium + python 处理 select 标签下拉框的选项

    1. 背景 在爬取网页是,有时候我们会遇到下图中的下拉框,也就是 < select > < /select > 标签.按照一般的点击方案是无法成功的,而 selenium 提供 ...

  4. python爬虫设置下拉框的值_python爬虫:BeautifulSoup 使用select方法的使用

    1 html = """ 2 The Dormouse's story 3 4 The Dormouse's story 5 Once upon a time there ...

  5. html的样式下拉框的联动,Web框架Ajax实现html下拉框联动

    说明 页面代码 数据模型 Ajax联动 后台action 结语 说明 我们通过给两个下拉列表赋值案例来说明,下拉框1值通过属性值绑定AvailableCategories直接从后台获取,下拉框2值Se ...

  6. python爬虫selenium操作下拉框详解

    使用python爬虫的selenium操作网页的下拉框. 以该网站为例:https://www.17sucai.com/pins/demo-show?id=5926 该网页下存在多个可供测试的下拉框. ...

  7. Selenium 下拉框处理

    我们在操作网页时,经常会碰到下拉框,比如百度的搜索设置 有多种方法可以对下拉框中的元素进行选择 一.间接选择 先定位到下拉框,再定位其中的选项 代码: # coding = utf-8 from se ...

  8. python selenium --处理下拉框

    下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项. drop_down.html <html&g ...

  9. web自动化测试—selenium游览器下拉框操作

    # coding=utf-8'''下拉框实战思路导包:from selenium.webdriver.support.select import Select #下拉框select from sele ...

最新文章

  1. 【ACM】杭电OJ 2057
  2. 2021年春季学期-信号与系统-第九次作业参考答案-第六小题
  3. NLP-基础知识-001
  4. java如何使用类数组_java – 如何使用泛型与数组的类?
  5. mac os x10.9.2 查看进程对应端口
  6. .net 代码混淆原理性实践
  7. 线程的状态和基本操作
  8. 【Docker 命令】- images命令
  9. Social Engineering Data
  10. 关于Java Web工程中web.xml文件
  11. java红包正态分布,微信红包算法探讨
  12. 优缺点 快速扫描 硬盘监测_怎么用硬盘检测工具检测硬盘前好后坏的原理?
  13. 如何去除win 10右键菜单的“使用skype共享”
  14. PCI/PCIe的学习笔记
  15. Backtrader简单均线交易策略“金叉和死叉”
  16. 数据结构与算法教程——App推荐
  17. 九阴真经选择服务器无响应,关于64位操作系统闪退问题的解决方案
  18. matplotlib-04 xlabel设置x轴的标签
  19. 2. Ceph的权限管理、RBD与Cephfs的挂载使用和MDS的高可用
  20. Ubuntu下安装微信(非网页版)、TIM、QQ

热门文章

  1. (授人以鱼不如授人以渔)mysql-connector-java各种版本下载地址
  2. 2021年1~12月语音合成和语音识别论文月报
  3. Python|动态规划问题--斐波那契数列
  4. 帮表弟的女友买了个5900的dell 1420
  5. 阿里云服务器共享型、计算型和通用型有什么区别?
  6. WebDriver下载地址
  7. tipask 问答系统 如何设置第三方一键登录
  8. 浅谈服务器选择固态硬盘的几个优缺点
  9. 阿里云的认证费用是多少?考试要多长时间?
  10. 英语谚语精选(English Proverb Collection)