首页 > 编程语言 >Python Selenium使用cookie实现自动登录微博

Python Selenium使用cookie实现自动登录微博

时间:2022-08-28 14:56:24浏览次数:88  
标签:cookies wd 登录 get Python Selenium url 微博 cookie

@

目录


前言

模拟登录微博是实现微博网页爬虫的第一步,现在的微博网页版有个sina visit system,只有登录过后才能获取更多微博内容。本文使用selenium通过预登陆保存cookie到本地,之后重复登录只需要提取本地cookie即可免去每次扫码或者输密码登录。


一、预登陆获取cookie

1) cookie处理

先简单引入两个函数实现保存cookies及读取cookies:

import os
import json

class CookieLogin:
    def __init__(self,f_path):
        """
        对象初始化
        :param url: 首页地址
        :param f_path: Cookies文件保存路径
        """
        # self.url = url
        self.f_path = f_path
        # self.browser = self.start_browser(executable_path)

    def save_cookies(self, data, encoding="utf-8"):
        """
        Cookies保存方法
        :param data: 所保存数据
        :param encoding: 文件编码,默认utf-8
        """
        with open(self.f_path, "w", encoding=encoding) as f_w:
            json.dump(data, f_w)
        print("save done!")

    def load_cookies(self, encoding="utf-8"):
        """
        Cookies读取方法
        :param encoding: 文件编码,默认utf-8
        """
        if os.path.isfile(self.f_path):
            with open(self.f_path, "r", encoding=encoding) as f_r:
                user_cookies = json.load(f_r)
            return user_cookies

2) 预登陆

用selenium模拟登录,人工扫描二维码转到登录页面后,使用wd.get_cookies()保存cookies

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep
from untitled.py爬虫项目.cookies_usage import CookieLogin

prefs = {
    'profile.default_content_setting_values': {
        'notifications': 2  # 隐藏chromedriver的通知
    },
    'credentials_enable_service': False,  # 隐藏chromedriver自带的保存密码功能
    'profile.password_manager_enabled': False  # 隐藏chromedriver自带的保存密码功能
}

# 创建一个配置对象
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', prefs)
options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 设置为开发者模式,禁用chrome正受到自动化检测的显示
options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug

wd = webdriver.Chrome(service=Service(r'D:\Study\chromedriver.exe'), options=options)

# 最大化窗口
wd.maximize_window()
wd.implicitly_wait(5)

url = "https://weibo.com/"
wd.get(url=url)


# 现主页实现登录,用二维码扫就行
wd.find_element(By.XPATH, '//*[@id="__sidebar"]/div/div[1]/div[1]/div/button').click()
sleep(10)

# 保存cookie到本地
cookies = wd.get_cookies()

cookie_fname = 'cookie.json'
login = CookieLogin(cookie_fname)

login.save_cookies(cookies)

wd.close()
wd.quit()

二、登录测试

在这段测试中注意打开网页后一定要多给点睡眠时间,至少4s以上,保证能删除完没有登录时页面的cookies,再重新写入本地保存的登录后cookies。

url = "https://weibo.com/"
wd.get(url=url)

# cooikes = wd.get_cookies()
# for cooike in cooikes:
#     print(cooike)
sleep(4)
wd.delete_all_cookies()

# 持久化登录,之后登录就不需要上面的扫二维码
login = CookieLogin("cookie.json")
cookies = login.load_cookies()
try:
    for cookie in cookies:
        cookie_dict = {
            'domain': '.weibo.com',
            'name': cookie.get('name'),
            'value': cookie.get('value'),
            "expires": '',
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        print(cookie_dict)
        wd.add_cookie(cookie_dict)
except Exception as e:
    print(e)

sleep(5)

wd.refresh()

# cooikes2 = wd.get_cookies()
# for cooike in cooikes2:
#     print(cooike)

sleep(5)
# wd.get(url)
url = "https://s.weibo.com/weibo?q=%E6%96%B0%E5%86%A0%E7%96%AB%E6%83%85"
wd.get(url)

sleep(2)
# cooikes3 = wd.get_cookies()
# for cooike in cooikes2:
#     print(cooike)

wd.close()
wd.quit()

参考博客:

Python Selenium.WebDriver 对Cookies的处理及应用『模拟登录』

标签:cookies,wd,登录,get,Python,Selenium,url,微博,cookie
From: https://www.cnblogs.com/haerxiluo-1/p/16632760.html

相关文章

  • [转]Python PEP8 代码规范常见问题及解决方法
    转自:https://blog.csdn.net/qq_36759224/article/details/89304878 Python的PEP8代码规范,将常见的PEP8代码规范问题和解决方法记录一下,学习一下,养成良好......
  • 记录一次网站上传的python代替方法
    网址:https://tool2-mml.sjtu.edu.cn/VRprofile/VRprofile.php这个网站需要上传文件 思路抓包看下网络请求开始看的时候发现没啥然后用wireshark看了下发现文件上传......
  • 6.8 python基础列表元素的添加操作
     #append()list=[10,20,30,40,50,60,70,80]#列表后面添加元素,可以施单个元素或列表整体list.append(20)#后面添加单个元素print(list)list.append([30,90])#后面......
  • python读取csv文件
    参考此贴:csv格式文件之csv.DictReader()方法_booze-J的博客-CSDN博客_csv.dictreader官方帮助:csv—CSVFileReadingandWriting—Python3.10.6documentationcsv......
  • Python random 的使用
    导入importrandom 随机数生成//用来生成[a,b]之间的随意整数,包括两个边界值。print(random.randint(0,9))//用来随机生成一个0到1之间的浮点数,包括零。0.15790......
  • Python 报错:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char
    报错内容:json.decoder.JSONDecodeError:Expectingvalue:line1column1(char0) 报错代码:print(res.json()) 报错原因:打印请求返回值报错该接口返回值......
  • python before_request详解
    before_request顾名思义,就是在request请求之前做的事情。它会在每一个请求来的时候,都会先去请求before_request注册的函数。before_request需要注册一个函数,可以不需要参......
  • python after_request详解
    after_request是在每一个请求结束之后,再请求的一个钩子函数。它需要有一个参数接收请求的响应。这个示例是使用after_request,对每一个请求后的响应进行分类,从而在请求完成......
  • python文件操作 r w a
    文件操作创建文件"asdf.txt"open()#打开file#文件的位置(路径)mode#操作文件的模式encoding#文件编码方......
  • Python_for_else
    循环“自然”终结(循环条件为假)时else从句会被执行一次,而当循环是由break语句中断时,else子句就不被执行。与for语句相似,while语句中的else子句的语意是一样的∶else块在......