爬虫中关于登录以及登录验证码的简单处理方法

处理登录表单

  • 前言:这个测试网站为了避免不必要的麻烦,并没有通过真实网站进行测试,是博主自己搭建的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,处理后的结果为:

    • 灰度图像

    爬虫中关于登录以及登录验证码的简单处理方法

    • 二值图像

爬虫中关于登录以及登录验证码的简单处理方法

  • 注意,如果识别出的图像不清晰,比如这张灰度图像里面的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等情况

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

四,说明

  • 这个教程只是学习过程,请查阅者不要非法使用,如恶意注册等,后果自负