简单实例:
from selenium import webdriver
from scrapy.selector import Selector
browser = webdriver.Chrome(executable_path='E:/Template/chromedriver.exe')
browser.get('https://www.zhihu.com/signin?next=%2F')
# 若 css 某种写法无法找到元素,则换一种写法
browser.find_element_by_css_selector('.SignFlow-tabs div:nth-child(2)').click() # 找到密码登录按钮,并进行点击
browser.find_element_by_css_selector('.SignFlow-account input[name="username"]').send_keys('17688718015') # 找到账号输入框,并输入密码
browser.find_element_by_css_selector('.SignFlow-password input[name="password"]').send_keys('tanling.') # 找到密码输入框,并输入密码
browser.find_element_by_css_selector('form[class="SignFlow Login-content"] button[type="submit"]').click() # 找人登录按钮,并进行点击
登录失败:
因为服务器识别到了 Driver 客户端
服务器返回:error: {code: 10001, message: “10001:请求参数异常,请升级客户端后重试”}
解决办法:
不是因为 header 中的参数,而是 chromedriver 中有一些 js 变量
变量中包含 chromedriver 的关键词。
1. 启动 chrome
2. CMD 进入 chrome.exe 目录下
3. 指定端口,启动调试端口,输入命令:chrome.exe --remote-debugging-port=9222
4. 访问:127.0.0.1:9222/json 确保chromedriver 实例已关闭完毕
避免追加输入信息
# 调用按键代码集类,中CONTROL的值,加上 a 键,进行全选输入栏信息,进行覆盖
# 传入键值元素参数至 send_keys 方法中
browser.find_element_by_css_selector('').send_keys(Keys.CONTROL + 'a')
browser.find_element_by_css_selector('').send_keys('17688718015')
mouse(鼠标模拟点击库)
- 避免 selenium 中 click 方法偶尔失效
- 使用 pip 进行安装
- 引入 mouse 库中 move,click 方法
- 传入x,y 轴参数,在调用 click 方法点击
from mouse ifrom mouse import move, clickmport move, click
time.sleep(3)
move(950, 675)
click()
获取 browser 里面的 cookie
COOKIES_ENABLED(启用 cookie)
从上个 Request 返回数据中 获取 Cookie 自动在下个 Request 中*携带***
COOKIES_ENABLED = True
USER_AGENT(用户代理)
后续所有请求,都会携带这个 header 参数
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
DOWNLOADER_MIDDLEWARES(下载器中间件)
DOWNLOADER_MIDDLEWARES = { # 'ArticleSpider.middlewares.ArticlespiderDownloaderMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 2 }
Chrome旧版本,WebDriver 启动 Chrome 失败
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
Selenium环境搭建的问题引起最多的是No browser is open,这种报错导致浏览器无法打开;问题的原因主要是2点
1.浏览器安装默认路径
2.浏览器匹配的驱动没有放在正确的环境变量目录位置(可以代码指定驱动路径)
3.浏览器版本与对应的驱动版本匹配
解决办法:
from selenium import webdriver
options = webdriver.ChromeOptions() # 实例化 ChromeOptions 类
options.binary_location = "chrome.exe PATH" # 传入 chrome.exe 文件路径
browser = webdriver.Chrome(chrome_options=options) # 传入实例化对象 -> 关键字参数 chrome_options