热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Selenium爬虫登录生成Cookie

Selenium爬虫登录生成Cookie网站登录,本质上就是登录完成之后服务器给客户端一个凭据,这个凭据可以存在cookie里,也可以存

Selenium爬虫登录生成COOKIE

网站登录,本质上就是登录完成之后服务器给客户端一个凭据,这个凭据可以存在COOKIE里,也可以存在别的地方,客户端下次请求网页的时候带上这个凭据,服务端就会认为这个客户端是登录过的。所以对于爬虫来说,生成COOKIEs是代理使用成为了一个必须要做的事情。

示例

安装chrome和对应driver

下载chrome对应版本的chrome deriver

下载对应版本 driver 
https://chromedriver.chromium.org/downloads

例如:

Selenium爬虫登录生成COOKIE

 

Selenium爬虫登录生成COOKIE

 

生成COOKIEs

我们使用chrome driver来进行登录和COOKIE的生成

import os

import time

import zipfile

from selenium import webdriver

from selenium.common.exceptions import TimeoutException

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.ui import WebDriverWait

class GenCOOKIEs(object):

USER_AGENT = open('useragents.txt').readlines()

# 16yun 代理配置

PROXY_HOST = 't.16yun.cn' # proxy or host 亿牛云代理www.16yun.cn

PROXY_PORT = 31111 # port

PROXY_USER = 'USERNAME' # username

PROXY_PASS = 'PASSWORD' # password

 

@classmethod

def get_chromedriver(cls, use_proxy=False, user_agent=None):

manifest_json = """

{

"version": "1.0.0",

"manifest_version": 2,

"name": "Chrome Proxy",

"permissions": [

"proxy",

"tabs",

"unlimitedStorage",

"storage",

"",

"webRequest",

"webRequestBlocking"

],

"background": {

"scripts": ["background.js"]

},

"minimum_chrome_version":"22.0.0"

}

"""

background_js = """

var config = {

mode: "fixed_servers",

rules: {

singleProxy: {

scheme: "http",

host: "%s",

port: parseInt(%s)

},

bypassList: ["localhost"]

}

};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {

return {

authCredentials: {

username: "%s",

password: "%s"

}

};

}

chrome.webRequest.onAuthRequired.addListener(

callbackFn,

{urls: [""]},

['blocking']

);

""" % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)

path = os.path.dirname(os.path.abspath(__file__))

chrome_options = webdriver.ChromeOptions()

if use_proxy:

pluginfile = 'proxy_auth_plugin.zip'

with zipfile.ZipFile(pluginfile, 'w') as zp:

zp.writestr("manifest.json", manifest_json)

zp.writestr("background.js", background_js)

chrome_options.add_extension(pluginfile)

if user_agent:

chrome_options.add_argument('--user-agent=%s' % user_agent)

driver = webdriver.Chrome(

os.path.join(path, 'chromedriver'),

chrome_options=chrome_options)

return driver

def __init__(self, username, password):

self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https://m.weibo.cn/'

self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)

self.wait = WebDriverWait(self.browser, 20)

self.username = username

self.password = password

def open(self):

"""

打开网页输入用户名密码并点击

:return: None

"""

self.browser.delete_all_COOKIEs()

self.browser.get(self.url)

username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))

password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))

submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))

username.send_keys(self.username)

password.send_keys(self.password)

time.sleep(1)

submit.click()

def password_error(self):

"""

判断是否密码错误

:return:

"""

try:

return WebDriverWait(self.browser, 5).until(


EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))

except TimeoutException:

return False

def get_COOKIEs(self):

"""

获取COOKIEs

:return:

"""

return self.browser.get_COOKIEs()

def main(self):

"""

入口

:return:

"""

self.open()

if self.password_error():

return {

'status': 2,

'content': '用户名或密码错误'

}

# 如果不需要验证码直接登录成功

COOKIEs = self.get_COOKIEs()

return {

'status': 1,

'content': COOKIEs

}

if __name__ == '__main__':

result = GenCOOKIEs(

username='180000000',

password='16yun',

).main()

print(result)

