文章目录
- 一、Cookie介绍
- 二、使用Selenium获取Cookies信息(登入)
- 三、带Cookies操作页面(Selenium)
- 四、带Cookies操做页面(session)
- 五、自动登入(验证处理)
一、Cookie介绍
通常在发起请求登入之后,再次发起请求又恢复为未登入状态,即第一次请求的登入信息不会保存至第二次请求中,如果要在第二次请求中共使用第一次的登入信息,这里就需要使用到Cookie。Cookie是用来让服务端记录客户端的相关状态。session可以进行请求的发送,如果请求产生了Cookie,则该Cookie会被自动存储在该session中
二、使用Selenium获取Cookies信息(登入)
selenium可以对页面进行自动化操作,在碰到需要登入信息的时候,一般开始自动化时没有登入信息,可以使用selenium模块提前将登入的相关信息打印出来或者使用文件保存起来,在下一次使用的时候,读取使用该信息,加入进去,在selenium对网页发起请求时,就已经包含了账户信息,具体的操作如下
首先,我们写入一段程序,获取登入信息,这里一般是直接请求到登入界面,使用扫码或某种方式登入,操作完成之后将获取的信息打印出来,或者将信息保存为文件,在下一次使用的时候将读取其文件。这里注意,在打印登入信息之前(Cookies)一定要给定足够的延时,以足够你完成登入操作,如果没有延时或者延时过短,打印信息时可能还是未登入的信息(Cookies)。(很多网站为了安全,获得的Cookies登入信息一般都有一定的时效性,一般不会长期有效)
python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
# 需要请求的网址,这里一般可以直接请求登入界面,接着发出get请求
url = 'https://www.xxx.cn/resources/login.html'
browser.get(url)
# 此时,就是看你怎么登入,要么输入信息登入,要么跳转至某界面扫码登入,这个自行解决
# 我选择扫码登入,此处使用Xpath定位查找点击跳转至扫码登入界面,然后click函数自动点击,就会跳转至Xpath界面,这里直接手动点入跳转也可
login = browser.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[2]/a')
login.click()
# 注:此处一定要留够充足的时间,以足够完成登入操作,确保后面获取的Cookies登入信息为登入信息是登入状态的,如果没有下面延时或者延时不充足,可能导致获取的Cookies信息还是未登入的状态,影响后期使用
time.sleep(10)
# 获取登入信息(Cookies),将其打印出来,或者保存为文件
cookies = browser.get_cookies()
print(cookies)
如果将其界面化,这个可以封装为一个函数,将某个按钮绑定该函数,点击时,即可触发,然后完成操作,将登入信息保存为全局变量,在界面上做其他操作时,可使用该全局变量。
三、带Cookies操作页面(Selenium)
这里将上面获取的Cookies信息复制过滤,赋值给下面cookies变量,然后使用add_cookie
将其加入,如果操作时切换到了新的窗口,则需要使用switch_to.window
切换至新的界面,如果网站随机使用两种方案,可以使用try except
使用两种方案进行解析
python
import selenium.common.exceptions
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 首先正常创建对象,对某网址发起请求,这里的请求不包含登入信息
q = webdriver.Chrome()
q.get('https://www.xxx.cn/index.html')
time.sleep(1)
# 这里将上面打印的用户信息(Cookies)复制过来,是一个列的格式,列表里面为字典,使用for循环将cookies一项一项的加入进入
cookies = []
for cookie in cookies:
q.add_cookie(cookie)
time.sleep(1)
# 接着对需要请求的网站发起请求,此处的请求已经包含了登入信息
q.get('https://www.xxx.cn')
# 接着对该网站操作(如输入、清除、单击等)
star = q.find_element(By.XPATH, '//*[@id="fromStationText"]') # 定位输入框(此处为Xpath)
star.clear() # 对定位的输入框清除原有内容
star.send_keys("hello") # 此处对查找到的输入框进行输入hello
runsta = q.find_element(By.XPATH, '//*[@id="search_one"]') # 定位按钮(此处为Xpath)
runsta.click() # 对定位的按钮进行单击操作
time.sleep(1)
# 这里如果跳转弹出了新窗口,需要进行如下操作,切换至当前窗口进行操作,否则将会查找不到元素
# 如果在原来的窗口跳转至新的网址,则不需要进行如下操作
currentWin = q.current_window_handle
handles = q.window_handles
for i in handles:
if currentWin == i:
continue
else:
q.switch_to.window(i)
time.sleep(1)
# 如果要对网址进行批量操作(如获取网址显示的为列表,获取其信息),可以使用for循环
# 部分网站会存在两种方案,反复进入网页对元素进行定位,会发现有两种解析格式,这里可以使用try方式
for i in range(1, 1000, 2):
# 这里两种不同的解析方案
try:
# 方案一
# 使用XPath定位获取信息并打印
a = q.find_element(By.XPATH, '/html/body/div[1]/div[9]/div[12]/table/tbody/tr[{}]/td[1]/div/div[1]/div/a'.format(i))
b = q.find_element(By.XPATH, '/html/body/div[1]/div[9]/div[12]/table/tbody/tr[{}]/td[4]'.format(i))
print(a.text, b.text)
except selenium.common.exceptions.NoSuchElementException as e:
# 方案二
# 使用XPath定位获取信息并打印
a = q.find_element(By.XPATH, '/html/body/div[2]/div[8]/div[12]/table/tbody/tr[{}]/td[1]/div/div[1]/div/a'.format(i))
b = q.find_element(By.XPATH, '/html/body/div[2]/div[8]/div[12]/table/tbody/tr[{}]/td[4]'.format(i))
print(a.text, b.text)
这里的一系列操作可以封装为函数绑定某个按钮,点击按钮即可触发,cookies使用全局变量,即上面登入时获取的cookies信息
更多selenium操作详情请看https://blog.csdn.net/weixin_46287157/article/details/129149265
四、带Cookies操做页面(session)
可以使用信息直接使用session登入
python
# 登入的URL
login_url = ''
# 登入带入的参数,如email为账户,pwd为密码,code为验证码
# 这种参数具体的得根据具体的网址,一般会通过一些加密,需要反向解析
data = {
'email': '',
'pwd': '',
'code': ''
}
# 抓取登入后的页面,使用session进行POST请求的发送,session中获取了Cookie
login_page_text = session.post(url=login_url, headers=headers, data=data)
在这也可以使用上面使用selenium获取的Cookies信息,加入到session中,发起请求时已经包含了登入信息
python
import requests
# selenium获取的Cookies复制过来
cookies = []
# 创建对象并将Cookies信息加入,具体那些键值对得根据具体网址来
session = requests.session()
for cookie in cookies:
session.cookies.set(cookie['name'], cookie['value'])
# 发起请求,获取网址文件
page = session.get(browser.current_url)
page.encoding = "utf-8"
html = page.text
# 保存源码
with open('./a.html', 'w', encoding='utf-8') as fp:
fp.write(page.text)
五、自动登入(验证处理)
上面为了方便,登入操作都是手动,也可以将登入操作自动化,只不过一些大网址会比较麻烦,比如需要图片验证码、手机验证码或其他什么方式验证,有些验证可以借助于第三方工具,比如超级鹰等其他第三方平台
1、超级鹰(图片验证码)
超级鹰的基本用法:www.chaojiying.com/about.html
以登入某网站为例,为保证请求页面的验证码和登入的一样,不能做两次请求,可以借助于截图的方式,将页面进行截图,然后截取验证码部分,利用第三方工具进行处理,获取信息或操作后进行登入操作。这里采用的是截图裁剪
方式
python
from PIL import Image
# 请求页面全局截图且保存
bro.save_screenshot('a.png')
# 确定验证码坐标(裁剪区域)
code_img_ele = bro.find_element('') # 图片标签
location = code_img_ele.location # 验证码左上角坐标 x y
size = code_img_ele.size # 宽度
# 左上角和右下角位子
rangle = (int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height']))
# 图片裁剪
i = Image.Open('./a.png')
frame = i.crop(rangle)
frame.save('code.png')