Scrapy Selenium实战:Selenium登录知乎保存cookies后访问需要登录页面

ゝ一纸荒年。 2022-04-08 08:22 1057阅读 0赞

Scrapy Selenium实战:Selenium登录知乎保存cookies后访问需要登录页面

  • 安装
  • chromedriver
  • 新建爬虫
  • zhihu.py
    • 获取浏览器真实的User-Agent
  • 执行验证

selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

安装

  1. #进入虚拟目录
  2. cd /data/code/python/venv/venv_Scrapy/tutorial
  3. #升级安装
  4. ../bin/pip3 install -U selenium

chromedriver

我们这里用 Chrome 浏览器来做自动化,我自己本身Chrome版本是
chorme版本

所以我们对应到 http://chromedriver.storage.googleapis.com/index.html 网址下载对应版本的chromedriver
chromedriver

新建爬虫

  1. #进入虚拟目录
  2. cd /data/code/python/venv/venv_Scrapy/tutorial
  3. #新建爬虫
  4. ../bin/python3 ../bin/scrapy genspider -t basic zhihu www.zhihu.com

这里我们可以把下载下来的chromedriver放在/data/code/python/venv/venv_Scrapy/tutorial目录下

zhihu.py

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import json
  4. from selenium import webdriver
  5. import time
  6. from pathlib import Path
  7. class ZhihuSpider(scrapy.Spider):
  8. name = 'zhihu'
  9. allowed_domains = ['www.zhihu.com']
  10. start_urls = ['http://www.zhihu.com/']
  11. # 模拟请求的headers,非常重要,不设置也可能知乎不让你访问请求
  12. headers = {
  13. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
  14. "HOST": "www.zhihu.com"
  15. }
  16. # scrapy请求的开始时start_request
  17. def start_requests(self):
  18. zhihu_findUrl = 'https://www.zhihu.com/notifications'
  19. if not Path('zhihuCookies.json').exists():
  20. __class__.loginZhihu() # 先执行login,保存cookies之后便可以免登录操作
  21. # 毕竟每次执行都要登录还是挺麻烦的,我们要充分利用cookies的作用
  22. # 从文件中获取保存的cookies
  23. with open('zhihuCookies.json', 'r', encoding='utf-8') as f:
  24. listcookies = json.loads(f.read()) # 获取cookies
  25. # 把获取的cookies处理成dict类型
  26. cookies_dict = dict()
  27. for cookie in listcookies:
  28. # 在保存成dict时,我们其实只要cookies中的name和value,而domain等其他都可以不要
  29. cookies_dict[cookie['name']] = cookie['value']
  30. # Scrapy发起其他页面请求时,带上cookies=cookies_dict即可,同时记得带上header值,
  31. yield scrapy.Request(url=zhihu_findUrl, cookies=cookies_dict, callback=self.parse, headers=__class__.headers)
  32. #使用selenium登录知乎并获取登录后的cookies,后续需要登录的操作都可以利用cookies
  33. @staticmethod
  34. def loginZhihu():
  35. # 登录网址
  36. loginurl = 'https://www.zhihu.com/signin'
  37. # 加载webdriver驱动,用于获取登录页面标签属性
  38. driver = webdriver.Chrome('/data/code/python/venv/venv_Scrapy/tutorial/chromedriver')
  39. #加载页面
  40. driver.get(loginurl)
  41. time.sleep(3) # 执行休眠3s等待浏览器的加载
  42. # 方式1 通过填充用户名和密码
  43. # driver.find_element_by_name('username').clear() # 获取用户名框
  44. # driver.find_element_by_name('username').send_keys(u'username') # 填充用户名
  45. # driver.find_element_by_name('password').clear() # 获取密码框
  46. # driver.find_element_by_name('password').send_keys(u'password') # 填充密码
  47. # input("检查网页是否有验证码要输入,有就在网页输入验证码,输入完后,控制台回车;如果无验证码,则直接回车")
  48. # # 点击登录按钮,有时候知乎会在输入密码后弹出验证码,这一步之后人工校验
  49. # driver.find_element_by_css_selector("button[class='Button SignFlow-submitButton Button--primary Button--blue']").click()
  50. #
  51. # input_no = input("检查网页是否有验证码要输入,有就在网页输入验证码,输入完后,控制台输入1回车;如果无验证码,则直接回车")
  52. # if int(input_no) == 1:
  53. # # 点击登录按钮
  54. # driver.find_element_by_css_selector(
  55. # "button[class='Button SignFlow-submitButton Button--primary Button--blue']").click()
  56. # 方式2 直接通过扫描二维码,如果不是要求全自动化,建议用这个,非常直接,毕竟我们这一步只是想保存登录后的cookies,至于用何种方式登录,可以不必过于计较
  57. driver.find_element_by_css_selector(
  58. "button[class='Button Button--plain']").click()
  59. input("请扫描页面二维码,并确认登录后,点击回车:") # 点击二维码手机扫描登录
  60. time.sleep(3) # 同样休眠3s等待登录完成
  61. input("检查网页是否有完成登录跳转,如果完成则直接回车")
  62. # 通过上述的方式实现登录后,其实我们的cookies在浏览器中已经有了,我们要做的就是获取
  63. cookies = driver.get_cookies() # Selenium为我们提供了get_cookies来获取登录cookies
  64. driver.close() # 获取cookies便可以关闭浏览器
  65. # 然后的关键就是保存cookies,之后请求从文件中读取cookies就可以省去每次都要登录一次的
  66. # 当然可以把cookies返回回去,但是之后的每次请求都要先执行一次login没有发挥cookies的作用
  67. jsonCookies = json.dumps(cookies) # 通过json将cookies写入文件
  68. with open('zhihuCookies.json', 'w') as f:
  69. f.write(jsonCookies)
  70. print(cookies)
  71. def parse(self, response):
  72. #这里打印出https://www.zhihu.com/notifications页面中登录者的昵称验证带上cookies登录完成
  73. print(response.xpath('//div[@class="top-nav-profile"]/a/span[@class="name"]/text()').extract_first())
  74. print("*" * 40)
  75. #print("response text: %s" % response.text)
  76. print("response headers: %s" % response.headers)
  77. print("response meta: %s" % response.meta)
  78. print("request headers: %s" % response.request.headers)
  79. print("request cookies: %s" % response.request.cookies)
  80. print("request meta: %s" % response.request.meta)

代码注释写的很清楚,就不细说了,这里需要注意,建议把User-Agent 设置为真实的User-Agent。

获取浏览器真实的User-Agent

访问 https://www.zhihu.com/signin 查看任意请求的headers
user-agent

执行验证

我们这里的爬虫很简单,只需要打印出 https://www.zhihu.com/notifications 页面中登录者的昵称
notifications

GitHub源代码

发表评论

表情:
评论列表 (有 0 条评论,1057人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Selenium中使用Cookies绕过登录

    在使用selenium测试后台时常常每个流程都需要走登录流程,这样自然比较浪费时间。如果遇到登录需要输入验证码等情况,就可能出师未捷身先死。 在Web应用中,登录状态通常是通

    相关 selenium登录百度

    一、概述 由于百度页面经常更新,因此页面元素,比如class和id会做更新。因此网上大多数文章,直接拿来用,是无法实现登录的。   二、完整代码 ![aHR0c