python中selenium使用

目录

    • 一、简介
    • 二、安装
    • 三、下载驱动器
    • 四、简单实例
    • 五、配置浏览器
      • (一)配置浏览器
      • (二)添加代理
    • 六、定位标签
    • 七、页面操作
    • 八、等待页面加载
      • (一)显示等待
      • (二)隐式等待
    • 九、自动点赞实现
      • 一)导入第三方库
      • (二)登录账号
    • 完整代码

一、简介

我们模拟登陆用的是selenium库,selenium是一个自动化测试工具,在爬虫中通常用来进行模拟登陆。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,同时Selenium也支持多种语言开发,比如 Java,C,Ruby、Python等等。

二、安装

安装selenuim包
pip install selenuim

三、下载驱动器

驱动器是我们在通过selenium模拟用户操作时需要的一个工具,我这里用的是Chromedriver(谷歌浏览器驱动,对应谷歌浏览器),下面是Chrome、Firefox、Safari等浏览器驱动的下载地址

【Chrome驱动下载地址】

【Firefox驱动下载地址】

【Safari驱动下载地址】

下载完成后我们有两种调用驱动器的方法,一种是把驱动器放到py文件同一文件夹下,另外一种就是将驱动器放到Python的安装目录下,以下是我的Python安装目录
python中selenium使用_第1张图片

注:网上流传比较广的方法是将驱动器加到环境变量中,但是我试了好像不怎么管用依然会报错,所以我就不放到这里(实践过确实有效的童鞋,可以在文章下方留言,在此感谢你的分享)

四、简单实例

来一段代码让我们直观的理解一下selenium吧

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')

运行代码,我们可以看到跳出如下的浏览器界面

下面我们将继续完善代码来实现自动化,在搜索框中输入“明天依旧可好”–>点击搜索结果的第一条

time.sleep(1)
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依旧可好")
time.sleep(2)
driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()

五、配置浏览器

我们在使用 selenium 时,可能需要对 chrome 做一些特殊的设置,以完成我们期望的浏览器行为,比如最大化窗口,无窗口启动 等动作。这些需要selenium的ChromeOptions来帮助我们完成

(一)配置浏览器

chromeoptions 是一个方便控制 chrome 启动时属性的类,主要提供如下的功能:

设置 chrome 二进制文件位置 (binary_location)
添加启动参数 (add_argument)
添加扩展应用 (add_extension, add_encoded_extension)
添加实验性质的设置参数 (add_experimental_option)
设置调试器地址 (debugger_address)
常用设置举例:

#设置无窗口

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://blog.csdn.net/qq_38251616'

1.add_argument常用系列

无窗口:- -headless
启动就最大化:- -start-maximized
设置窗口大小:- -window-size=100,100
禁用弹出拦截:- -disable-popup-blocking
禁用插件:- -disable-plugins
禁用图像:- -disable-images
伪装iphone登录:- -user-agent=iphone
伪装android:- -user-agent=android
设置语言为简体中文:- -lang=zh-CN
使用给定的 User-Agent 字符串:- -user-agent=“这里填写User-Agent”
禁用Javascript:- -disable-javascript
指定用户文件夹User Data路径:- -user-data-dir="[PATH]"
注释:两个“-”中间是没有空格的,由于排版原因我在中间加了一个空格。

(二)添加代理

chrome_options = webdriver.ChromeOptions()
#设置代理
chrome_options.add_argument('--proxy-server=http://{ip}:{port}')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://blog.csdn.net/qq_38251616')

六、定位标签

定位方法示例:

#获取网页中的h1标签
h1 = driver.find_element_by_name("h1")
#获取网页中所有的h1标签
h1_list = driver.find_elements_by_name("h1")

单个元素选取:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
多个元素选取:element加s

find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

七、页面操作

selenium最主要的优势在于我们可以在代码中添加需要对网页进行的操作,比如输入提交表单、点击按钮、清空输入框等等。下面我将常用的操作一一列举出

操作名称 代码
点击 driver.find_element_by_xpath("//div[@class='result c-container ']//h3/a").click()
输入文本 driver.find_element_by_xpath("//input[@name=‘wd’]").send_keys(“明天依旧可好”)
清空输入框 driver.find_element_by_xpath("//input[@name=‘wd’]").clear()
关闭浏览器 driver.quit()
关闭页面 driver.close()
切换窗口 #获取所有已经打开的窗口句window_handle_list = driver.window_handle#切换回第一个窗口,通过句柄实driver.switch_to_window(window_handle_list[0])
查看渲染后的数据 driver.page_source
查看请求页面后的cookies值 driver.get_cookies())
查看请求的url driver.current_ur7
页面前进 driver. forward()
页面后退 driver.back()
进入嵌套网页(一般用于账号登陆等嵌套网页) driver.switch_to frame(0)#0表示进入嵌套的第一个标签,通过数字进行索引

模拟豆瓣登录python中selenium使用_第2张图片

八、等待页面加载

(一)显示等待

显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。 最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。 下面有一些方便的方法让你只等待需要的时间。WebDriverWait结合ExpectedCondition 是实现的一种方式。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
	element = WebDriverWait(driver, 10).until(           
		EC.presence_of_element_located((By.XPATH, "//input[@name='wd']")))
finally:
	print("网页加载完成")

上面的代码最多等待 10 秒,超时后就抛出 TimeoutException,假设在第4秒就找到了这个元素,那么也就不会多等剩下的6秒使时间,而是继续执行后续代码。WebDriverWait 默认每 500 毫秒调用一次 ExpectedCondition 中的方法,直到它返回成功信号,如果成功,则返回相应的内容,否则返回布尔类型的 False。

