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

这篇具有很好参考价值的文章主要介绍了记一次Selenium框架的爬虫遇到下拉框页面的解决经历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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

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

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

selenium下拉框选择 input,python,爬虫,Powered by 金山文档

问题

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

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select


driver=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标签的情况,针对本项目,打开页面源码发现

selenium下拉框选择 input,python,爬虫,Powered by 金山文档

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

不慌!

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

但是:

selenium下拉框选择 input,python,爬虫,Powered by 金山文档

报错信息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,在模

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

selenium下拉框选择 input,python,爬虫,Powered by 金山文档

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

正则表达式如下:文章来源地址https://www.toymoban.com/news/detail-810406.html

#获取随机的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)

    #获取随机的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]

    #     点击切换固定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:
            break
    return info_list

driver=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框架的爬虫遇到下拉框页面的解决经历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python爬虫selenium操作下拉框详解

    使用python爬虫的selenium操作网页的下拉框。 以该网站为例:https://www.17sucai.com/pins/demo-show?id=5926 该网页下存在多个可供测试的下拉框。 基本脚手架代码: 定位下拉框(以第一个下拉框为例) Select()方法 不推荐这样定位 选中下拉框,点击 第一个下拉框的可选值如图所示 选择

    2024年02月11日
    浏览(50)
  • python爬虫之selenium下拉滚动示例

    首先,我们需要明确,在许多网站的滚动页面加载新的内容的时候,是需要进行下拉操作的。这就使得我们需要使用selenium来模拟用户的下拉操作以获取更多的数据。 在selenium中,我们需要引入webdriver库和Keys类。webdriver是一个浏览器自动化驱动程序,而Keys类则用于模拟键盘事

    2024年02月16日
    浏览(43)
  • 记一次git冲突解决

    在提交mr的时候突然遇到了conflict,这时候意识到没有及时pull代码,脑海中想起了隔壁一起入职的同事经常念叨的一句“每天早上来都pull一下代码”。但是已经迟了 我看了一下,主要是同一个文件,master分支上已经被修改过,然后我要mr的代码也在这个文件上进行了修改。因

    2024年02月05日
    浏览(43)
  • 记一次重大的问题解决

    我们是需要的操作两个git仓库的的三个分支(此处第一个仓库简称:A(负责程序的第一层进入),第二个简称B(负责业务的执行)) 大致就是A的代码引用了B,B的代码引用了A,互为对方的jar包。 问题(部署到测试域之后): 1:请求打进来之后,有时候进,有时候不进,有

    2024年02月21日
    浏览(53)
  • Python-爬虫、自动化(selenium,动态网页翻页,模拟搜索,下拉列表选择、selenium行为链)

    selenium是一个Web自动化测试工具,可以直接运行在浏览器上·支持所有主流的浏览器.可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,基础页面截图等。 使用pip install selenium命令下载selenium模块。 运行下列代码: 说明没有下载对应浏览器的驱动,这里使用谷歌

    2024年02月01日
    浏览(71)
  • 记一次Kafka重复消费解决过程

            起因:车联网项目开发,车辆发生故障需要给三个系统推送消息,故障上报较为频繁,所以为了不阻塞主流程,采用了使用kafka。消费方负责推送并保存推送记录,但在一次压测中发现,实际只发生了10次故障,但是推送记录却有30多条。         问题排查,发现

    2024年02月13日
    浏览(60)
  • 记一次docker服务启动失败解决过程

    环境:centos 7.6 报错:start request repeated too quickly for docker.service 由于服务器修复了内核漏洞,需要重启,没想到重启后,docker启动失败了 查看状态 如下图 里面有一行提示: 提示要 journalctl -x 这个命令查看详细问题,其实用这个命令无法定位到具体问题的,于是使用了另外一

    2024年01月18日
    浏览(78)
  • 记一次Linux启动Mysql异常解决

    并没有发现3306数据库端口 service mysqld start systemctl start mysqld.service 都无效,报错 发现是磁盘空间不足。。。 (下图是已经清理过的结果截图) 然后把磁盘的不重要文件直接删除即可 rm -rf * 总结: 第一步看全局端口占用情况 第二步看日志/根据提示命令看信息 其实,在启动My

    2024年02月14日
    浏览(53)
  • 记一次 vue npm 安装依赖报错解决

    2、问题分析 npm版本过高 3、问题解决 然后重新安装即可 前端面试题库 ( 面试必备)              推荐:★★★★★ 地址:前端面试题库

    2024年02月16日
    浏览(63)
  • 记一次前端Vue项目国际化解决方案

    有一个vue项目,要实现国际化功能,能够切换中英文显示,因为该项目系统的用户包括了国内和国外用户。 1、页面表单上的所有中文标签要国际化,包括表单属性标签、表格列头标签等, title=“数量”; 2、输入框的提示内容需要国际化,如 placeholder=“选择日期” 3、js代码

    2024年02月20日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包