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等情况

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

    四,说明

    • 这个教程只是学习过程,请查阅者不要非法使用,如恶意注册等,后果自负
  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161232.html
Copyright © 2011-2022 走看看