无头浏览器Selenium的使用要点
1、无头浏览器(headless browser)是什么
无头浏览器是指可以在图形界面情况下运行的,可以模拟多种浏览器的运行框架。研发可以通过编程来控制该框架执行各种任务,模拟真实的浏览器操作和各种任务,例如登录、js解析、ajax动态生成、获取cookie等。
2、无头浏览器适合的场景
无头浏览器的框架需要真实运行浏览器,因此系统开销大,采集运行速度慢,相对与一般的爬虫程序,其运行环境要求搭建的工具和库较多,因此如果目标网站反爬不是很难,可以直接通过简单的http请求进行采集,不适合使用无头浏览器方案。
当目标网站有多种验证机制,例如需要验证登录、ajax动生成、js反爬策略,如果研发不能进行网站行为分析的情况下,建议使用无头浏览器伪装正常用户,同时配合使用爬虫代理加强版进行数据采集。
3、无头浏览器框架推荐
无头浏览器有很多,我们推荐如下:
selenium+chrome+chrome driver+爬虫代理加强版
4、下面示例包括各种安装说明及代码
(1)下载chrome对应版本的chrome deriver
下载chrome https://www.google.com/chrome/
下载对应版本 driver https://chromedriver.chromium.org/downloads
注意chrome的版本和deriver的版本一定需要一致,可以查看具体的帮助说明,如果不一致,即使程序能够运行,也会出现爬虫代理认证信息失败,需要弹窗要求手动输入认证信息的问题。
(2)设置开发者模式
如果浏览器正常运行下,navigator.webdriver的值应该是undefined或者false,如果为true目标网站能检测到selenium,设置为开发者模式,可以防止目标网站识别
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])#开启实验性功能
browser=webdriver.Chrome(options=option)# 修改get方法
script = '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})
(3)配合使用爬虫代理加强版
通过无头浏览器模拟用户操作,同时结合爬虫代理加强版实现IP地址自动切换,可以真实的实现用户终端请求,获取相应的数据,下面是获取cookie的代码:
import osimport timeimport zipfilefrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitclass GenCookies(object):# 随机useragentUSER_AGENT = open('useragents.txt').readlines()# 代理服务器(产品官网 www.16yun.cn)PROXY_HOST = 't.16yun.cn' # proxy or hostPROXY_PORT = 31111 # portPROXY_USER = 'USERNAME' # usernamePROXY_PASS = 'PASSWORD' # password@classmethoddef get_chromedriver(cls, use_proxy=False, user_agent=None):manifest_json = """{"version": "1.0.0","manifest_version": 2,"name": "Chrome Proxy","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]},"minimum_chrome_version":"22.0.0"}"""background_js = """var config = {mode: "fixed_servers",rules: {singleProxy: {scheme: "http",host: "%s",port: parseInt(%s)},bypassList: ["localhost"]}};chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});function callbackFn(details) {return {authCredentials: {username: "%s",password: "%s"}};}chrome.webRequest.onAuthRequired.addListener(callbackFn,{urls: ["<all_urls>"]},['blocking']);""" % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)path = os.path.dirname(os.path.abspath(__file__))chrome_options = webdriver.ChromeOptions()# 关闭webdriver的一些标志# chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) if use_proxy:pluginfile = 'proxy_auth_plugin.zip'with zipfile.ZipFile(pluginfile, 'w') as zp:zp.writestr("manifest.json", manifest_json)zp.writestr("background.js", background_js)chrome_options.add_extension(pluginfile)if user_agent:chrome_options.add_argument('--user-agent=%s' % user_agent)driver = webdriver.Chrome(os.path.join(path, 'chromedriver'),chrome_options=chrome_options)# 修改webdriver get属性# script = '''# Object.defineProperty(navigator, 'webdriver', {# get: () => undefined# })# '''# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})return driverdef __init__(self, username, password): # 登录example网站self.url = 'https://passport.test.cn/signin/login?entry=example&r=https://m.test.cn/'self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)self.wait = WebDriverWait(self.browser, 20)self.username = usernameself.password = passworddef open(self):"""打开网页输入用户名密码并点击:return: None"""self.browser.delete_all_cookies()self.browser.get(self.url)username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))username.send_keys(self.username)password.send_keys(self.password)time.sleep(1)submit.click()def password_error(self):"""判断是否密码错误:return:"""try:return WebDriverWait(self.browser, 5).until(EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))except TimeoutException:return Falsedef get_cookies(self):"""获取Cookies:return:"""return self.browser.get_cookies()def main(self):"""入口:return:"""self.open()if self.password_error():return {'status': 2,'content': '用户名或密码错误'} cookies = self.get_cookies()return {'status': 1,'content': cookies}if __name__ == '__main__':result = GenCookies(username='180000000',password='16yun',).main()print(result)
无头浏览器Selenium的使用要点相关推荐
- selenium无头浏览器_无头Selenium浏览器
selenium无头浏览器 重要要点 无头浏览器无需用户界面即可运行. 不再支持PhantomJS. JBrowser驱动程序是Java 8的低开销选项. 如果需要Java 11支持,所有当前的Jav ...
- 基于Python, Selenium, Phantomjs无头浏览器访问页面
引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通常大家在在打开网页的工具就是浏览器,通过界面上输 ...
- python爬虫之selenium,谷歌无头浏览器
python爬虫之selenium和PhantomJS 主要的内容 lenium hantomjs 无头浏览器 的懒加载 一 什么是selenium? 介绍 它是python中的一个第三方库,对外提供 ...
- python——selenium框架实现无头浏览器访问 + 规避检测配置
备注: 有的时候,我们希望,selenium访问的时候,不要出现浏览器, 那么就需要进行配置.具体配置看代码. 运行代码 # !/user/bin/env python # -*- coding: u ...
- python 无头浏览器xhr 文件_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
""" 获取浏览器 打开本地浏览器 打开远程浏览器 关闭浏览器 打开网址 最大化 最小化 标题 url 刷新 python对selenium封装浏览器调用 ------b ...
- python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
""" 获取浏览器 打开本地浏览器 打开远程浏览器 关闭浏览器 打开网址 最大化 最小化 标题 url 刷新 Python对Selenium封装浏览器调用 ------b ...
- [转载] 基于Python, Selenium, Phantomjs无头浏览器访问页面
参考链接: Selenium Python技巧 引言: 在自动化测试以及爬虫领域,无头浏览器的应用场景非常广泛,本文将梳理其中的若干概念和思路,并基于代码示例其中的若干使用技巧. 1. 无头浏览器 通 ...
- selenium防爬无头浏览器和模拟手机浏览器
在edge浏览器中使用webdriver时控制台中window.navigator.webdriver 元素会显示True,正常情况下来说应该是关掉的,所以我们用js来屏蔽掉这个元素 from sel ...
- 干货!一文搞定无头浏览器的概念以及在selenium中的应用
无头浏览器 无头浏览器,即 Headless Browser,是一种没有界面的浏览器.它拥有完整的浏览器内核,包括 JavaScript 解析引擎.渲染引擎等.与普通浏览器最大的不同是,无头浏览器执行 ...
- 记录第一次使用selenium 调用Chrome无头浏览器和options一些参数解析整合
记录第一次使用selenium 调用Chrome无头浏览器和options一些参数解析整合 1.selenium使用 from selenium import webdriver from selen ...
最新文章
- linux搭建markdown服务,Markdown新手快速入门基础教程及Ubuntu下的安装
- Redis三种特殊数据类型
- 四则运算 结对项目
- Mac 打开jupyter
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
- 长春大学计算机学院招生简章,长春大学招生简章
- [ASP.NET MVC]让Html.RenderAction支持Lamda表达式
- aes解密算法 java_AES算法实现Java和JS互通加解密
- 使用Reaver破解开启了WPS功能的wifi密码(wpa/wpa2)
- 笨方法学习python
- 嵌入式单片机学习入门到大牛
- 后台批量刷新金蝶K3物料名称操作步骤
- 2009福布斯中国上市公司最佳CEO榜
- vue+elementUI 表格下载为excel
- Altium Designer之多层板设置
- magma测试与安装,使用(含docker配置)
- 发票查验API可以查验的发票类型有哪些?
- java中金额元转万元工具类
- 物联网新零售项目 订单支付与出货控制
- [Serializable]在C#中的作用-NET 中的对象序列化