import osimport timeimport zipfilefrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitclass GenCOOKIEs(object):    USER_AGENT = open('useragents.txt').readlines()    # 16yun 代理配置    PROXY_HOST = 't.16yun.cn'  #  proxy or host 亿牛云代理www.16yun.cn    PROXY_PORT = 31111  # port    PROXY_USER = 'USERNAME'  # username    PROXY_PASS = 'PASSWORD'  # password        @classmethod    def get_chromedriver(cls, use_proxy=False, user_agent=None):        manifest_json = """        {            "version": "1.0.0",            "manifest_version": 2,            "name": "Chrome Proxy",            "permissions": [                "proxy",                "tabs",                "unlimitedStorage",                "storage",                "",                "webRequest",                "webRequestBlocking"            ],            "background": {                "scripts": ["background.js"]            },            "minimum_chrome_version":"22.0.0"        }        """        background_js = """        var config = {                mode: "fixed_servers",                rules: {                singleProxy: {                    scheme: "http",                    host: "%s",                    port: parseInt(%s)                },                bypassList: ["localhost"]                }            };        chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});        function callbackFn(details) {            return {                authCredentials: {                    username: "%s",                    password: "%s"                }            };        }        chrome.webRequest.onAuthRequired.addListener(                    callbackFn,                    {urls: [""]},                    ['blocking']        );        """ % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)        path = os.path.dirname(os.path.abspath(__file__))        chrome_options = webdriver.ChromeOptions()        if use_proxy:            pluginfile = 'proxy_auth_plugin.zip'            with zipfile.ZipFile(pluginfile, 'w') as zp:                zp.writestr("manifest.json", manifest_json)                zp.writestr("background.js", background_js)            chrome_options.add_extension(pluginfile)        if user_agent:            chrome_options.add_argument('--user-agent=%s' % user_agent)        driver = webdriver.Chrome(            os.path.join(path, 'chromedriver'),            chrome_options=chrome_options)        return driver    def __init__(self, username, password):        self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https://m.weibo.cn/'        self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)        self.wait = WebDriverWait(self.browser, 20)        self.username = username        self.password = password    def open(self):        """        打开网页输入用户名密码并点击        :return: None        """        self.browser.delete_all_COOKIEs()        self.browser.get(self.url)        username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))        password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))        submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))        username.send_keys(self.username)        password.send_keys(self.password)        time.sleep(1)        submit.click()    def password_error(self):        """        判断是否密码错误        :return:        """        try:            return WebDriverWait(self.browser, 5).until(                EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))        except TimeoutException:            return False    def get_COOKIEs(self):        """        获取COOKIEs        :return:        """        return self.browser.get_COOKIEs()    def main(self):        """        入口        :return:        """        self.open()        if self.password_error():            return {                'status': 2,                'content': '用户名或密码错误'            }        # 如果不需要验证码直接登录成功        COOKIEs = self.get_COOKIEs()        return {            'status': 1,            'content': COOKIEs        }if __name__ == '__main__':    result = GenCOOKIEs(        username='180000000',        password='16yun',    ).main()    print(result)

useragents.txt文件里面是随机的ua

Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/40Mozilla/5.0 (Windows NT 6.2; rv:39.0) Gecko/20100101 Firefox/39.0Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; QQBrowser/8.3.4769.400)Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0

推荐阅读
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 为了优化用户体验,本文探讨了如何调整下拉菜单的宽度。通过合理设置宽度,可以提升界面的美观性和易用性。文章提供了具体的代码示例,帮助开发者实现这一目标。例如,可以通过 CSS 或 JavaScript 来动态调整下拉菜单的宽度,确保其在不同设备和屏幕尺寸上都能保持良好的显示效果。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 为了实现跨浏览器兼容的禁用文本选择功能,可以通过在全局CSS样式中定义一个特定的类来禁止用户选中文本。具体做法是在全局样式表中添加一个名为 `.no-select` 的类,并在需要禁用文本选择的元素上应用该类。这样可以确保在不同浏览器中都能达到一致的效果。此外,还可以结合JavaScript进一步增强用户体验,例如在某些交互场景下动态启用或禁用文本选择功能。 ... [详细]
author-avatar
小心大巧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有