爬虫分享——自动化利器Selenium
关于爬虫,我一直觉得是提升代码开发能力的好技能,为什么呢?仔细研究爬虫后,你会发现爬虫涉及的范围很广,比如了解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
from selenium import webdriver
option = webdriver.ChromOptions()
driver = webdriver.Chrome(option)
driver.get("http://www.baidu.com")
2、若直接打开浏览器,可能就会导致自动化程序特征被检测出来,则可以考虑隐藏相应的自动化指纹,则此时可以考虑以下方法.
# 更多详情:https://blog.csdn.net/weixin_44259720/article/details/127095705
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument("disable-blink-features=AutomationControlled")
option.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=option)
# 更多详情: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})
from selenium.webdriver.common.by import By
# Xpath
driver.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 webdriver
driver = webdriver.Chrome()
#1.用frame的index来定位,第一个是0
driver.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()
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这一块的分享暂时就先到这里了,有兴趣的小伙伴可以私聊进行留言~