python爬虫–验证码、cookie

python爬虫–验证码、cookie

python爬虫–验证码、cookie、代理

基本知识

模拟登陆:

爬取基于某些用户的用户信息

点击登陆按钮之后发起post请求

post请求中会携带登陆之前录入的相关登陆信息(用户名,密码,验证码。。。)

Cookie

http/https协议特性:无状态。

没有请求到对应页码数据的原因:

发起第二次基于个人主页的页面请求的时候,服务器端并不知到本次请求是基于登陆状态下的请求。

Cookie:用来让服务器端记录客户端的相关状态

手动处理:

通过抓包工具获取Cookie值,将该值封装到headers中

自动处理:

session会话对象:

  • 1.可以进行请求的发送
  • 2.如果请求过程中产生了cookie,则cookie会被自动存储/携带在该Session对象中

操作步骤:

  • 1.创建一个session对象:session = requests.Session()
  • 2.使用sess ion对象进行模拟登录post请求的发送( cookie就会被存储在session中)
  • 3.session对象对个人主页对应的get请求进行发送(携带了cookie)

古诗文网验证码识别

https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx

代码

Classcjy

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf-8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
   
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
   
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """ im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """
        params = {
   
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {
   'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """ im_id:报错题目的图片ID """
        params = {
   
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()

主程序

import requests
from lxml import etree
from Classcjy import Chaojiying_Client

def getCodeText(imgPath):
    chaojiying = Chaojiying_Client('azb123 ', 'azb123', '914332')  # 用户中心>>软件ID 生成一个替换 96001
    im = open(imgPath, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    img_code = chaojiying.PostPic(im, 1902)['pic_str']
    return img_code

if __name__ == '__main__':
    url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    page_text = requests.get(url=url,headers=headers).text
    tree = etree.HTML(page_text)
    img_url = 'https://so.gushiwen.cn/'+tree.xpath('//*[@id="imgCode"]/@src')[0]
    img_data = requests.get(url=img_url,headers=headers).content
    with open('./Code.jpg','wb') as fp:
        fp.write(img_data)
    img_code = getCodeText('./Code.jpg')
    print(img_code)

在这里插入图片描述
在这里插入图片描述

模拟古诗文网登陆

import requests
from lxml import etree

if __name__ == '__main__':
    #通过Session对象记录获取cookie
    session = requests.Session()
    login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    #获取登录页面,并建立etree对象
    page_text = session.get(url=login_url,headers=headers).text
    tree = etree.HTML(page_text)
    #使用xpath解析验证码图片地址、动态属性
    img_url = 'https://so.gushiwen.cn/'+tree.xpath('//*[@id="imgCode"]/@src')[0]
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    viewstategenerator = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
    #将验证码图片存储本地
    img_data = session.get(url=img_url,headers=headers).content
    with open('./Code.jpg','wb') as fp:
        fp.write(img_data)
    # 提示用户输入验证码
    img_code = input('请输入验证码:')
    data = {
   
        '__VIEWSTATE': viewstate,
        '__VIEWSTATEGENERATOR':viewstategenerator,
        'from':'http://so.gushiwen.cn/user/collect.aspx',
        'email': '注册邮箱',
        'pwd': '密码',
        'code': img_code,
        'denglu': '登录',
    }

    #post请求模拟登陆
    index = session.post(url=login_url, headers=headers, data=data)
    detial_url = 'https://so.gushiwen.cn/user/collectbei.aspx?sort=t'
    detial_text = session.get(url=detial_url,headers=headers).text
    with open('index.html', 'w', encoding='utf-8') as fp:
        fp.write(detial_text)


效果图
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100106.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java CAS详解[通俗易懂]

    java CAS详解[通俗易懂]CAS解释:CAS(compareandswap),比较并交换。可以解决多线程并行情况下使用锁造成性能损耗的一种机制.CAS操作包含三个操作数—内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。一个线程从主内存中得到num值,并对num进行操作,写入值的时候,线程会把第一次取到的num值和主内存中num值进行比较,如果相等,就会将改变后的num写入主内存,如果不相等,则一直循环对比,知道成功为止。CAS

    2022年7月9日
    26
  • 【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」

    【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」Qt提供QThread类以进行多任务处理。与多任务处理一样,Qt提供的线程可以做到单个线程做不到的事情。例如,网络应用程序中,可以使用线程处理多种连接器。QThread继承自QObject类,且提供QMutex类以实现同步。线程和进程共享全局变量,可以使用互斥体对改变后的全局变量值实现同步。因此,必须编辑全局数据时,使用互斥体实现同步,其它进程则不能改变或浏览全局变量值。什么是互斥体?…

    2022年5月28日
    210
  • 机器学习算法(一)SVM

    机器学习算法(一)SVM支持向量机(supportvectormachines,SVM)是一种二分类模型,它将实例的特征向量映射为空间中的一些点,SVM的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。SVM适合中小型数据样本、非线性、高维的分类问题。SVM最早是由VladimirN.Vapnik和AlexeyYa.Chervonenkis在1963年提出,目前的版本(softmargin)是由CorinnaCortes和Vapnik在1

    2022年10月6日
    2
  • sql语法:inner join on, left join on, right join on具体用法

    sql语法:inner join on, left join on, right join on具体用法

    2021年12月15日
    64
  • 全球2/3的DNS瘫痪 顶级域名根服务器故障建议收藏

    1月21日下午消息,据多家DNS服务商透露,今日下午3点,全国所有通用顶级域的根出现异常,导致部分国内用户无法访问.com域名网站,对全国互联网链接造成系统性影响。根服务器主要用来管理互联网的主目录

    2021年12月21日
    87
  • SpringMVC 查询参数接收时间戳转Date方法[通俗易懂]

    SpringMVC 查询参数接收时间戳转Date方法[通俗易懂]Springmvc通过@RequestParam接收参数指定类型为Date时,接口传入时间戳会默认为string类型,无法转为Date,可在controller中添加如上转换器。@InitBinderpublicvoidinitBinder(finalWebDataBinderwebdataBinder){webdataBinder.reg…

    2022年6月18日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号