鱼C论坛

 找回密码
 立即注册
查看: 1247|回复: 8

[已解决]求教一下如何读取cookie并保存到指定文件,需要的时候读取

[复制链接]
发表于 2020-6-23 16:37:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求教一下如何读取cookie并保存到指定文件,需要的时候读取
我自己写的总是不成功。

目前的情况是 我自己写的判断如果未登录则跳转到手动登录,登录完成后提取COOKIE。

如果判断有COOKIE文件则用cookie登录。登录后继续执行下一步操作。
最佳答案
2020-6-24 17:54:59
urllib:
import http.cookiejar
import urllib.request

# 保存
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
r = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

# 读取
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt', ignore_discard=True, ignore-expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
r = opener.open('http://www.baidu.com')
print(r.read().decode('utf-i'))


requests:
import requests
# 保存
r = requests.get('https://www.baidu.com')
with open('cookie.txt', 'w') as f:
    for k, v in r.cookies.items():
        print(k,'=',v)
        f.write(k + '#' + v)
import requests
from requests.cookies import RequestsCookieJar
# 读取
jar = RequestsCookieJar()
with open('cookie.txt','r') as f:
    for item in f.readlines():
        k, v = item.split('#')
        jar.set(k, v)
r = requests.get('https://www.baidu.com', cookies=jar)
print(r.status_code)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-24 17:54:59 | 显示全部楼层    本楼为最佳答案   
urllib:
import http.cookiejar
import urllib.request

# 保存
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
r = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

# 读取
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt', ignore_discard=True, ignore-expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
r = opener.open('http://www.baidu.com')
print(r.read().decode('utf-i'))


requests:
import requests
# 保存
r = requests.get('https://www.baidu.com')
with open('cookie.txt', 'w') as f:
    for k, v in r.cookies.items():
        print(k,'=',v)
        f.write(k + '#' + v)
import requests
from requests.cookies import RequestsCookieJar
# 读取
jar = RequestsCookieJar()
with open('cookie.txt','r') as f:
    for item in f.readlines():
        k, v = item.split('#')
        jar.set(k, v)
r = requests.get('https://www.baidu.com', cookies=jar)
print(r.status_code)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-24 23:45:02 | 显示全部楼层

多谢指教 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-25 10:43:38 | 显示全部楼层
shan656 发表于 2020-6-24 23:45
多谢指教 学习了

然后呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-25 16:47:12 | 显示全部楼层

然后我现在还在测试代码  顺便这里祝你端午节快乐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-25 17:45:54 | 显示全部楼层
shan656 发表于 2020-6-25 16:47
然后我现在还在测试代码  顺便这里祝你端午节快乐

端午节快乐。
等你测试成功的消息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-26 11:30:54 | 显示全部楼层
suchocolate 发表于 2020-6-25 17:45
端午节快乐。
等你测试成功的消息。

研究了好几天 还是不太能将你的代码融入我的代码  我还是这样请教您吧.
需要解决 如果有cookie则读取cookie登录,如果没有判断进行登录.
再次感谢您的指教

import requests
import time
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
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#import ygc

def boshishuini(www,username,password):
    #****************以下需要解决  *页面超时等待问题和cookie登录问题.************
    driver = webdriver.Firefox()
    cont = driver.get(www)#打开网址
    print(type(cont))
    print(cont)
    findby = (by.XPATH,"/html/body/div[1]/div[2]/form/dl/dd[3]/button")
    elem = WebDriverWait(driver,10).until(expected_conditions.presence_of_element_located(findby))
    print (elem.get_attribute('value'))
    denglu = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[2]/form/dl/dd[3]/button")))  # 这里可选择多个selector,等到某元素可见
    print(denglu)
    if denglu == True:
        # 输入账号密码
        driver.find_element_by_name("userid").send_keys(username)
        time.sleep(1)
        driver.find_element_by_name("pwd").send_keys(password)
        # 模拟点击登录
        driver.find_element_by_name("sm1").click()
        # 等待3秒
        time.sleep(15)
        #**********这里需要添加获取新的COOKI并保存.**********
    else:
        print('没找到登录按钮,继续执行下一步工作')
    driver.quit()
    #执行反馈
    return

boshishuini('http://www.boshishuini.com/dada','*****','******')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-26 13:25:38 | 显示全部楼层
本帖最后由 suchocolate 于 2020-6-26 13:29 编辑

1.selenium获取的cookie格式和urllib/requests不同,下面是用selenium获取百度的cookies样本:
for item in driver.get_cookies():
    print(item)

{'name': 'BIDUPSID', 'value': 'AC0C72B5367C32A57FC5C7B28143C4BC', 'path': '/', 'domain': '.baidu.com', 'secure': False, 'httpOnly': False, 'expiry': 3740629700}
{'name': 'PSTM', 'value': '1593146053', 'path': '/', 'domain': '.baidu.com', 'secure': False, 'httpOnly': False, 'expiry': 3740629700}
{'name': 'BAIDUID', 'value': 'AC0C72B5367C32A5D02EE2B4E63B2211:FG=1', 'path': '/', 'domain': '.baidu.com', 'secure': False, 'httpOnly': False, 'expiry': 1624682053}
{'name': 'BD_HOME', 'value': '1', 'path': '/', 'domain': 'www.baidu.com', 'secure': False, 'httpOnly': False}
{'name': 'H_PS_PSSID', 'value': '32098_1456_31671_21082_32139_32046_32089_32107', 'path': '/', 'domain': '.baidu.com', 'secure': False, 'httpOnly': False}
{'name': 'BD_UPN', 'value': '13314752', 'path': '/', 'domain': 'www.baidu.com', 'secure': False, 'httpOnly': False, 'expiry': 1594010053}
urllib/requests的cookie只需要key(name)和vlaue,而selenium还有其他参数,所以selenium的cookie如果给urllib/requests用,得筛选出name和value,反之需要补齐其他参数。