我这个是通过Xpath规则//input[@name=‘wd’]来判断页面是否渲染完成,当然你也可以换成其他的判断条件。我给出如下模板,

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
	element = WebDriverWait(driver, 等待时间范围).until(           
		EC.实现条件((By.定位方式, 定位值)))
finally:
	print("网页加载完成")

(二)隐式等待

隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间。默认设置是0秒。一旦设置了隐式等待时间,它的作用范围就是Webdriver对象实例的整个生命周期。

from selenium import webdriver

driver = webdriver.Chrome(chrome_options=chrome_options)
driver.implicitly_wait(10)

driver.get('http://www.baidu.com/')
driver.find_element_by_xpath("//input[@name='wd']").send_keys("明天依旧可好")

九、自动点赞实现

一)导入第三方库

对于selenium还没安装的童鞋可以用在命令行中安装

pip install selenium

import time,json,random
from selenium import webdriver

(二)登录账号

在selenium安装完成后,需要下一个驱动器(即chromedriver.exe)

【谷歌驱动器下载】

而后运行代码

driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get("https://passport.csdn.net/account/login")

可以看到弹出CSDN的登录界面

python中selenium使用_第3张图片

我们这里采用的是账号密码登录方式,我们再来做一个切换,点击“账号登录”

time.sleep(3)
#进入账号密码登录界面
driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()#通过clic点击上方的“账号登录”实现转换,必须氮元素,element不能加s
time.sleep(3)

看到如下界面
python中selenium使用_第4张图片
最后我们清空账号密码框,将自己的CSDN账号密码输入进去即可

#清空账号框中的内容
driver.find_element_by_xpath("//input[@name='username']").clear()
print("账号框清空完成")
#自动填入登录用户名
driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
print("账号输入完成")
#清空密码框中的内容
driver.find_element_by_xpath("//input[@name='password']").clear()
#自动填入登录密码
driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
time.sleep(3)
#点击登录
driver.find_element_by_xpath("//input[@class='logging']").click()

大家可能也注意到了我代码上用了很多time.sleep()进行休眠,这个是为了给服务器一个反应时间。拿输入账号密码后的登录操作来举例,如果你在输入账号密码后立即登录,系统会报出账号密码错误的提起,这个是由于我们代码输入账号密码的速度太快了,服务器还没接收到你输入的信息,代码就已经登录操作了,它自然会给你报错。当然人工输入是不会遇到这个问题的,你速度没那么快嘛。

(三)保存cookies到文件中
在介绍下面的内容前,我先来介绍几个知识点

json.loads()是将str转化成dict格式
json.dumps()是将dict转化成str格式。
json.dump(dict,fp)把dict转换成str类型存到fp指向的文件里。
json.load(fp)把fp指向的文件里的内容读取出来。
#获取并保存cookies

cookies = driver.get_cookies()
with open("cookies.txt", "w") as fp:
	json.dump(cookies, fp)

(四)读取并传入cookies
这里我么将事先存入cookies.txt文件中的cookies提取出来加载进去即可。这里我补充一些webdriver中提供了操作cookie的相关方法:

get_cookies()    获得cookie信息
add_cookie(cookie_dict) 添加cookie
delete_cookie(name) 删除特定(部分)的cookie
delete_all_cookies() 删除所有的cookie

driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
with open("cookies.txt", "r") as fp:
	cookies = json.load(fp)
	for cookie in cookies:
		driver.add_cookie(cookie)
1

(五)实现自动点赞

driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
time.sleep(3)
driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
print("点赞完成!")
time.sleep(3)

完。。。。

完整代码

#CSDN自动点赞

import time,json,random
from selenium import webdriver

#CSDN账号
account_CSDN = "你的账号"
#CSDN密码
password_CSDN = "你的密码"

def CSDN_login():
	'''
	登录CSDN并保存cookies
	'''
	driver = webdriver.Chrome(executable_path='chromedriver.exe')
	driver.get("https://passport.csdn.net/account/login")
	time.sleep(3)
	#进入账号密码登录界面
	driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()
	time.sleep(3)
	#清空账号框中的内容
	driver.find_element_by_xpath("//input[@name='username']").clear()
	print("账号框清空完成")
	#自动填入登录用户名
	driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
	print("账号输入完成")
	#清空密码框中的内容
	driver.find_element_by_xpath("//input[@name='password']").clear()
	#自动填入登录密码
	driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
	time.sleep(3)
	#点击登录
	driver.find_element_by_xpath("//input[@class='logging']").click()

	#获取并保存cookies
	cookies = driver.get_cookies()
	with open("cookies.txt", "w") as fp:
		json.dump(cookies, fp)


def dianZan(url_list):
	'''
	实现自动点赞功能
	'''
	driver = webdriver.Chrome(executable_path='chromedriver.exe')
	driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
	with open("cookies.txt", "r") as fp:
		cookies = json.load(fp)
		for cookie in cookies:
			driver.add_cookie(cookie)

	print("cookies加载完成,成功登录")
	time.sleep(3)
	driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
	time.sleep(3)
	driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
	print("点赞完成!")
	time.sleep(3)

if __name__ == '__main__':
	url_list = ""
	CSDN_login()
	dianZan(url_list)

你可能感兴趣的:(python中selenium使用)