python⼩⽩学习记录关于scrapy框架的cookie存取使⽤(知乎⼿
动验证码登录)
# -*- coding: utf-8 -*-
from urllib import request
import scrapy
import json
from selenium import webdriver
from selenium.webdrivermon.action_chains import ActionChains
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as ex
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdrivermon.keys import Keys
import time
selenium获取cookiefrom pathlib import Path
class TestspiderSpider(scrapy.Spider):
name = 'testspider'
allowed_domains = ['www.zhihu']
start_urls = ['www.zhihu/']
# 模拟请求的headers,⾮常重要,不设置也可能知乎不让你访问请求
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36",
"HOST": "www.zhihu",
'sec - fetch - dest': 'document',
'sec - fetch - mode': 'navigate',
'sec - fetch - site': 'none',
'sec - fetch - user': '?1',
'upgrade - insecure - requests': '1'
}
# scrapy请求的开始时start_request
def start_requests(self):
zhihu_findUrl = 'www.zhihu/notifications'
if not Path('zhihuCookies.json').exists():
self.loginZhihu()  # 先执⾏login,保存cookies之后便可以免登录操作
# 毕竟每次执⾏都要登录还是挺⿇烦的,我们要充分利⽤cookies的作⽤
# 从⽂件中获取保存的cookies
with open('zhihuCookies.json', 'r', encoding='utf-8') as f:
listcookies = json.ad())  # 获取cookies
# 把获取的cookies处理成dict类型
cookies_dict = dict()
for cookie in listcookies:
# 在保存成dict时,我们其实只要cookies中的name和value,⽽domain等其他都可以不要
cookies_dict[cookie['name']] = cookie['value']
# Scrapy发起其他页⾯请求时,带上cookies=cookies_dict即可,同时记得带上header值,
yield scrapy.Request(url=zhihu_findUrl, cookies=cookies_dict, callback=self.parse, headers=self.headers)
# 使⽤selenium登录知乎并获取登录后的cookies,后续需要登录的操作都可以利⽤cookies
def loginZhihu(self):
# 登录⽹址
loginurl = 'www.zhihu/signin'
# 加载webdriver驱动,⽤于获取登录页⾯标签属性
driver = webdriver.Chrome('C:\Program Files (x86)\Google\Chrome\')
# 加载页⾯
<(loginurl)
time.sleep(3)  # 执⾏休眠3s等待浏览器的加载
# ⽅式1 通过填充⽤户名和密码
# driver.find_element_by_name('username').clear()  # 获取⽤户名框
# driver.find_element_by_name('username').send_keys(u'username')  # 填充⽤户名
# driver.find_element_by_name('password').clear()  # 获取密码框
# driver.find_element_by_name('password').send_keys(u'password')  # 填充密码
# input("检查⽹页是否有验证码要输⼊,有就在⽹页输⼊验证码,输⼊完后,控制台回车;如果⽆验证码,则直接回车")
# # 点击登录按钮,有时候知乎会在输⼊密码后弹出验证码,这⼀步之后⼈⼯校验
# driver.find_element_by_css_selector("button[class='Button SignFlow-submitButton Button--primary Button--blue']").click()
#
# input_no = input("检查⽹页是否有验证码要输⼊,有就在⽹页输⼊验证码,输⼊完后,控制台输⼊1回车;如果⽆验证码,则直接回车")
# if int(input_no) == 1:
#    # 点击登录按钮
#    driver.find_element_by_css_selector(
#        "button[class='Button SignFlow-submitButton Button--primary Button--blue']").click()
# ⽅式2 直接通过扫描⼆维码,如果不是要求全⾃动化,建议⽤这个,⾮常直接,毕竟我们这⼀步只是想保存登录后的cookies,⾄于⽤何种⽅式登录,可以不必过于计较        driver.find_element_by_xpath('//div[@class="SignFlow-qrcodeTab"]').click()
input("请扫描页⾯⼆维码,并确认登录后,点击回车:")  # 点击⼆维码⼿机扫描登录
time.sleep(3)  # 同样休眠3s等待登录完成
input("检查⽹页是否有完成登录跳转,如果完成则直接回车")
# 通过上述的⽅式实现登录后,其实我们的cookies在浏览器中已经有了,我们要做的就是获取
cookies = _cookies()  # Selenium为我们提供了get_cookies来获取登录cookies
driver.close()  # 获取cookies便可以关闭浏览器
# 然后的关键就是保存cookies,之后请求从⽂件中读取cookies就可以省去每次都要登录⼀次的
# 当然可以把cookies返回回去,但是之后的每次请求都要先执⾏⼀次login没有发挥cookies的作⽤
jsonCookies = json.dumps(cookies)  # 通过json将cookies写⼊⽂件
with open('zhihuCookies.json', 'w') as f:
f.write(jsonCookies)
print(cookies)
def parse(self, response):
# 这⾥打印出www.zhihu/notifications页⾯中登录者的昵称验证带上cookies登录完成
print(response.xpath('//div[@class="NotificationList-Item-content"]//text()'))
)
print("*" * 40)
# print("response text: %s" % )
print("response headers: %s" % response.headers)
print("response meta: %s" % a)
print("request headers: %s" % quest.headers)
print("request cookies: %s" % kies)
print("request meta: %s" % a)
附 p/file/download.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。