selenium+python处理广告弹窗

1. 背景

在使用浏览器渲染技术爬取网站信息时,经常会遇到一些弹出框(广告,警告框,验证码,登录窗口等)的干扰。一般来说,当这些窗口弹出时,就无法操作原始页面。

  • 不同的弹出框有不同的处理方案:

    • 广告:直接关闭
    • 警告框:点击确定或者取消
    • 验证码:输入验证码,进行验证
    • 登录窗口:进行登录。

下面以1688网站为例,记录几种类型的处理方式。

2. 环境

  • python 3.6.1
  • 系统:win7
  • IDE:pycharm
  • 安装过chrome浏览器
  • 配置好chromedriver
  • selenium 3.7.0

3. 广告弹窗的处理


3.1. 分析广告弹窗的源码

<div class="s-overlay-box"><div class="s-overlay-widget">
<div class="s-widget-overlaycontent" data-cookie-key="__sw_newuno_count__" data-top-sect="newUserNoDiamond"><div class="s-overlay-widget-body"><img src="//cbu01.alicdn.com/cms/upload/2017/612/899/2998216_1921578814.png"></div><div class="s-overlay-widget-foot"><div class="s-overlay-widget-ic">开始找货</div></div>
</div></div><div class="s-overlay-close"><i></i><em class="s-overlay-close-t"></em><em class="s-overlay-close-r"></em><em class="s-overlay-close-b"></em><em class="s-overlay-close-l"></em></div></div>

<div class="home-identity-dialog"> <span class="identity-close"> <i class="identity-icon identity-close-icon"></i> </span> <div class="identity-portrait"> <p class="identity-portrait-img"> <img src="https://img.alicdn.com/tfs/TB1y80.gPihSKJjy0FlXXadEXXa-80-81.png" alt=""> </p> <p class="identity-portrait-des"> 身份越真实<i class="identity-icon identity-des-icon"></i>生意越轻松 </p> </div> <div class="identity-action"> <div id="identity-select"><div class="fui-combobox fui-combobox-l" id="fui_widget_0"><input class="result" placeholder="选择您的主采购行业" type="text" readonly="readonly" autocomplete="off"><a class="trigger" href="#" target="_self" hidefocus="true"><span class="fui-icon-18"></span></a><div class="fui-combobox-panel" dataid="combobox_1511422185762" style="display: none;"><div class="list fd-clr"><ul><li class="fui-combobox-item">女装</li><li class="fui-combobox-item">日用百货</li><li class="fui-combobox-item">五金工具</li><li class="fui-combobox-item">电工电气</li><li class="fui-combobox-item">童装</li><li class="fui-combobox-item">配饰</li><li class="fui-combobox-item">内衣</li><li class="fui-combobox-item">包装</li><li class="fui-combobox-item">鞋靴</li><li class="fui-combobox-item">男装</li><li class="fui-combobox-item">照明</li><li class="fui-combobox-item">机械</li><li class="fui-combobox-item">运动户外</li><li class="fui-combobox-item">箱包皮具</li><li class="fui-combobox-item">母婴工具</li><li class="fui-combobox-item">电子元器件</li><li class="fui-combobox-item">食品饮料</li><li class="fui-combobox-item">玩具</li><li class="fui-combobox-item">精细化学品</li><li class="fui-combobox-item">化工</li><li class="fui-combobox-item">美妆日化</li><li class="fui-combobox-item">家纺家饰</li><li class="fui-combobox-item">餐饮生鲜</li><li class="fui-combobox-item">仪器仪表</li><li class="fui-combobox-item">3C数码</li><li class="fui-combobox-item">办公文教</li><li class="fui-combobox-item">橡塑制品</li><li class="fui-combobox-item">冶金</li><li class="fui-combobox-item">纺织皮革</li><li class="fui-combobox-item">家装建材</li><li class="fui-combobox-item">工艺礼品</li><li class="fui-combobox-item">个人防护</li><li class="fui-combobox-item">家用电器</li><li class="fui-combobox-item">汽车用品</li><li class="fui-combobox-item">宠物园艺</li><li class="fui-combobox-item">安全防护</li></ul></div></div></div></div> <div class="identity-confirm">我选好了</div> <div class="identity-cancel">访问1688首页 &gt;</div> </div> </div>
  • 分析源码,可以看出,这两个广告弹窗,就是两个div元素,不是脚本,也没有iframe嵌套,处理比较简单。只要找到右上角的关闭按钮元素,就可以调用click将其关闭。

3.2. 代码


