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 打开浏览器

from selenium import webdriver

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

2.2 Chrome浏览器无界面模式

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

from selenium import webdriver

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

2.3 元素定位

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

from selenium import webdriver
from selenium.webdriver.common.by import By

#1.实例化配置对象
chrome_options = webdriver.ChromeOptions()
#2.配置对象添加开启无界面命令
chrome_options.add_argument('--headless')
#3.实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.baidu.com'
#发送请求
browser.get(url)
#查看请求的数据
html_str = browser.page_source
print(html_str)

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

<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel_body">
        <ul class="list" id="list-1" name="element">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
                <a href="https://www.baidu.com">百度官网</a>
            <li class="element">Bar</li>
        </ul>
    </div>
</div> 

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

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

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

2.3.2 根据class获取元素列表

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

2.3.3 根据Xpath获取元素列表

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

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

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

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

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

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

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

2.4元素操作

2.4.1 获取元素

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

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

2.4.2 获取属性值

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

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

2.5 前进和后退

#前进
browser.forward()
#后退
browser.back()

2.6 执行js

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

语法格式:browser.execute_script(js)

参数说明:

js:为js语句

举例应用:

from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
js = 'window.scrollTo(0,document.body.scrollHeight)' #js语句
browser.execute_script(js) #执行js的方法
browser.quit()

2.7 页面等待 

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

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

2.7.1 隐式等待

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

from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(10) #隐式等待10秒
browser.get('https://www.baidu.com/')
myDynamicElement = browser.find_element_by_id('input')

2.7.2 显式等待

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

from selenium import webdriver
from selenium.webdriver.common.by import By
#WebdriverWait库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_condition类,负责条件触发
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
try:
    #页面一直循环,直到id='input'出现
    element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'input')))
finally:
    browser.quit()

3. 进阶操作

3.1 使用代理ip

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

from selenium import webdriver
import time

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

3.2 修改请求头

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

from selenium import webdriver
import time

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'
#1.实例化配置对象
options = webdriver.ChromeOptions()
#2.配置对象修改请求头,这里agent以搜狗浏览器为例
options.add_argument('--user-agent='+agent) 
#3.实例化带有配置对象的browser对象
browser = webdriver.Chrome(chrome_options=options)
browser.get('https://www.baidu.com')
#获取页面内容
print(browser.page_source)
#延时3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
browser.close()

3.3 隐藏浏览器指纹特征

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落指尖❀

您的认可是小浪宝宝最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值