爬虫利器selenium
使用场景
- 由于伪造 登陆过的用户 cookies 分析起来比较复杂
- 使用浏览器 模拟登陆 通过
selenium
模块来操控浏览器达到抓取数据的目的。 - 服务端有比较严格的检查请求机制的情况下。
如何使用
使用selenium
需要配置 chromedriver
windows如何配置 chromedriver
- 本机必须安装chrome 浏览器 。chrome 中访问 chrome://settings/help
- 点击查看 这里 去寻找合适自己浏览器版本的.
下载安装自己系统对应的版本 并记录安装的位置 这个位置。在程序中需要使用
下载后解压 文件 把其中的chromedriver.exe
放置于Chrome 打开的目录下。
这个目录怎么找也很简单:桌面找到谷歌浏览器 ⇒ 鼠标右击 ⇒ 选择 属性 查看 目标 或者起始位置即可;
我这里放的位置是: C:\Program Files\Google\Chrome\Application\chromedriver.exe
linux系统如何配置chromedriver
mac | linux 这里先自行查找方法,都大同小异。
selenium使用方法
executable_path
: chromedriver.exe的全路径
见下例:
from selenium import webdriver
# 设置chromedriver
chromeOptions = webdriver.ChromeOptions()
# 关闭浏览器上显示的自动操作横幅
chromeOptions.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path="C:\Program Files\Google\Chrome\Application\chromedriver.exe",
options=chromeOptions)
browser.get('https://www.baidu.com/')
# 给页面的input元素填入值
browser.find_element_by_css_selector('.s_ipt').send_keys('测试')
# 样式选择器选择 浏览器中的元素
browser.find_element_by_css_selector('input#su').click()
# 退出
browser.quit()
上面这个例子只是简单使用。下面我会列出 常用的 获取元素 以及操作元素的方法,还有常见的一些问题如何解决
获取元素方式
下面只介绍几个 ,应该还有很多方式,可自行查找学习。
find_element_by_id
根据html中的 标签 id 获取:
<a id="aaa">aaa</a>
browser.find_element_by_id("//body//h2").text
find_element_by_xpath
根据xpath 规则 获取:
<body><h2>test</h2></body>
browser.find_element_by_xpath("//body//h2").text
find_element_by_css_selector
id选择
browser.find_element_by_css_selector('#test')
类选择
browser.find_element_by_css_selector('.test')
标签选择
browser.find_element_by_css_selector('a')
多class 选择元素
browser.find_element_by_css_selector('.classa.classb')
支持 css 选择器语法。 it is said,It is efficient
等待元素出现
由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度
– 调用该方法提供的驱动程序作为参数,直到返回值为True
WebDriverWait(driver,10).until(method,message="")
– 调用该方法提供的驱动程序作为参数,直到返回值为False
WebDriverWait(driver,10).until_not(method,message="")
示例: 直到id =tid 的元素 可见 在执行
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(browser, 10, 0.2)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#tid")), message="")
EC.visibility_of_element_located
: 当我们需要找到元素,并且该元素也可见。presence_of_element_located
: 当我们不关心元素是否可见,只关心元素是否存在在页面中。
伪装浏览器为正常用户
一般来说 下面两种方式 就够用了,但也不排除 目标网站有更高级的 判断是否是 自动化操作浏览器点击的方法。
浏览器特征隐藏
这里需要使用到 stealth.min.js 文件。动手能力抢的小伙伴 可以自行源码编译,不过可能过程很麻烦。
with open('js/stealth.min.js') as f:
js = f.read()
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
浏览器参数设置
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
# 这条是重点,具体看网站检测哪些东西
chromeOptions.add_experimental_option('excludeSwitches', ['enable-automation'])
chromeOptions.add_argument("start-maximized")
chromeOptions.add_argument('--no-sandbox')
chromeOptions.add_argument('--disable-gpu')
chromeOptions.add_argument('--disable-dev-shm-usage')
chromeOptions.add_argument("--disable-blink-features=AutomationControlled")
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': dic_path}
chromeOptions.add_experimental_option('prefs', prefs)
chromeOptions.add_experimental_option("useAutomationExtension", False)
chromeOptions.add_argument(
'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36')
browser = webdriver.Chrome(executable_path="C:\Program Files\Google\Chrome\Application\chromedriver.exe",
options=chromeOptions)