zoukankan      html  css  js  c++  java
  • 爬虫中关于登录以及登录验证码的简单处理方法

    处理登录表单

    • 前言:这个测试网站为了避免不必要的麻烦,并没有通过真实网站进行测试,是博主自己搭建的wordpress平台。请大家不要非法使用到正式网站。

    一,处理没有登录验证的网站。

    • 1,使用浏览器的检查功能,获取登录表单的属性

    在这里插入图片描述

    • 2,查看表单需要提交的name属性,即为我们要post提交的部分,分别为以下属性

      • log:账号
      • pwd: 密码
      • rememberme:记住登录信息,默认值value为forever
      • 隐藏标签,hidden:
        • redirect_to :值为 http://localhost/wordpress/wp-admin/
        • testcookie :值为1
    • 3,找到这些登录信息,即可构造提交表单使用requests进行登录

      import requests
      from bs4 import BeautifulSoup
      
      
      def login_post(url, name, pwd):
          headers = {
              'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*',
              'Connection': 'keep-alive'
          }
          post_data = {
              "log": name,
              "pwd": pwd,
              "rememberme": "forever",
              "redirect_to": r"http://localhost/wordpress/wp-admin/",
              "testcookie": 1,
          }
          # 用session保存登录信息,在网站访问期间。
          session = requests.session()
          login_page = session.post(url, data=post_data, headers=headers)
          # 输出登录状态
          print(login_page.status_code)
      
      if __name__ == '__main__':
          url = "http://localhost/wordpress/wp-login.php?loggedout=true&wp_lang=en_US"
          login_post(url=url,name="FLanWu", pwd="admin123")
      
      
    • 4,如果最后输出的状态码为200说明登录成功了。若出现4xx,5xx说明有问题,可查找相对应的状态码进行针对性更改。一般是检查属性值或者是其他hidden是否漏写。

    二,对于数字运算验证码的处理

    • 1,比如下面的的简单的加法验证码
      在这里插入图片描述

    • 通过检查可以发现,只不过是多了些input表单,只要用bs库解析获得num1,num2表单中的值,然后相加,传给sum表单,然后把num1,num2,sum表单添加到之前的数据中post提交即可进行登录

    • 实现代码如下

      import requests
      from bs4 import BeautifulSoup
      
      
      def get_soup(url, encode="utf-8"):
          # 获取soup对象
          header = {
              'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'
          }
          resp = requests.get(url=url, headers=header)
          resp.encoding=encode
          return BeautifulSoup(resp.text, "lxml")
      
      
      def login_post(url, name, pwd):
          headers = {
              'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*',
              'Connection': 'keep-alive'
          }
      
          soup = get_soup(url=url)
          # 获取里面的值
          num1 = soup.find("input", attrs={"name": "num1"})['value']
          num2 = soup.find("input", attrs={"name": "num2"})['value']
          sum = int(num1)+int(num2)
          post_data = {
              "log": name,
              "pwd": pwd,
              "rememberme": "forever",
              "redirect_to": r"http://localhost/wordpress/wp-admin/",
              "testcookie": 1,
              "num1": num1,
              "num2": num2,
              "sum": sum,
          }
          # 用session保存登录信息,在网站访问期间。
          session = requests.session()
          login_page = session.post(url, data=post_data, headers=headers)
          print(login_page.status_code)
      
      if __name__ == '__main__':
          url = "http://localhost/wordpress/wp-login.php?loggedout=true&wp_lang=en_US"
          login_post(url=url,name="FLanWu", pwd="admin123")
      
      
    • 结果为200成功登录。

    • 如果不仅仅是加法还有其他运算都可以使用该方法登录

    三,对于简单图片验证码的处理

    • 1,碰到简单的验证码如这种:
      在这里插入图片描述

    • 2,通过pillow处理为二值图像:

      from PIL import Image
      img = Image.open(r'img/timg.jpg')
      # 将彩色图像转换为灰度图像并保存
      gray_img = img.convert('L')
      gray_img.show()
      gray_img.save("img/captcha_gray_img.jpg")
      
      # 设置阈值将图像二值化,一般为白色(0)或者黑色(1),更好处理
      value = 200
      two_table = []  # 像素的映射表,比如1-200之间的像素映射为255其他映射为0变为黑白图像
      
      for i in range(256):
          if i < value:
              two_table.append(255)
          else:
              two_table.append(0)
      # 将映射表和之前的二值图像关联起来,即使用映射的像素,进行一一转换
      out_img = gray_img.point(two_table, "1")
      out_img.show()
      out_img.save("img/captcha_two.jpg")
      
      
    • 3,处理后的结果为:

      • 灰度图像

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pba6u842-1581594691280)(C:Users26398Desktoppython笔记imgelogincaptcha_gray_img.jpg)]

      • 二值图像

    在这里插入图片描述

    • 注意,如果识别出的图像不清晰,比如这张灰度图像里面的4比较淡,可能处理过后,在二值图像里面不显示,说明阈值取得不当,可以通过调阈值来将其显示出来。

    • 4,使用pytesseract库进行图像识别(建议使用anaconda安装,通常pip安装后会报错要另外安装一个光学识别引擎)

      import pytesseract
      from PIL import Image
      
      th = Image.open("captcha_two.jpg")
      str = pytesseract.image_to_string(th)
      print(str)
      
    • 输出的结果为7364

    • 获取了验证码的文本内容,即可通过之前的方法构造post参数,提交即可

    • 注意只能处理简单的这种图像验证码,如果出现上面有条纹或者歪歪扭扭的数字,二值处理就会很难,并且如果出现英文和数字混合的情况,通常情况下,会出现将0识别为o或者1识别为I等情况

    • 另外像近些年出现的滑动滑块或者是点选图片的验证,这种识别起来很困难,还没研究,后续可能会继续更新

    四,说明

    • 这个教程只是学习过程,请查阅者不要非法使用,如恶意注册等,后果自负
  • 相关阅读:
    wim文件位置
    用DISM++来管理wim当中的驱动
    交易所基金代码段
    systemd配置nginx
    MACD公式
    nginx配置
    linux的tmfps
    nohup&
    geth
    RGB
  • 原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161232.html
Copyright © 2011-2022 走看看