查看原文
其他

爬虫分享——自动化利器Selenium

灰熊 Python分析与挖掘 2024-03-28

    关于爬虫,我一直觉得是提升代码开发能力的好技能,为什么呢?仔细研究爬虫后,你会发现爬虫涉及的范围很广,比如了解HTML结构、动态页面渲染、js逆向、js注入、抓包、多线程、代理IP池等等,甚至可能还会涉及到用神经网络去学习验证码并进行解析,所以说爬虫还是挺考验开发能力的。

    那么这次给大家介绍一款爬虫利器—Selenium利器,那么Selenium有什么好处呢?在我们日常爬虫中,常见的页面有静态页面动态页面对于静态页面,我们可以直接使用request+解析库基本就可以解决。但碰到动态页面时,这个时候就稍微麻烦了点,可能你得通过抓包+js逆向解密才能获取内容,不过如果你会Selenium,可能事情就会简单点了。好了,技术文章,不多逼逼,直接上干货~


一、下载安装Selenium

    我记得之前使用Selenium的时候还是需要安装Google Chrom对应的Chromdriver版本,现在是直接Install就可以了,无需下载Chromdriver

pip3 install selenium#如果上面觉得下载太慢,可以添加国内镜像下载pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple


二、打开Selenium,并访问url
1、直接打开浏览器,并进入baidu.com
from selenium import webdriveroption = webdriver.ChromOptions()driver = webdriver.Chrome(option)driver.get("http://www.baidu.com")

2、若直接打开浏览器,可能就会导致自动化程序特征被检测出来,则可以考虑隐藏相应的自动化指纹,则此时可以考虑以下方法.

# 更多详情:https://blog.csdn.net/weixin_44259720/article/details/127095705option.add_experimental_option('excludeSwitches', ['enable-automation'])option.add_argument("disable-blink-features=AutomationControlled")option.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=option)

2.1、或者通过往浏览器注入stealth.min.js,stealth.min.js可用于抹去自动化程序特征
# 更多详情:https://blog.csdn.net/w11231/article/details/124138215# 初始化webdriverdriver = webdriver.Chrome()# 读取文件with open('stealth.min.js', 'r') as f: js = f.read()# 调用函数在页面加载前执行脚本driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js})


三、元素定位
    这里比较常用的定位有两种,分别是Xpath、CS,这里比如说我们要定位百度页面的"百度一下",右键点击页面点击"检查",然后再点到对应的元素,点击右键复制即可。

from selenium.webdriver.common.by import By
# Xpathdriver.find_elements(By.XPATH, '//*[@id="su"]')[0].get_attribute('value')>>> '百度一下'# CSS选择器driver.find_element(By.CSS_SELECTOR, '#su')[0].get_attribute('value')>>> '百度一下'

      当然有时可能会出现元素很多、乱的情况,那这个时候可以考虑将整个页面内容整下来,再通过条件进行正则匹配

import re
page_score = driver.page_source
pattern = re.compile('input type="submit" id="su" value="(.*?"')re.findall(pattern ,page_source)>>> ['百度一下']


四、Iframe框架访问

from selenium import webdriverdriver = webdriver.Chrome()
#1.用frame的index来定位,第一个是0driver.switch_to.frame(0)
#2.用id来定位 driver.switch_to.frame("frame1") #2.用id来定位
#3.用name来定位driver.switch_to.frame("myframe") #3.用name来定位
# 4.用WebElement对象来定位driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
# 释放掉iframe,释放后则会返回到上一级页面,那么driver对应的内容为上一级内容driver.switch_to_default.content()


五、JS注入
    Selenium可以将JS代码注入到浏览器里面进行执行,不过需要注意的是自动化框架起来的浏览器,和人为打开的浏览器执行的js结果可能会有差异,这里的差异也主要是因为浏览器指纹带来的影响,这个时候需要结合前面讲到的抹去selenium指纹结合一起使用
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 执行js代码,并获取结果result = driver.execute_script("js代码")
#这里介绍几个常用的js代码注入案例#模型点击,点击class为btn的按钮driver.execute_script("document.querySelector('.btn').click();")
# 模拟页面滚动,从0滑动到最底部dirver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 修改页面元素driver.execute_script("document.querySelector('.element').style.color='blue';)
# 向页面注入js文件driver.execute_script(open('jquery.min.js').read())

     关于Selenium这一块的分享暂时就先到这里了,有兴趣的小伙伴可以私聊进行留言~

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存