我这两天一直都在学习scrapy如何保持会话状态,在网上找了好多的资料以及博主的文章,做了一点总结。这里,以超星网课登录系统作为例子讲解:

1. 第一步肯定是找到登录时需要提交的post表单数据,最快的办法就是查看页面源代码或者F12找出对应的form表单里面的action,如果查看的action是空值,也就是js加载的,我们则需要在网络中找出对应的提交链接请求。

经过登录测试和分析,登录的url为“https://passport2.chaoxing.com/login”,并且请求方法为post,也就是我们在登录的时候需要通过FormRequest发送而不是普通的Request方法(如果使用的是requests库的话,需要通过post而不是普通的get方法)

2. 第二步则是最重要的,找到或者分析出验证码对应的url链接,所以我们需要通过F12点击元素以及网络中的请求来找出生成验证码对应的url链接。

经过分析发现,每次刷新验证码或者网页都会重新生成一个url链接,也就是 code?一串数字 ,经分析发现 验证码对应的url为: img_url = "https://passport2.chaoxing.com/num/code?"+str(int(time.time()))

并且发现,对应于同一个验证码url,刷新之后都会出现不同的验证码图片。这个问题困惑了我整整一天,也是解决这次爬虫的关键:  由于对于同一个验证码url每请求一次对应的验证码都会变化一次,当我们在爬虫的时候,肯定首先要请求验证码图片对应的url来加载到本地,最后人工识别验证码后 填补到 form的post表单对应的一项中最后再整体提交给 登录的url链接。!!!! 但是,这是两次请求,无论是请求登录的url还是验证码的url 验证码的图片都会改变!!! 所以我们要做的就是,如何保持 让自己下载到本地的验证码 和 登录请求时 更新的验证码 保持一致,那么就引出了scrapy提供的cookiejar机制来保持会话状态:

(1)meta={'cookiejar':1}    表示开启cookie记录,首次请求时写在Request()里
(2)meta={'cookiejar':response.meta['cookiejar']}    表示使用上一次response的cookie,
(3)meta={'cookiejar':True}    表示使用授权后的cookie访问需要登录查看的页

下面直接上代码吧,这里只展示scrapy的spider核心文件:

# scrapy模拟登录 超星泛雅
# 手动输入验证码# -*- coding: utf-8 -*-
import scrapy
from urllib import request
from PIL import Image
from base64 import b64encode
import requests
from requests import session
import time
import re
from scrapy.http.cookies import CookieJar
from scrapy.http import Request,FormRequestclass WljxptSpider(scrapy.Spider):name = 'wljxpt'# allowed_domains = ['passport2.chaoxing.com']start_urls = ['https://passport2.chaoxing.com/login']# 登录url,其实和 start_urls是一样的,只不过,一个是列表,一个是字符串login_url = start_urls[0]headers = {'Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36','Connection': 'keep-alive'}def start_requests(self):return [Request(self.start_urls[0], callback=self.parse)]def parse(self, response):# 拼凑当前验证码对应的 urlnum = int(time.time())img_url = "https://passport2.chaoxing.com/num/code?"+str(num)yield scrapy.Request(url=img_url, meta={'cookiejar': 1}, callback=self.parse_postdata)def parse_postdata(self, response):print("正在登录...................")form_data = {'refer_0x001': 'http%3A%2F%2Fi.mooc.chaoxing.com%2Fspace%2Findex.shtml','pid': '-1','pidName': '','fid': '-1','fidName': '','allowJoin': '0','isCheckNumCode': '1','f': '0','uname': '',  # 输入自己的账号'password': '',   # 输入自己的密码'numcode': '',}# 保存验证码图片 并且自动打开后 人工输入验证码fp = open('验证码.png', 'wb')fp.write(response.body)fp.close()image = Image.open('验证码.png')image.show()captcha = input("请输入验证码: ")# 完善 formdata中空着的 numcodeform_data['numcode'] = captcha#return [FormRequest.from_response(response, url=self.login_url, meta={'cookiejar': response.meta['cookiejar']}, headers=self.headers, formdata=form_data, callback=self.parse_afterlogin)]yield scrapy.FormRequest(url=self.login_url, meta={'cookiejar': response.meta['cookiejar']}, headers=self.headers, formdata=form_data, callback=self.parse_afterlogin)# 登录后继续使用该cookie信息去访问登录后才能访问的页面,就不会被拦截到登录页面了def parse_afterlogin(self, response):# 访问登陆后才能访问的页面http://i.mooc.chaoxing.com/settings/info?t=1594542872701yield Request("http://i.mooc.chaoxing.com/settings/info", meta={'cookiejar': True}, callback=self.parse_manager)# 保存文件def parse_manager(self, response):with open("用户管理.html", "w", encoding='utf-8') as fp:fp.write(response.text)

