干了一晚上,对于我这个新手来说太不友好了,要哭了,终于成功了,加油加油,冲冲冲,发布一下给自己留个纪念
我们先说一下思路,我们在使用selenium自动化的时候,其实和你本人打开网站区别是不大的,那么为什么你打开那个网站就可以登录上,因为你携带了cookie,cookie会保存你的登录信息,在你退出网页后再次点击仍然可以登录上,最重要的是,cookie在比较长一段时间类都是不会变化的,如果发生变化了,多半是你的cookie获取的不对。那么根据这点,我们只要拿到正确的cookie然后在我们给网页发送请求的时候携带上去就可以轻松实现登录。
然后我们着手开始准备代码,第一个我们要获取我们的cookie,这里我们需要安装一个插件,Cookie Editor,非常的好用,可以完美的获得cookie,但是因为是第三方的不知道安不安全,如果觉得不咋安全可以去设置里面找到cookie的管理,然后打开所有的cookie保存网页,这样麻烦很多这里就不介绍了,主要讲这个第三方插件
首先进入我们浏览器的扩展部分,edge浏览器的扩展网址:edge://extensions/
进入以后找到获取扩展的那个,然后搜索去获取,获取成功以后这里有一个提示的,可以大概看看
我设置的快捷键是CTRL加上Y,因为这个我不怎么使用,可以设置自己舒服的快捷键,也可以去浏览器右上角打开,也很好
我们登录一个网页以后,然后打开我们的插件,获取我们的cookie
获取完了以后开始思考我们的代码如何写,这里先提供一下我写的
# 实现模拟登录的一个第三方库,完美成功,非常的牛逼,selenium基本上可以解决所有的登录
from pymongo import MongoClient
import time
import requests
import sys
'''
进行模拟登录,需要的参数是url,和cookies_str,一个可以复制,另一个在浏览器上面的插件可以获取,然后轻松登录,最后为了增强它的可移植性,我们增加了driver参数
cookies_str这个在浏览器上面ctr+y便可以复制了,然后变成我们的字符串参数
'''
# 技术点1:给类传递参数
class Mndl(object):
# 给这个类增加三个参数,记住奥
# url和cookies的字符串,后面还需要还要加一个driver,不然可移植性比较差,登录作用不大
def __init__(self, *var):
try:
self.url = var[0]
except IndexError:
print("错误!!!你没有输入url,cookies_str和driver,请输入它们!!!")
# 关闭python所有进程,包括我们的selenium自动化这些
sys.exit(0)
try:
self.cookies_str = var[1]
except IndexError:
print("错误!!!你没有输入cookies_str和driver,请输入它们!!!")
sys.exit(0)
try:
self.driver = var[2]
except IndexError:
print("错误!!!你没有输入driver,请输入它!!!")
sys.exit(0)
# 主要运行的函数,会登录上去,然后面的话我们并不会关闭页面,会继续让你进行其他的操作,只是达到登录的效果
def run(self):
# 我们自己的报错手段,告诉你哪里有问题,不然你是找不出来的
try:
cookies_list = self.help_cookies()
except Exception as e:
print("请输入正确的cookies_str!!!你的都不可以转换,是不是搞错了")
print("系统报错点,给你看看", e)
sys.exit(0)
try:
requests.get(self.url)
except Exception as e:
print("错误!!!确保你输入的url可以被访问!!!")
print("系统报错点,给你看看", e)
sys.exit(0)
try:
self.driver.get(self.url)
except Exception as e:
print("错误!!!你的参数不是自动化的实例!!!请输入正确的driver!!!")
print("系统报错点:", e)
sys.exit(0)
# 删除原有的所有参数,不然就会检测出来这是一个爬虫,因为有些参数多加了,也登录不上
self.driver.delete_all_cookies()
'''
对于一些大厂来说,他们会想办法阻止你一次性提交所有的cookie,让你报错然后提交不了所有的cookie
这些我们增加一个try,然后刷新,差不多就可以解决这个问题了
'''
# 技术点5,解决大厂报错不让你一次性提交cookie的问题
for i in cookies_list:
# 有些它的url是在不断变化的,也就是说,提交以后是需要刷新的,不然就会告诉你域名不匹配,所以要使用try,保证我们所有的cookie可以提交上去
try:
self.driver.add_cookie(i)
except:
# 刷新一下是和get那个url不一样的,刷新它会指定url,然后域名就会不同,靠这个防止自动化,所以我们需要刷新
self.driver.refresh()
time.sleep(0.5)
self.driver.add_cookie(i)
time.sleep(3)
# 页面刷新
self.driver.refresh()
# 技术点2,本函数把导入的cookies_str变成一个完美的列表,里面内容都是字典,并且是python格式的
# 他还会把这些数据写道我们的数据库里面去,方便我们观察
def help_cookies(self):
# 因为我们的str里面有一些python无法解析的字符,所以要这样变成一个完美的列表
cookies_list = eval(self.cookies_str.replace("false", "False").replace("true", "True"))
client = MongoClient("localhost", 27017)
db = client["python"]
# 这是一个关于cookies的集合,后面去Mongodb里面看看
col = db["cookies"]
# 删除所有数据先,不然加上之前的数据没法看
col.delete_many({})
# 写入数据,为什么要这么做呢,因为让它变得有可扩展性,写入以后就可以提取然后换个地方面登录,也不知道有没有用
col.insert_many(cookies_list)
for cookie in cookies_list:
# 技术点3,因为我们的sameSite的值是python无法解析的,所以删掉或者替换变成其他的
# 技术点4,我们提交mongodb以后它会增加一些东西,需要删掉
del cookie['sameSite'], cookie["_id"]
return cookies_list
'''
学习到的一些技术
eval()的使用,之前老师讲过现在终于想起来了,很厉害的用法,没有它基本上就失败了
向一个类传递参数,然后使用这些参数
'''
虽然写得比较拉跨,还有点小骄傲,但是还是得讲讲我的一个思路。这个可以根据自己的使用环境进行修改的,因为要同时登录两个网站,而且都是url加上cookie的使用,url就是它的登录界面,cookie就是我们携带的登录参数,那么如果我可以对于每一个网站都只输入url加上cookie是不是就可以都实现登录了,非常的轻松,而且理论上是成立的,那么要达到这样的效果,于是我写了一个第三方辅助文件,只要把参数输入进去了,基本上就可以登录上了。
讲解一下我这个第三方文件,我们登录以后肯定是希望能去做一些事情的,而不是啥也干不了,为了增强它的作用性,我们增加一个参数而不是直接在第三方文件里面写代码,那就是driver,selenium的基本用法里面有的,然后我们在我们自己的文件上面创建一个浏览器的实例,然后命名输入,欸嘿,登录以后也可以进行操作了,就很舒服,然后为了增强代码的可扩展性,我打算把它写进mongodb里面去,后面有需要了别人也可以访问到这个cookies,也可以实现模拟登录,但是这样就要多写一些代码,比较麻烦,没有下载pymongo和学习mongodb的好兄弟就修改一下代码,具体就是去掉2,81-88行代码,还有92行代码里面的cookie["_id"],也是可以使用的
这些东西搞好了以后,在同等目录下新建一个文档,然后把url和cookie搞上去,我们就可以开始实现啦,这边是我的一个代码块,可以看看
# 第一次使用自己写的第三方库,模拟登录b站,QQ空间也尝试了一下,成功了
import time
# 导入我们的第三方库
from get_help import Mndl
from selenium import webdriver
cookies_str = '''
[
{
"domain": ".bilibili.com",
"expirationDate": 1675669981,
"hostOnly": false,
"httpOnly": false,
"name": "_uuid",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "A75779EB-4585-5878-3E43-6D32A3D55C1681507infoc",
"id": 1
},
{
"domain": ".bilibili.com",
"hostOnly": false,
"httpOnly": false,
"name": "b_lsid",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": true,
"storeId": "0",
"value": "81B856C10_17EFE7419A2",
"id": 2
},
{
"domain": ".bilibili.com",
"expirationDate": 1675677272,
"hostOnly": false,
"httpOnly": false,
"name": "b_ut",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "5",
"id": 3
},
{
"domain": ".bilibili.com",
"expirationDate": 1659689909,
"hostOnly": false,
"httpOnly": false,
"name": "bili_jct",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "a3b2fd3a87c83edcd60706d0e065a388",
"id": 4
},
{
"domain": ".bilibili.com",
"expirationDate": 1676361767,
"hostOnly": false,
"httpOnly": false,
"name": "blackside_state",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "1",
"id": 5
},
{
"domain": ".bilibili.com",
"expirationDate": 1647533178,
"hostOnly": false,
"httpOnly": false,
"name": "bp_video_offset_1886803835",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "627486273749365200",
"id": 6
},
{
"domain": ".bilibili.com",
"expirationDate": 1738746918,
"hostOnly": false,
"httpOnly": false,
"name": "buvid_fp",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "1c8c7dbd98c2c133528a0cc10c550eda",
"id": 7
},
{
"domain": ".bilibili.com",
"expirationDate": 1675674879,
"hostOnly": false,
"httpOnly": false,
"name": "buvid_fp_plain",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "undefined",
"id": 8
},
{
"domain": ".bilibili.com",
"expirationDate": 1675669979,
"hostOnly": false,
"httpOnly": false,
"name": "buvid3",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "A95BACD3-53CB-3603-68EE-66D2B733716B80619infoc",
"id": 9
},
{
"domain": ".bilibili.com",
"expirationDate": 1738741987,
"hostOnly": false,
"httpOnly": false,
"name": "buvid4",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "02D5CC9B-3352-A632-5E86-31182806CC8587874-022020615-B1501ZPp4rPBpvbG1w4m6Q%3D%3D",
"id": 10
},
{
"domain": ".bilibili.com",
"expirationDate": 1676368449,
"hostOnly": false,
"httpOnly": false,
"name": "CURRENT_BLACKGAP",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "0",
"id": 11
},
{
"domain": ".bilibili.com",
"expirationDate": 1676476538,
"hostOnly": false,
"httpOnly": false,
"name": "CURRENT_FNVAL",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "4048",
"id": 12
},
{
"domain": ".bilibili.com",
"expirationDate": 1659689909,
"hostOnly": false,
"httpOnly": false,
"name": "DedeUserID",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "1886803835",
"id": 13
},
{
"domain": ".bilibili.com",
"expirationDate": 1659689909,
"hostOnly": false,
"httpOnly": false,
"name": "DedeUserID__ckMd5",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "685099826b0c2de5",
"id": 14
},
{
"domain": ".bilibili.com",
"expirationDate": 1675674878,
"hostOnly": false,
"httpOnly": false,
"name": "fingerprint",
"path": "/",
"sameSite": "unspecified",
"secure": false,
"session": false,
"storeId": "0",
"value": "1c8c7dbd98c2c133528a0cc10c550eda",
"id": 15
}
]
'''
url = "https://www.bilibili.com/"
driver = webdriver.Edge(executable_path="D:/python/学习/selenium自动化学习/msedgedriver")
mndl = Mndl(url, cookies_str, driver)
mndl.run()
time.sleep(10)
cookies_str就是我复制下来的cookie,是不是特别多,不过特别好用。主要奥,要加上三引号,这样就不会报错啦,你们看到的这个我修改过了一些值,然后你们就登录不了我的b站啦,要登录QQ空间也是这样,把url和cookie_str换了就可以。我在我的第三方文件里面写了很多的注释来方便理解,也方便我自己回忆
基本一些网站都可以模拟登录上了,非常的不容易,大家有兴趣也可以一起交流交流,说实在的,我现在还不知道爬虫爬取视频是怎么弄的,获取响应下载以后就是无法播放,而且好多视频都是断断续续的,不知道怎么办,you-get库试过了,但是报错,估计得后面自己修改一下里面的一些代码了,哎,加油加油,致敬每一个不甘平凡的自己。
冲冲冲!!!
“原谅我这一生放荡不羁爱自由,也会怕有一天会跌倒~~~,背弃了理想,谁人都阔以,也会怕哪天只你共我~~~”