# 广告页面弹窗处理
def suspondWindowHandler(browser):# 第一种广告弹窗try:suspondWindow = browser.find_element_by_xpath("//div[contains(@class, 'identity-dialog')]//*[contains(@class, 'close-icon')]")suspondWindow.click()print(f"searchKey: Suspond Page1 had been closed.")except Exception as e:print(f"searchKey: there is no suspond Page1. e = {e}")# 第二种广告弹窗# 如果有广告界面弹出,关闭广告。 否则会导致数据无法输入到搜索框try:suspondWindow = browser.find_element_by_xpath("//div[contains(@class,'overlay-box')]//div[contains(@class,'overlay-close')]")suspondWindow.click()print(f"searchKey: Suspond Page2 had been closed.")except Exception as e:print(f"searchKey: there is no suspond Page2. e = {e}")

3.3. 调用原则。

  • 一般来说,在处理广告弹窗时,遵守以下规则时,可以提高程序的稳定性。

    • 将所有出现过的广告类型,集中到一个函数中,如上suspondWindowHandler,每种类型的弹窗都try检测一下。
    • 对广告弹窗元素的获取,尽量收集他们的特征,采用模糊匹配的方式来寻找,如上dialog,overlay-box,close-icon,overlay-close。这样覆盖面可能更广。不过要小心的是,也有可能会误伤。
    • 进入页面时,要首先确保页面已经加载成功了,再来检测广告弹窗是否存在,一定要遵守这个顺序。
    • 关闭广告弹窗之后,一定要重新获取页面元素,防止切换带来的元素失焦。
    • 页面的每次刷新或者数据加载,都可能会带来广告弹出。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import timeimport parserPageModel# 启动浏览器,并设置好wait
browser = webdriver.Chrome()
browser.set_window_size(960, 960)  # 设置浏览器窗口大小,和桌面分辨率有关
wait = WebDriverWait(browser, timeout=20)   # 设置页面加载等待时间# 进入1688首页,搜索关键字
def searchKey(keyWord, DamatuInstance, retryCount):print(f"searchKey: enter, keyWord = {keyWord}, retryCount = {retryCount}")retryCount += 1if retryCount > 8:return (False, 0, keyWord)mainUrl = "https://www.1688.com/"print(f"searchKey: 访问1688主页, 进行搜索. mainUrl = {mainUrl}")browser.get(mainUrl)# 尝试搜索try:# 搜索框是否出现。用于判断搜索页面是否已经加载好input = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@id='alisearch-keywords']")))except Exception as e:# 搜索框都没出现,说明页面没有加载好,重试print(f"searchKey: 搜索框还没有加载好,重新加载主页. retryCount = {retryCount}, url = {mainUrl}, e = {e}")searchKey(keyWord, DamatuInstance, retryCount)else:time.sleep(2)# 处理可能出现的广告suspondWindowHandler(browser)try:# 重新拿到搜索框,防止处理广告页面之后,元素失焦input = browser.find_element_by_xpath("//input[@id='alisearch-keywords']")# 输入搜索关键字time.sleep(5)input.clear()input.send_keys(keyWord)# 敲enter键input.send_keys(Keys.RETURN)print(f"searchKey: press return key.")time.sleep(3)# 处理可能出现的广告弹窗suspondWindowHandler(browser)# 查看搜索结果是否出现。 以商品List是否出现为标准searchRes = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'sm-breadcrumb')]//span[@class='sm-widget-offer']")))print(f"searchKey: searchSuccess, searchRes = {searchRes}")except Exception as e:print(f"searchKey: 搜索结果总页数尚未加载好,重新加载主页. retryCount = {retryCount}, url = {mainUrl}, e = {e}")searchKey(keyWord, DamatuInstance, retryCount)else:# 如果发现结果页加载OK, 开始寻找总页数try:# 获取结果总页数print(f"searchKey: 搜索结果已出现,开始寻找总页数")totalPage = 0print(f"searchKey: totalPageInit = {totalPage}")total = wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='fui-paging-form ']//span[contains(@class, 'total')]//em[contains(@class, 'num')]")))totalPage = int(total.text)print(f"searchKey: totalPage = {totalPage}")return (True, totalPage, keyWord)except Exception as e:print(f"searchKey: 搜索结果就一页. e = {e}")return (True, 1, keyWord)finally:# 特别注意:这个部分会在本函数return语句之前执行# 参考文章解说return和finally:# Python: 浅析 return 和 finally 共同挖的坑 http://python.jobbole.com/88408/try:print(f"searchKey: 取第一页的数据出来,进行存储")# 解析页面内容:if browser.page_source:productInfoLst = parserPageModel.getProductMainInfo(browser.page_source)print(f"productInfoLst = {productInfoLst}")except Exception as e:print(f"searchKey: 取第一页数据出来这个过程出现异常。Exception = {e}")

4. 警告框alert的处理

参考文章:https://www.cnblogs.com/qiaoyeye/p/5593428.html

5. 验证码弹出框的处理

参考文章1:http://blog.csdn.net/zwq912318834/article/details/78605486
参考文章2:http://blog.csdn.net/zwq912318834/article/details/78616462

