安装与配置
Centos7.9
1、 安装 Chrome 浏览器
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
google-chrome --version
2、安装 ChromeDriver
去 https://npm.taobao.org/mirrors/chromedriver/ 找对应 Chrome 的版本,然后复制下载链接
cd /usr/software
wget https://npm.taobao.org/mirrors/chromedriver/87.0.4280.88/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
ln -s /usr/software/chromedriver /usr/bin/chromedriver
chromedriver --version
Ubuntu 18.04
1、安装chrome浏览器
1、卸载chrome
如果之前已安装chrome但版本太老,和chromedriver版本不匹配,则可以先卸载chrome
sudo apt-get remove google-chrome-stable
2、安装依赖包:
sudo apt-get install libxss1 libappindicator1 libindicator7
3、下载安装包:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
4、安装
sudo dpkg -i google-chrome-stable_current_amd64.deb
5、查看是否安装成功以及安装版本
google-chrome --version
# Google Chrome 80.0.3987.116
安装chrome driver
1、下载安装包
在淘宝镜像网站下载chromedriver,版本需要和已安装的 chrome 版本保持一致;
淘宝镜像: https://npm.taobao.org/mirrors/chromedriver/
下载后放入服务器上,比如放在 /usr/software 路径下
2、安装解压缩工具unzip
sudo apt-get install unzip
3、解压缩+赋予可执行的权限
unzip chromedriver_linux64.zip
chmod +x chromedriver
4、移动到 /usr/local/share 路径下
sudo mv -f chromedriver /usr/local/share/chromedriver
mv -f 是强行覆盖的意思
5、建立软连接
sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
6、验证chromedriver是否安装成功:
chromedriver --version
windows的安装
windows下只需要手动安装 chrome 浏览器,并下载对应的驱动即可,驱动放在和代码一样的路径下即可运行,下载地址同样可以用镜像地址:
https://npm.taobao.org/mirrors/chromedriver/
使用
options相关
需要注意的是,如果chrome未安装在默认路径下,需要通过 option.binary_location 设置chrome的路径,如果chromedriver不和当前代码在一个路径下,也需要设置 chromedriver 的路径。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
option = webdriver.ChromeOptions()
driver = webdriver.Chrome(options = options)
# 手机模式
mobileEmulation = {'deviceName' :'Galaxy S5'}
options.add_experimental_option('mobileEmulation', mobileEmulation)
# 无头模式
option.add_argument('--headless')
# gpu加速关闭
option.add_argument('--disable-gpu')
option.binary_location = r'D:\Google\Chrome\Application\chrome.exe'
option.add_argument('blink-settings=imagesEnabled=false')
option.add_experimental_option("excludeSwitches", ["enable-automation"])
option.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(executable_path="chromedriver",options=option)
options 相关
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000')
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 禁止加载图片
chrome_options.add_argument('--headless')
options.add_argument("--start-maximized") # 开始最大化
options.add_argument("--test-type")
options.add_argument("--ignore-certificate-errors") # 忽略证书错误
options.add_argument("--disable-popup-blocking") # 禁用弹出拦截
options.add_argument("no-sandbox") # 取消沙盒模式
options.add_argument("no-default-browser-check") # 禁止默认浏览器检查
options.add_argument("about:histograms")
options.add_argument("about:cache")
options.add_argument("disable-extensions") # 禁用扩展
options.add_argument("disable-glsl-translator") # 禁用GLSL翻译
options.add_argument("disable-translate")
options.add_argument("--disable-gpu") # 禁用GPU
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--hide-scrollbars") # 隐藏滚动条
webdriver相关
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => false
})
"""
})
# 设置浏览器大小
driver.set_window_size(600,3000)
# 关闭浏览器
driver .quit()
# 关闭当前操作的tab
driver .close()
执行 JS
js = 'window.scrollTo(0,%s)'%(i*100)
driver.execute_script(js)
下拉
1、执行 JS
for i in range(100):
# x管水平,y管垂直
js = 'window.scrollTo(0,%s)'%(i*100)
driver.execute_script(js)
time.sleep(0.5)
2、
点击
注意,需要点击的地方必须是我们可以看到的地方,如果看不到,则需要执行下拉等操作;
a = driver.find_element_by_xpath('//*[@id="product"]/uni-view[4]/uni-view[9]/uni-view[2]/uni-view[6]')
a.click()
selenium添加cookie(绕过登录)
有些网站需要登录,我们可以提前登录,然后拿到cookie字符串,在selenium访问的时候添加cookie:
-
人工登录网站,拿到cookie字符串;
-
selenium访问url;
-
删除当前cookie;
-
依次添加每个cookie,每个cookie必须为字典的形式,且必须有name和value两个key;
-
selenium再次访问url,两次访问的原因是,必须先访问,selenium才能知道cookie属于哪个网站;
driver = webdriver.Chrome(options=option)
driver.get(url)
driver.delete_all_cookies()
cookies = "magicid=95c9HOMFQUfwJOaJQaoKtxH3+A6YuS4v2PaMCR5vthTBaLSQv4yIN4/TI76Mhhde; ASP.NET_SessionId=vo4mepcmaboircxm5bguxsh2; _abtest_userid=c6c22371-bbd9-4a3d-9651-7fb3171cddf4; hoteluuid=5oZm2Xm4lDms2g4L; IsPersonalizedLogin=F"
for line in cookies.split(';'):
key,value = line.split('=',1)
cookie = {}
cookie['name'] = key.replace(" ","")
cookie['value'] = urllib.parse.unquote(value)
print(cookie)
driver.delete_cookie(cookie['name'])
driver.add_cookie(cookie)
driver.get(url)
获取元素
driver.find_element_by_xpath()
滚动加载信息
driver.execute_script('window.scrollTo(0,100000000)')
selenium + linux 无头爬虫
写代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time, json, os
import requests
url = 'https://www.toutiao.com/search/?keyword=庆余年'
option = webdriver.ChromeOptions()
option.add_argument('--headless')
browser = webdriver.Chrome(options=option)
browser.get(url)
cookie_item = {}
for cookie_dict in browser.get_cookies():
cookie_item[cookie_dict['name']] = cookie_dict['value']
print(cookie_item)
browser.quit()
破解滑动验证码
https://www.zhangshengrong.com/p/l51g69YJX0/
https://blog.csdn.net/chushiyan/article/details/101397426
selenium 相关方法
1、判断元素是否可见
element = driver.find_element_by_xpath('//span[@class="descript-btn"]')
print(element.is_displayed())
2、
Selenium 控制 已经打开的浏览器
启动chrome
启动浏览器时要赋予启动参数,指定 remote-debugging-port 和 user-data-dir,可以通过命令行启动 或 快捷方式 启动;
1、命令行启动
在 Google 文件夹所在的根目录:
.\Google\Chrome\Application\chrome.exe --remote-debugging-port=6680 --user-data-dir='.\Google\Chrome\Application\User Data'
2、快捷方式启动
为 chrome.exe 生成一个快捷方式,然后在属性里设置目标:
chrome.exe --remote-debugging-port=9222 --user-data-dir="User Data"
在 selenium 中配置,接管已打开的 chrome
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_driver = "D:/Python/Python37/Scripts/chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
span 按钮 按不到(太大)
1、js
if driver.find_element_by_xpath('/html/body/div[2]/div/div/div[1]/span[1]').is_displayed():
shenqingshanchu = driver.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/span[1]")
driver.execute_script("arguments[0].click();", shenqingshanchu)
2、获取span的长、宽、横纵坐标,找到中间位置点击