看这篇文章之前大家可以先看下我的上一篇文章:cookies详解

本篇我们就针对上一篇来说一下cookies的基本应用

使用selenium模拟登陆百度

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.wait import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from PIL import Image
  6. chrome_option = webdriver.ChromeOptions()
  7. chrome_path = "/usr1/webdrivers/chromedriver"
  8. def login_baidu():
  9. driver = None
  10. try:
  11. driver = webdriver.Chrome(executable_path=chrome_path)
  12. driver.get("https://www.baidu.com")
  13. print(driver.title)
  14. WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="u1"]/*[@class="lb"]')))
  15. element = driver.find_element_by_xpath('//*[@id="u1"]/a[7]')
  16. element.click()
  17. WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__footerULoginBtn"]')))
  18. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]')
  19. element.click()
  20. WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__userName"]')))
  21. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]')
  22. element.send_keys("账号")
  23. WebDriverWait(driver, 10, 0.5).until(
  24. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__password"]')))
  25. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]')
  26. element.send_keys("密码")
  27. WebDriverWait(driver, 10, 0.5).until(
  28. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCodeImg"]')))
  29. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCodeImg"]')
  30. driver.get_screenshot_as_file("qrcode.png")
  31. image = Image.open("qrcode.png")
  32. left = element.location.get("x")
  33. top = element.location.get("y")
  34. right = left + element.size.get("width")
  35. bottom = top + element.size.get("height")
  36. cropImg = image.crop((left, top, right, bottom))
  37. cropImg.save("code.png")
  38. yanzheng = input(">>>")
  39. WebDriverWait(driver, 10, 0.5).until(
  40. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__verifyCode"]')))
  41. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__verifyCode"]')
  42. element.send_keys(yanzheng)
  43. WebDriverWait(driver, 10, 0.5).until(
  44. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__PSP_10__submit"]')))
  45. element = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]')
  46. element.click()
  47. # 如果需要手机验证码
  48. try:
  49. WebDriverWait(driver, 10, 0.5).until(
  50. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_send_mobile"]')))
  51. element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_send_mobile"]')
  52. element.click()
  53. WebDriverWait(driver, 10, 0.5).until(
  54. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__input_vcode"]')))
  55. element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__input_vcode"]')
  56. duanxin = input(">>>")
  57. element.send_keys(duanxin)
  58. WebDriverWait(driver, 10, 0.5).until(
  59. EC.element_to_be_clickable((By.XPATH, '//*[@id="TANGRAM__36__button_submit"]')))
  60. element = driver.find_element_by_xpath('//*[@id="TANGRAM__36__button_submit"]')
  61. element.click()
  62. except Exception as e:
  63. print(e)
  64. driver.get_screenshot_as_file("screen.png")
  65. finally:
  66. print("关闭")
  67. if driver:
  68. driver.quit()

selenium操作很简单,这里不做详解讲解,以后我们开爬虫基础系列文章的时候会讲到。

selenium保存cookies

  1. cookies = driver.get_cookies()
  2. with open("cookies.txt", "w") as fp:
  3. json.dump(cookies, fp)

这里切记,如果我们要使用json.load读取数据,那么一定要使用json.dump来写入数据,不能使用str(cookies)直接转为字符串进行保存,因为其存储格式不同。这样我们就将cookies保存在文件中了。

selenium读取cookies

  1. def read_cookies():
  2. # 设置cookies前必须访问一次百度的页面
  3. driver.get("http://www.baidu.com")
  4. with open("cookies.txt", "r") as fp:
  5. cookies = json.load(fp)
  6. for cookie in cookies:
  7. # cookie.pop('domain') # 如果报domain无效的错误
  8. driver.add_cookie(cookie)
  9. driver.get("http://www.baidu.com")

这里不用登录就会直接显示我的用户名。而且要注意不同的浏览器可能处理方式不同,比如在火狐浏览器中就会报错:selenium.common.exceptions.InvalidCookieDomainException: Message: .baidu.com,如果碰到这种错误(不一定,也可能跟系统、浏览器都有关系),在add_cookie的时候我们可以把domain去掉就行了。

requests读取cookies

  1. import requests
  2. from requests.cookies import RequestsCookieJar
  3. s = requests.session()
  4. s.verify = False
  5. s.headers = {
  6. "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
  7. }
  8. s.get("http://www.baidu.com")
  9. #这里我们使用cookie对象进行处理
  10. jar = RequestsCookieJar()
  11. with open("cookies.txt", "r") as fp:
  12. cookies = json.load(fp)
  13. for cookie in cookies:
  14. jar.set(cookie['name'], cookie['value'])
  15. #百度个人中心
  16. r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=jar)
  17. # 也可以使用字典设置
  18. cookies_dict = dict()
  19. with open("cookies.txt", "r") as fp:
  20. cookies = json.load(fp)
  21. for cookie in cookies:
  22. cookies_dict[cookie['name']] = cookie['value']
  23. r = s.get("https://www.baidu.com/p/setting/profile/basic", cookies=cookies_dict)
  24. r.encoding = "utf-8"
  25. print(r.text)

requests库可以使用cookies对象和dict对象来指定cookies,这个可以看一下源码

通过requests读取cookies的使用,我们知道在cookies中我们一般只使用name和value,像domain、path等值都是不需要使用的,而且上面传入cookies字典的例子我们知道,只要保存了cookies中的name和value,无论你以什么样的方式保存,文件、或者数据库等,最后读取出来只要生成对应的字典格式就行了。

requests保存cookies

  1. import requests
  2. s = requests.session()
  3. s.verify = False
  4. s.headers = {
  5. "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
  6. }
  7. # 这里可以是模拟登陆的步骤
  8. s.get("http://www.baidu.com")
  9. cookies = requests.utils.dict_from_cookiejar(s.cookies)
  10. with open("cook.txt", "w") as fp:
  11. json.dump(cookies, fp)
  12. print(cookies)

首先我们看一下requests.session里面的cookies,它是一个RequestsCookieJar对象,这就是我们在上面使用的时候用RequestsCookieJar对象读取cookies的原因了

下面我们看到requests.utils.dict_from_cookiejar方法,这是requests库提供的一个方法,把上面的RequestsCookieJar对象转换为一个字典(字典里只有name和value),这就是我上面说的,requests库只使用name和value值,而我们selenium中保存的cookies中包含domain、path等信息。

另外还有一个方法requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)这个方法,根据字典生成一个RequestsCookieJar对象,为什么需要这样一个方法呢,可能在上面的应用中有些人会有疑问,我们的cookies是通过get/post方法的参数传进去的,那么在访问其他网页的时候都要去传递这样一个参数吗?这样很不方便而且容易遗忘。看上图的s.cookies变量,它是requests.session对象中的变量,而且是一个RequestsCookieJar类型的对象,那么我们就可以使用这个函数把读取的字典信息转换为RequestsCookieJar对象,然后把值直接设置给s.cookies,就像上面代码里的headers一样,这样就方便很多了吧。

上面我都是将cookies值保存在文件中,在大多数情况下我们一般使用都是将其保存在数据库中,启动一个服务器专门进行登录验证并保存cookies值。后面我会写一篇Flask+Redis进行cookies池维护的文章,发布在我的微信公众号上,尽请关注哦。


如果你觉得我的文章还可以,可以关注我的微信公众号,查看更多实战文章:Python爬虫实战之路

也可以扫描下面二维码,添加我的微信公众号

selenium+requests进行cookies保存读取操作的更多相关文章

  1. C#中Cookies的读取

    C#中Cookies的读取   链接: 一 .写入Cookie 1. Name 和 Value 属性由程序设定,默认值都是空引用. 2. Domain属性的默认值为当前URL的域名部分,不管发出这个c ...

  2. java 的文件读取操作

    /** * @param filePath 文件的全路径 * 返回我们读取到的文件内容 * **/ public static String readFile(String filePath) { F ...

  3. android如何保存读取读取文件文件保存到SDcard

    android如何保存读取读取文件文件保存到SDcard 本文来源于www.ifyao.com禁止转载!www.ifyao.com 上图为保存文件的方法体. 上图为如何调用方法体保存数据. 上面的截图 ...

  4. cookies保存购物车数据的编码问题(pickle和base64)

    在保存cookies时,如果存在着中文字符,cookies保存会报错.所以需要对数据进行编码. 通常cookies的保存都是以Base64来保存.所以先要对数据编码成bytes,再编码成base64字 ...

  5. Android设备与外接U盘实现数据读取操作

    现在越来越多手机支持OTG功能,通过OTG可以实现与外接入的U盘等USB设备实现数据传输.关于OTG,可以参考: http://blog.csdn.net/srw11/article/details/ ...

  6. 【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第五篇博 ...

  7. c#中cookies的存取操作

    在客户端创建一个username的cookies,其值为gjy,有效期为1天. 方法1: Response.Cookies["username"].Value="zxf& ...

  8. JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

    JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...

  9. access数据库频繁读取操作会出现 System.Data.OleDb.OleDbException 的异常解决

    asp.net access数据库 本来想着打开一个access数据库连接后,不关闭,下次操作数据了,直接拿来用,谁知道连着测试64次后(大概这么多次),就会出现System.Data.OleDb.O ...

随机推荐

  1. 设置R更新源

    命令行设置R更新源 创建文件 R.home()/etc/Rprofile.site 设置更新源 local({r <- getOption("repos") r[" ...

  2. 吴裕雄--天生自然TensorFlow高层封装:使用TFLearn处理MNIST数据集实现LeNet-5模型

    # 1. 通过TFLearn的API定义卷机神经网络. import tflearn import tflearn.datasets.mnist as mnist from tflearn.layer ...

  3. [原]UEFI+GPT启动VHD

    1. 缘起 2. 创建VHD文件并写入系统镜像到VHD文件 2.1 制作VHD文件 2.1.1 纯界面创建 2.1.2 命令行创建 2.2 把系统镜像写入VHD文件 3. 添加VHD文件到系统引导 3 ...

  4. embed标签属性

    embed标签属性   (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,    Netscape及新版 ...

  5. php time()时间戳作为文件名产生文件同名的bug

    /*time()函数生成的文件名可能是相同的,因为如果php运行的过程如果足够快,time()函数调用的足够频繁,那么有可能time()生成的时间戳会相同,因为时间戳是以秒为单位,所以如果足够频繁有可 ...

  6. 2019-ECfinal-M题-value

    题目传送门 sol:每个下标都有选和不选两种情况,所以总方案数是$2^{n}$,在$n$最大是$100000$的情况下不符合要求.可以这样想,假设$i^{p}=k$有符合题目要求的解,还有一个整数$j ...

  7. 大道至简伪代码读后感java为代码形式

    //愚公移山 import.java.大道至简.*; import.java.愚公移山.*; public class yishan //定义一个名为yishan的类 {//类定义的开始 public ...

  8. day07-生成器

    一. 含有yield关键字的函数就是生成器函数. yield不能和return公用,且要写在函数内部. 调用生成器函数之后,函数不执行,返回一个生成器. 生成器的本质是迭代器.生成器generator ...

  9. rest framework-分页-长期维护

    ###############  分页组件   ############### # 分页组件 # # django也有分页,rest framework也有分页,但是没有页面这个概念了, # 这个分页 ...

  10. Apsara Clouder专项技能认证:实现调用API接口

    一.API 简介 1.API 的概念 API(Application Programming Interface应用程序编程接口)是一些预定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访 ...