使用python解决验证码登录并爬取登录后的个人界面:本篇以古诗文网站为例

爬取总结记录:由于经验不足,个人尝试了很多方法,都失败了,查看了网站的上面别人的爬取经验,按照别人做的,但都没有成功。
几经波折最后终于解决了。
好了上代码:
其中有涉及到个人信息的,这里进行了模糊处理。

import time

import requests
from lxml import etree
from chaojiying.chaojiying import Chaojiying_Client

if __name__ == '__main__':
    # 1、设置ua头,进行伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'
    }
    # 2、进行登录界面的请求
    url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx?type=d'
    response_get = requests.get(url=url, headers=headers)
    # 获取请求登录接口后的cookie信息,这个执行登录操作时会用到。
    print(response_get.cookies.keys())
    print(response_get.cookies.values())

    # 获取登录界面,并保存本地
    response = response_get.text
    with open('./denglu.html', 'w', encoding='utf-8') as fp:
        fp.write(response)
    # 读取下载到本地的登录页面数据
    tree = etree.HTML(response)
    # 解析出验证码连接(这里要拼接一下url)
    code_image_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
    # 获取viewstate和viewstateenerator值,这个进行登录请求传参时会用到
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    viewstateenerator = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
    print(code_image_src)
    print(viewstate)
    print(viewstateenerator)
    # 这里请求验证码图片链接获取图片,用到了请求登录界面返回回来的cookies信息。(至于为什么要加登录界面返回回来的cookies信息,可以查看web端网络连接
    # 在获取验证码图片时也进行了cookie传递,其实这是为了让服务器知道是我们的当前会话进行验证码请求,而不是别人请求验证码。)
    img_res = requests.get(url=code_image_src, headers=headers, cookies=response_get.cookies)
    # 查看请求图片链接返回回来的cookie信息,这个在进行登录请求时也会用到。
    print(img_res.cookies.keys())
    print(img_res.cookies.values())
    img_content = img_res.content
    # 保存登录验证码图片,用于识别。
    with open('./gushiwen.jpg', 'wb') as fp:
        fp.write(img_content)
    # 解析验证码:我这里用了第三方工具超级鹰,这个可以注册一个很便宜。也可以使用其他验证码识别。
    chaojiying = Chaojiying_Client('你自己的个人信息', '你自己的个人信息', '你自己的个人信息')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('./gushiwen.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    # im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    shibie_result = chaojiying.PostPic(im, 1902)
    result = shibie_result['pic_str']
    print("*" * 100)
    print(type(result))
    print('result:' + result)
    print("*" * 100)

    # 2、进行登录请求操作
    denglu_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    # 设置登录请求体数据。这里用的是post方式进行登录
    data = {
        '__VIEWSTATE': viewstate,
        '__VIEWSTATEGENERATOR': viewstateenerator,
        'from': "http://so.gushiwen.cn/user/collect.aspx",
        'email': "你自己的账户",
        'pwd': "你自己的密码",
        'code': result,
        'denglu': "登录"
    }
    # 自定义配置cookie信息:配置请求登录界面返回的cookie,以及配置请求图片链接返回回来的cookie,
    # 剩余三个cookie信息,可以查看登录请求找到规律。
    cookie = {
        response_get.cookies.keys()[0]: response_get.cookies.values()[0],
        response_get.cookies.keys()[1]: response_get.cookies.values()[1],
        img_res.cookies.keys()[0]: img_res.cookies.values()[0],
        "login": "false",
        "Hm_lvt_9007fab6814e892d3020a64454da5a55": "1658748154",
        "Hm_lpvt_9007fab6814e892d3020a64454da5a55": str(int(time.time())) # 这里获取的是当前的时间戳

    }
    print(cookie)
    # 发送登录post请求
    denglu_response = requests.post(url=denglu_url, headers=headers, data=data, cookies=cookie)
    # print(denglu_response.cookies)
    # print(denglu_response.text)
    # 保存登录结果页面。
    with open('./gerenxinxi.html', 'w', encoding='utf-8') as fp:
        fp.write(denglu_response.text)
    print(denglu_response.status_code)
    print(denglu_response.cookies.keys())
    print(denglu_response.cookies.values())

另解:

使用session保存会话,进行登录后多个界面数据的抓取工作。

import time

import requests
from lxml import etree
from1部分python练习.3章python爬虫.pachong_requests.3章验证码.chaojiying.chaojiying import Chaojiying_Client

if __name__ == '__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'
    }
    # 创建一个session对象
    session = requests.Session()
    # 1、进行登录界面的请求
    url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    # response = requests.get(url=url,headers=headers).text
    response = session.get(url=url, headers=headers)
    with open('./denglu2.html', 'w', encoding='utf-8') as fp:
        fp.write(response.text)
    tree = etree.HTML(response.text)
    code_image_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    viewstateenerator = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
    print("第1次:session中的cookie值")
    print(session.cookies.keys())
    print(session.cookies.values())
    print("+++++++++++++++++++++++++")
    print(code_image_src)
    print(viewstate)
    print(viewstateenerator)
    img_res = session.get(url=code_image_src, headers=headers)
    img_content = img_res.content
    print("第2次:session中的cookie值")
    print(session.cookies.keys())
    print(session.cookies.values())
    print("+++++++++++++++++++++++++")
    with open('./gushiwen.jpg', 'wb') as fp:
        fp.write(img_content)
    # 解析验证码
    chaojiying = Chaojiying_Client('你的信息', '你的信息', '对应编号')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('./gushiwen.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    # im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    shibie_result = chaojiying.PostPic(im, 1902)
    result = shibie_result['pic_str']
    print("*" * 100)
    print(type(result))
    print('result:' + result)
    print("*" * 100)

    # 2、进行登录请求操作
    denglu_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    input = {
        '__VIEWSTATE': viewstate,
        # '__VIEWSTATEGENERATOR': "C93BE1AE",
        '__VIEWSTATEGENERATOR': viewstateenerator,
        'from': "http://so.gushiwen.cn/user/collect.aspx",
        'email': "你的账号",
        'pwd': "你的密码",
        'code': result,
        'denglu': "登录"
    }

    # session.cookies.set_cookie("login", "false")
    # session.cookies.set_cookie("Hm_lvt_9007fab6814e892d3020a64454da5a55", "1658748154")
    # session.cookies.set_cookie("Hm_lpvt_9007fab6814e892d3020a64454da5a55", str(int(time.time())))
    # denglu_response = requests.post(url=denglu_url,headers=headers,input=input)
    denglu_response = session.post(url=denglu_url, headers=headers, data=input)
    # print(denglu_response.text)
    with open('./gerenxinxi2.html','w',encoding='utf-8') as fp:
        fp.write(denglu_response.text)
    print(denglu_response.status_code)
    print("第3次:session中的cookie值")
    print(session.cookies.keys())
    print(session.cookies.values())
    print("+++++++++++++++++++++++++")
    # 名句页面数据获取
    detail_url = 'https://so.gushiwen.cn/user/collect.aspx?type=m&id=2501549&sort=t'
    detail_page = session.get(url=detail_url, headers=headers)
    detail_text = detail_page.text
    with open('./mingju2.html', 'w', encoding='utf-8') as fp:
        fp.write(detail_text)

至此,完结。如有疑问,下面留言,博主看到第一时间回复。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值