shan656 发表于 2020-6-23 16:37:42

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

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

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

如果判断有COOKIE文件则用cookie登录。登录后继续执行下一步操作。

suchocolate 发表于 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)

shan656 发表于 2020-6-24 23:45:02

suchocolate 发表于 2020-6-24 17:54
urllib:




多谢指教 学习了

suchocolate 发表于 2020-6-25 10:43:38

shan656 发表于 2020-6-24 23:45
多谢指教 学习了

然后呢?

shan656 发表于 2020-6-25 16:47:12

suchocolate 发表于 2020-6-25 10:43
然后呢?

然后我现在还在测试代码顺便这里祝你端午节快乐

suchocolate 发表于 2020-6-25 17:45:54

shan656 发表于 2020-6-25 16:47
然后我现在还在测试代码顺便这里祝你端午节快乐

端午节快乐。
等你测试成功的消息。

shan656 发表于 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/div/form/dl/dd/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/div/form/dl/dd/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','*****','******')

suchocolate 发表于 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)

shan656 发表于 2020-6-26 13:35:39

suchocolate 发表于 2020-6-26 13:25
1.selenium获取的cookie格式和urllib/requests不同,下面是用selenium获取百度的cookies样本:
urllib/req ...

你真是大神,我不是要爬什么,而是要用这种方式进行可视化,自动化操作.
页: [1]
查看完整版本: 求教一下如何读取cookie并保存到指定文件,需要的时候读取