2.不太清楚你具体爬的内容,这个网站我无法登陆,不好判断后续具体用什么爬取合适。个人感觉用requests的session就可以,比用selenium更快一些。

3.如果用selenium爬取后续内容,那么cookies就直接保存成pickle就可以,不需要转成txt。
import time
import os
import pickle
import requests
from requests.cookies import RequestsCookieJar
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait


def ck_cookie():
    if not os.path.exists('cookies.pkl'):
        return False
    else:
        return True


def main(www, username, password):
    # ========================================================================
    # 可选配置,使用无头模式,后台运行,不显示浏览器。
    # options = Options()
    # options.add_argument('-headless')
    # 使用geckodriver驱动,需要提前下载。
    # driver = Firefox(executable_path='geckodriver', options=options)
    # ========================================================================
    driver = Firefox()
    wait = WebDriverWait(driver, timeout=10)
    if not ck_cookie():
        driver.get(www)
        wait.until(EC.visibility_of_element_located((By.XPATH, '//button[@class="login-btn"]')))
        driver.find_element_by_name("userid").send_keys(username)
        time.sleep(1)
        driver.find_element_by_name("pwd").send_keys(password)
        time.sleep(1)
        driver.find_element_by_name("sm1").click()
        time.sleep(10)
        cookies = driver.get_cookies()
        pickle.dump(cookies, open("cookies.pkl", "wb"))

    else:
        cookies = pickle.load(open("cookies.pkl", "rb"))
        for cookie in cookies:
            driver.add_cookie(cookie)
        driver.get(www)
        # 之后的动作


if __name__ == '__main__':
    url = 'http://www.boshishuini.com/dada/login.php'
    un = input('Please input username')
    pw = input('Please input password')
    main(url, un, pw)


4.如果后续用requests爬取,需要转成txt:
import time
import os
import pickle
import requests
from requests.cookies import RequestsCookieJar
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait


def ck_cookie():
    if not os.path.exists('cookies.txt'):
        return False
    else:
        return True


def main(www, username, password):
    # ========================================================================
    # 可选配置,使用无头模式,后台运行,不显示浏览器。
    # options = Options()
    # options.add_argument('-headless')
    # 使用geckodriver驱动,需要提前下载。
    # driver = Firefox(executable_path='geckodriver', options=options)
    # ========================================================================
    driver = Firefox()
    wait = WebDriverWait(driver, timeout=10)
    if not ck_cookie():
        driver.get(www)
        wait.until(EC.visibility_of_element_located((By.XPATH, '//button[@class="login-btn"]')))
        driver.find_element_by_name("userid").send_keys(username)
        time.sleep(1)
        driver.find_element_by_name("pwd").send_keys(password)
        time.sleep(1)
        driver.find_element_by_name("sm1").click()
        time.sleep(10)
        with open('cookies.txt', 'w') as f:
            for item in driver.get_cookies():
                f.write(item['name'] + '#' + item['value'])

    else:
        jar = RequestsCookieJar()
        with open('cookie.txt', 'r') as f:
            for item in f.readlines():
                k, v = item.split('#')
                jar.set(k, v)
        r = requests.get(www, cookies=jar)
        # 之后的动作


if __name__ == '__main__':
    url = 'http://www.boshishuini.com/dada/login.php'
    un = input('Please input username')
    pw = input('Please input password')
    main(url, un, pw)


5.以上都是基于selenium获取cookie,实际我看可以用requests.session获取:
import requests
from lxml import etree
from requests.cookies import RequestsCookieJar
import os

def ck_cookie():
    if not os.path.exists('cookies.txt'):
        return False
    else:
        return True


def main(www, username, password):
    headers = {'user-agent': 'firefox', 'host': 'www.boshishuini.com', 'Referer': 'http://www.boshishuini.com/dada/login.php'}
    data = {"gotopage": "", "dopost": "login", "adminstyle": "newdedecms", "sm1": ""}
    # data = {"gotopage": "", "dopost": "login", "adminstyle": "newdedecms", "userid": "admin", "pwd": "admin", "sm1": ""}
    data['userid'] = username
    data['pwd'] = password
    if not ck_cookie():
        s = requests.session()
        r = s.get(www, headers=headers, data=data)
        # html = etree.HTML(r.text)
        with open('cookies.txt', 'w') as f:
            for k, v in r.cookies.items():
                print(k, '=', v)
                f.write(k + '#' + v)
    else:
        jar = RequestsCookieJar()
        with open('cookie.txt', 'r') as f:
            for item in f.readlines():
                k, v = item.split('#')
                jar.set(k, v)
        r = requests.get(www, cookies=jar)
        # 后续动作


if __name__ == '__main__':
    url = 'http://www.boshishuini.com/dada/login.php'
    un = input('Please input username')
    pw = input('Please input password')
    main(url, un, pw)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-26 13:35:39 | 显示全部楼层
suchocolate 发表于 2020-6-26 13:25
1.selenium获取的cookie格式和urllib/requests不同,下面是用selenium获取百度的cookies样本:
urllib/req ...

你真是大神,我不是要爬什么,而是要用这种方式进行可视化,自动化操作.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表