scrapy手工识别验证码登录超星泛雅相关推荐

  1. #python#模拟登录超星

    模拟登录超星 因为超星的验证码比较简单,直接用tesserocr多次识别.需要多久识别出来全靠脸.不知道还有没有其它方法,望大佬指教. from selenium import webdriver f ...

  2. Python使用网络抓包的方式,利用超级鹰平台识别验证码登录爬取古诗文网、上篇--识别验证码

    Python使用网络抓包的方式,利用超级鹰平台识别验证码登录,<爬取古诗文网>. 上篇–识别验证码 序言: 哈喽,各位小可爱们,我又来了,这次我新学习到的内容是python爬虫识别验证码. ...

  3. python3爬虫系列23之selenium+腾讯OCR识别验证码登录微博且抓取数据

    python3爬虫系列23之selenium+腾讯OCR识别验证码登录微博且抓取数据 1.前言 上一篇是一个 python3爬虫系列22之selenium模拟登录需要验证码的微博且抓取数据, 我们是首 ...

  4. Shell脚本模拟用户行为刷App积分,学习娱乐之用,再加图像数字识别验证码登录

    获取接口信息 逆向apk,可能加密了 Fiddler 4抓包 其他 App或网站的积分规则 网站登录行为中,如果添加验证码的话,很麻烦,这里先跳过. 效果图 为减少用户账号的异常特征,收藏.订阅.评论 ...

  5. python自动输入账号密码并识别验证码登录

    先附上源码,所有的东西都在一个py文件下 import ddddocr from time import sleep from selenium import webdriver from selen ...

  6. python题库刷题训练软件_自动刷题机 Python 解释源码 超新泛雅

    本文解释一下代码,如果有想要用机器刷题的(前提是能找的到答案),可以参考一下. 开发原因:作业又多又无聊自己不想做,干脆用机器刷题. 主要方法:主要用Python的selenium库实现刷题. 需要基 ...

  7. 超星系统登录,信息爬取

    超星系统登录,信息爬取 经历过上一年的疫情的大学生,一部分大学生可能对超星有一个深刻的认识,而我写这个项目的想法来自我的导师,做一个可以爬取超星课程学生成绩,可以随机组卷(前提是自己题库里有题),该项 ...

  8. springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)

     源码获取:我的博客资源页面可以下载!!!! 项目名称 springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录) 系统介绍 快递代拿系统 > 该项目使用当前最为流行的 ...

  9. 最简单的python使用ddddocr模块在线识别验证码后登录

    import unittest from PIL import Image from selenium import webdriver from time import sleep import d ...

  10. python爬虫之古诗文网中验证码的识别并登录----第三方平台

    目标网站:古诗文网 目标网址:http://so.gushiwen.org/user/collect.aspx 任务要求: (1)通过selenium的方式模拟该网站的登录,并成功输入用户名和密码: ...

最新文章

  1. [bzoj4131]并行博弈_博弈论
  2. Cllimbing Stairs [LeetCode 70]
  3. python界面颜色怎么改变_pycharm 界面风格修改
  4. Android中利用HttpClient建立一次持久的连接
  5. flink 自定义 窗口_【Flink 精选】阐述 Watermark 机制,剖析 Watermark 的产生和传递流程...
  6. NET下,你采用的是哪种方式进行数据操作?
  7. 开发悬赏任务兼职系统运营版源码,仿蚂蚁帮扶众人帮平台
  8. 程序员!别逼自己刷题了!每天花10分钟做这件事,编程能力暴增!
  9. 第三次冲刺--软件工程
  10. 验证javascript错误使用Google Analytics(分析、统计)
  11. 台式机黑苹果 Mojave 10.14.6 安装驱动
  12. 蓝桥杯历届试题-回文数字
  13. 语音之家SOTA | TIOBE 滚动测试报 2021.10
  14. js pug 代码_PUG 系列 | 第二课 JS 代码混合、包含引入
  15. 沉睡者IT - 月赚几千的创业项目思路,抖音文案号网赚项目
  16. 通达信日线数据转换为feather格式,提高后续数据处理速度
  17. 招银网络---C++
  18. 哈啰出行高质量故障复盘法:“3+5+3”(附模板)
  19. contains用法
  20. 怎么把Excel转换成PDF格式?这三种方法轻松完成转换

热门文章

  1. 一个超赞的开源串口虚拟示波器项目,玩起来!
  2. 论K21O Draco开发板的概论
  3. CORTEX:我知道你在真笑还是假笑 | 前辅助运动区的激活与对笑声传染性和真实性的感知
  4. 酒诗词之一(七言诗)
  5. ctf逆向解题——re1
  6. 2021总结:躺平的一年
  7. 015 PHP中的曲苑杂坛
  8. lbp2900打印机linux驱动下载,lbp2900打印机驱动下载x64 (canon lbp2900驱动canon lbp2900打印机驱动)下载 - 下载吧...
  9. 微信改微信号连接服务器,微信修改不了微信号怎么回事 微信号怎么修改
  10. k8s初级班day2