• 21天学习挑战赛——Python爬虫 selenium自动化操作浏览器


    🧑个人主页:
    👨‍🎓作者简介:小白一枚。
    🐋希望大家多多支持😘一起进步!
    ✍如果文章对你有帮助的话,欢迎评论💬点赞👍 
    收藏📑➕关注🤞

    目录

    1. Selenium概述

    2. 基础操作

    2.1 打开浏览器

    2.2 Chrome浏览器无界面模式

    2.3 元素定位

    2.3.1 根据id属性值获取元素列表

    2.3.2 根据class获取元素列表

    2.3.3 根据Xpath获取元素列表

    2.3.4 根据标签的文本获取元素列表(精确定位)

    ​2.3.5 根据标签包含的文本获取元素列表(模糊定位)

     2.3.6 根据标签名获取元素列表

    2.4元素操作

    2.4.1 获取元素

    2.4.2 获取属性值

    2.5 前进和后退

    2.6 执行js

    2.7 页面等待 

    2.7.1 隐式等待

    2.7.2 显式等待

    3. 进阶操作

    3.1 使用代理ip

    3.2 修改请求头

    3.3 隐藏浏览器指纹特征


    活动地址:CSDN21天学习挑战赛

     1. Selenium概述

            Selenium是一个用于测试Web应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样。在爬虫领域selenium同样是一把利器,能够解决大部分的网页的反爬问题。Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

            selenium作为Python的第三方库,需要进行下载。

            Selenium操作浏览器,需要在浏览器中安装驱动WebDriver。Selenium库中有个叫WebDriver的API,WebDriver有点像可以加载网页的浏览器,但是它可以像BeautifulSoup或者其他Selector对象一样用来查找页面元素,与页面上的元素进行交互(发送、点击等),以及执行其他操作。

    常用浏览器浏览器下载地址
    浏览器下载地址
    Chrome浏览器http://chromedriver.storage.googleapis.com/index.html
    Firefox浏览器http://chromedriver.storage.googleapis.com/index.html
    Edge浏览器https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads

            PhantomJS无界面浏览器,可以把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行器来比完整的浏览器高效。

    以Chrome浏览器为例下载浏览器驱动:

    1)查看自己的浏览器版本

     2)打开浏览器驱动下载网站,选择版本最接近的,并不一定有对应的版本,选择最相近的即可

     3)选择自己对应的电脑版本。windos的没有win64,选win32即可

     4)放到自己的Python安装路径下

            由于我的电脑上安装了Anaconda,所以需要安装在Anaconda安装目录。

    2. 基础操作

    2.1 打开浏览器

    1. from selenium import webdriver
    2. #浏览器初始化
    3. brower = webdriver.Chrome() #Chrome浏览器
    4. # brower = webdriver.Firefox() #Firefox浏览器
    5. # brower = webdriver.Edge() #Edge浏览器
    6. # brower = webdriver.PhantomJS() #PhantomJS浏览器
    7. #发送请求
    8. brower.get('https://www.baidu.com')
    9. #打印页面的标题
    10. print(brower.title) #输出:百度一下,你就知道
    11. #退出浏览器
    12. brower.quit() #一定要退出,不退出会有残留进程

    2.2 Chrome浏览器无界面模式

            Headless模式是Chrome浏览器的无界面模式,可以在不打开浏览器的前提下,使用所有支持Chrome支持的特性去运行我们的程序。

    1. from selenium import webdriver
    2. #1.实例化配置对象
    3. chrome_options = webdriver.ChromeOptions()
    4. #2.配置对象添加开启无界面命令
    5. chrome_options.add_argument('--headless')
    6. #3.配置对象添加禁用gpu命令
    7. chrome_options.add_argument('--disable-gpu')
    8. #4.实例化带有配置对象的browser对象
    9. brower = webdriver.Chrome(chrome_options=chrome_options)
    10. #发送请求
    11. brower.get('https://www.baidu.com')
    12. #查看请求的数据
    13. print(brower.page_source) #查看渲染后的数据,就可以Xpath进行解析数据了
    14. print(brower.get_cookies()) #查看请求网页后的cookies值
    15. print(brower.current_url) #查看请求url
    16. #关闭页面
    17. brower.close()
    18. #关闭浏览器
    19. brower.quit()

    2.3 元素定位

            通过selenium的基本使用就可以简单操作浏览器了,接下来我们学习下定位元素的其他方法。

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. #1.实例化配置对象
    4. chrome_options = webdriver.ChromeOptions()
    5. #2.配置对象添加开启无界面命令
    6. chrome_options.add_argument('--headless')
    7. #3.实例化带有配置对象的browser对象
    8. browser = webdriver.Chrome(chrome_options=chrome_options)
    9. url = 'https://www.baidu.com'
    10. #发送请求
    11. browser.get(url)
    12. #查看请求的数据
    13. html_str = browser.page_source
    14. print(html_str)

    由于获取百度的数据较大,假如返回的 html_str 为以下内容:

    1. <div class="panel">
    2. <div class="panel-heading">
    3. <h4>Helloh4>
    4. div>
    5. <div class="panel_body">
    6. <ul class="list" id="list-1" name="element">
    7. <li class="element">Fooli>
    8. <li class="element">Barli>
    9. <li class="element">Jayli>
    10. ul>
    11. <ul class="list list-small" id="list-2">
    12. <li class="element">Fooli>
    13. <a href="https://www.baidu.com">百度官网a>
    14. <li class="element">Barli>
    15. ul>
    16. div>
    17. div>

    2.3.1 根据id属性值获取元素列表

    1. #获取第一个元素
    2. browser.find_element(by=By.ID, value='list-1')
    3. #获取多个元素
    4. browser.find_elements(by=By.ID, value='list-1')

     注意:获取一个元素和多个元素的区别是后面加不加s 。

    2.3.2 根据class获取元素列表

    1. #获取第一个元素
    2. browser.find_element(by=By.CLASS_NAME, value='element')
    3. #获取多个元素
    4. browser.find_elements(by=By.CLASS_NAME, value='element')

    2.3.3 根据Xpath获取元素列表

    1. #返回标签li,id为element的一个元素
    2. browser.find_element(by=By.XPATH, value='//li[@id="element"]')
    3. #返回标签li,id为element的所有元素
    4. browser.find_elements(by=By.XPATH, value='//li[@id="element"]')

    2.3.4 根据标签的文本获取元素列表(精确定位)

    1. #获取一个元素
    2. browser.find_element(by=By.LINK_TEXT, value='Foo')
    3. #获取多个元素
    4. browser.find_element(by=By.LINK_TEXT, value='Foo')

    ​2.3.5 根据标签包含的文本获取元素列表(模糊定位)

    1. #获取一个元素
    2. browser.find_element(by=By.PARTIAL_LINK_TEXT, value='Fo')
    3. #获取多个元素
    4. browser.find_elements(by=By.PARTIAL_LINK_TEXT, value='Fo')

     2.3.6 根据标签名获取元素列表

    1. #获取一个元素
    2. browser.find_element(by=By.TAG_NAME, value='li')
    3. #获取多个元素
    4. browser.find_element(by=By.TAG_NAME, value='li')

    2.4元素操作

    2.4.1 获取元素

            通过定位获取的标签对象的text属性,获取文本内容:element.text

    1. ret = browser.find_element_by_class_name('element')
    2. print(ret[0].text)

    2.4.2 获取属性值

            通过定位获取标签的get_attribute值函数,传入属性名,来获取属性的值。

    1. ret = browser.find_element_by_tag_name('a')
    2. print(ret[0].get_attribute('href'))

    2.5 前进和后退

    1. #前进
    2. browser.forward()
    3. #后退
    4. browser.back()

    2.6 执行js

            selenium可以让浏览器执行自己规定的js代码。

    语法格式:browser.execute_script(js)

    参数说明:

    js:为js语句

    举例应用:

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. url = 'https://www.baidu.com/'
    4. browser.get(url)
    5. js = 'window.scrollTo(0,document.body.scrollHeight)' #js语句
    6. browser.execute_script(js) #执行js的方法
    7. browser.quit()

    2.7 页面等待 

            现在的网页越来越多地采用了Ajax技术,这样程序便不能确定某个元素何时能完全加载出来。如果实际页面等待实际过长导致某个dom元素还没出来,但是如果代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了避免这种元素定位困难并且降低ElementNotVisibleException的概率,所以Selenium提供了两种等待方式,一种是隐式等待,另一种是显式等待。

            隐式等待是等待特定的时间,显式等待是指定某一条件并直到这个条件成立时继续执行。

    2.7.1 隐式等待

            隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步。在设置的时间内没有定位成功,则会报超时加载。

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. browser.implicitly_wait(10) #隐式等待10秒
    4. browser.get('https://www.baidu.com/')
    5. myDynamicElement = browser.find_element_by_id('input')

    2.7.2 显式等待

            显式确定等待某个指定元素,然后设置最长等待时间,如果在这个时间内没有找到元素,那么会抛出异常。

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. #WebdriverWait库,负责循环等待
    4. from selenium.webdriver.support.ui import WebDriverWait
    5. #expected_condition类,负责条件触发
    6. from selenium.webdriver.support import expected_conditions as EC
    7. browser = webdriver.Chrome()
    8. browser.get('https://www.baidu.com/')
    9. try:
    10. #页面一直循环,直到id='input'出现
    11. element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'input')))
    12. finally:
    13. browser.quit()

    3. 进阶操作

    3.1 使用代理ip

            selenium控制浏览器可以使用代理ip。防止可能由于自己的ip访问网站次数过多,不能打开网站。

    1. from selenium import webdriver
    2. import time
    3. #1.实例化配置对象
    4. options = webdriver.ChromeOptions()
    5. #2.配置对象添加使用代理ip的命令
    6. options.add_argument('--proxy-server=http://ip地址') #代理IP:端口号
    7. #3.实例化带有配置对象的browser对象
    8. browser = webdriver.Chrome(chrome_options=options)
    9. browser.get('https://www.baidu.com')
    10. #获取页面内容
    11. print(browser.page_source)
    12. #延时3秒后关闭当前窗口,如果是最后一个窗口则退出
    13. time.sleep(3)
    14. browser.close()

    3.2 修改请求头

            selenium可以修改请求头,伪装成不同的浏览器。

    1. from selenium import webdriver
    2. import time
    3. agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0'
    4. #1.实例化配置对象
    5. options = webdriver.ChromeOptions()
    6. #2.配置对象修改请求头,这里agent以搜狗浏览器为例
    7. options.add_argument('--user-agent='+agent)
    8. #3.实例化带有配置对象的browser对象
    9. browser = webdriver.Chrome(chrome_options=options)
    10. browser.get('https://www.baidu.com')
    11. #获取页面内容
    12. print(browser.page_source)
    13. #延时3秒后关闭当前窗口,如果是最后一个窗口则退出
    14. time.sleep(3)
    15. browser.close()

    3.3 隐藏浏览器指纹特征

             selenium操作浏览器,有几十个特征可以被网站监测到,被识别出是爬虫操作。

    正常情况下手动打开浏览器,输入网址:https://bot.sannysoft.com/

  • 相关阅读:
    10-26 maven配置
    [002] [RISC-V] RTT与MRS配置C++环境
    (muduo) 基础demo
    图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
    Vue知识系列(1)每天10个小知识点
    【原创】常用元器件(数码管)选型之引脚和极性识别-cayden20221029
    Matlab进阶绘图第28期—带回归趋势线的密度散点图
    vue 点击当前元素进行显示隐藏,上次点过的元素隐藏
    vscode:连接服务器进行远程开发调试
    Solidity智能合约开发 — 4.2-合约的fallback和函数重载
  • 原文地址:https://blog.csdn.net/m0_52162042/article/details/126441178