selenium+python处理广告弹窗相关推荐

  1. python拦截广告弹窗_selenium+python处理广告弹窗

    1. 背景 在使用浏览器渲染技术爬取网站信息时,经常会遇到一些弹出框(广告,警告框,验证码,登录窗口等)的干扰.一般来说,当这些窗口弹出时,就无法操作原始页面. 不同的弹出框有不同的处理方案: 广告: ...

  2. python拦截广告弹窗_会捆绑软件、弹出广告?Python教你实现纯净中英自动翻译小工具...

    本文原创,未经允许不得转载,本文版权归@itcast @wj14k所有,感谢你的阅读! 翻译工具在安装会捆绑其他软件 翻译工具会跳出你不喜欢的广告 -- 对捆绑.广告说不! Python实现纯净翻译小 ...

  3. python拦截广告弹窗_你会如何使用Python进行广告拦截?

    我知道这是一个老问题,但我想我会尝试给碰巧碰到它的人找一个答案.你可以创建一个QNetworkAccessManager的子类并将它与 https://github.com/atereshkin/ab ...

  4. python 拦截windows弹窗广告_win10怎么阻止弹窗广告拦截功能的方法

    自从微软于2015年7月推出Windows 10以来,用户一直抱怨广告以某种方式投放到桌面,无论是微软拥有应用程序或服务,用户一直通过第三方Windows应用商店中寻求解决方法.毫无疑问,广告是恼人的 ...

  5. python 拦截windows弹窗广告_win10系统怎样拦截各种软件的广告弹窗

    一位windows10系统用户反馈自己的电脑在刚开机的时候,总会弹出各种广告弹窗,感觉非常烦人.这该怎么办呢?我们能不能把这些广告弹窗给拦截了呢?答案是肯定的.接下来,小编就教大家win10系统怎样设 ...

  6. ant4 多个form 验证_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

    点击上方"早起Python",关注并"星标" 每日接收Python干货! 本文含 3321 字,9代码片段建议阅读 8 分钟 前言 在我们写爬虫的过程中,目标网 ...

  7. selenium+python 的微博自动转赞评功能实现

    放假了,没人比我更无聊,在家制作了一个selenium+python的微博自动转赞评程序. 程序分为四部分,依次是:登录+点赞+评论+转发,当点赞达到用户上限时去评论,评论至上限时去转发,出现验证码则 ...

  8. python爬虫遇到验证码、输入验证码后提醒验证码错误_爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别...

    前言 在我们写爬虫的过程中,目标网站常见的干扰手段就是设置验证码等,本就将基于Selenium实战讲解如何处理弹窗和验证码,爬取的目标网站为某仪器预约平台 可以看到登录所需的验证码构成比较简单,是彩色 ...

  9. 爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 远芳侵古道,晴翠接荒城. 前言 在 ...

最新文章

  1. 美国科学家发现:AI跟人类一样,都是需要“睡觉”的
  2. python获取Pandas列名的几种方法
  3. TDI Filter 过滤驱动
  4. Linux中java项目环境部署,简单记录一下
  5. ITK:将所有像素的总和缩放为常数
  6. 抓wifi包工具linux,测试工具之在Ubuntu使用Wireshark抓无线数据包
  7. 来自我的破船大大的博客,记录他的iOS成长之路,与君同勉!
  8. ubuntu双系统导致进windows花屏
  9. Xen Server 7.0 一直无法退出维护模式
  10. 大数据可视化的重要性体现在哪里
  11. 职称计算机 将计算机broad_1下的e盘映射为k盘网络驱动器,职称计算机考试(网络基础)试题及答案操作..doc...
  12. 智能DNS解析搭建成功
  13. 使用Git上传本地项目到GitHub
  14. PAT 1124 Raffle for Weibo Followers
  15. linux 下载 命令 wget 和 curl
  16. ARCGIS格式转CAD时保留其图层、高程及颜色的方法
  17. 学习matlab(七)——符号计算
  18. 云南衡水实验中学2021高考成绩查询,2021云南衡水实验中学高考复读报名材料
  19. 2016年终总结:我只想成为自己喜欢的人 不负己心 不负此生
  20. C#静默打印 PDF

热门文章

  1. 艾媒发布2022年上半年中国虚拟人百强榜,分析师解读虚拟人行业情况
  2. android新技术 1
  3. 模拟登陆获取脉脉好友信息
  4. php 正则匹配特殊 x20,php的特殊正则
  5. android 读取wps_安卓APP调用WPS打开Office文件并返回APP
  6. 脑洞 | 横扫围棋界的AlphaGo竟然出纪录片了!介意剧透者慎点……
  7. AWS(Amazon Web Services, 亚马逊网络服务系统)简介
  8. 常见词汇背后的故事(1)
  9. 计算机音乐作品,关于建立声乐作品计算机音乐伴奏曲库的一些思考
  10. C# particle class