暗网爬虫验证码识别及自动登录实现

暗网不做过多需要介绍,有兴趣的可以上网搜搜了解下.打码平台用的是超级鹰参考开发文档
超级鹰代理是用的socks5转换的http/https的代理具体转换方式这里不做详细介绍,另外一点因为需要放到linux下,所以webdrive要设置无界面我这里使用的是chrome,也可以使用phantomjs,但是firefox不行因为在linux系统下没法同时设置无界面和使用代理ip.目标url地址
暗网登录入口

超级鹰部分 参照开发文档python部分稍作修改即可

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        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()


自动登录部分

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# from selenium.webdriver.firefox.firefox_profile import FirefoxProfile        #火狐代理
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from PIL import Image
from chaojiying import *



class Spider(object):
    def __init__(self):
        # self.profile = self.get_profile()     #火狐相关设置
        self.chromeOptions = self.get_profile()
        self.browser = self.get_browser()
        self.wait = self.get_wait()

    def main(self):
        self.get_image()
        chaojiying = Chaojiying_Client('chaojiyingcmq', 'cc123456', '868692')	#用户中心>>软件ID 生成一个替换 96001
        im = open('img.png', 'rb').read()							        #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        # print(chaojiying.PostPic(im, 1902))		            	        #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
        code = chaojiying.PostPic(im, 1902)
        global result
        result = code ["pic_str"]                   #解析的验证码结果取字典的value
        print(result)
        self.login()

    def get_profile(self):
        #火狐相关设置
        # profile = FirefoxProfile()
        # profile.set_preference("network.proxy.type", 1)  # 激活手动代理配置(对应着在 profile(配置文件)中设置首选项)
        # profile.set_preference("network.proxy.http", "192.168.126.110")  # ip及其端口号配置为 http 协议代理
        # profile.set_preference("network.proxy.http_port", 9398)
        # profile.set_preference("network.proxy.share_proxy_settings", True)  # 所有协议共用一种 ip 及端口,如果单独配置,不必设置
        # return profile

        #谷歌相关设置
        chromeOptions = webdriver.ChromeOptions()
        # chromeOptions.add_argument('--headless')         # 谷歌无头模式
        chromeOptions.add_argument('--disable-gpu')       # 谷歌文档提到需要加上这个属性来规避bug 这是禁用显卡
        chromeOptions.add_argument('window-size=1280,800')  # 指定浏览器分辨率
        chromeOptions.add_argument("--no-sandbox")
        chromeOptions.add_argument("--proxy-server=http://192.168.126.110:9398")        # 设置代理
        return chromeOptions

    def get_browser(self):
        #火狐相关设置
        # browser = webdriver.Firefox(self.profile)  # 以代理方式启动 firefox
        # browser.set_window_size(
        # 1280,800)

        #谷歌相关设置
        browser = webdriver.Chrome(chrome_options=self.chromeOptions)
        #browser.set_window_size(1280,800)
        return browser

    def get_wait(self):
        wait = WebDriverWait(self.browser, 8)     # 强制等待10s
        return wait

    def login(self):
        try:
            self.browser.find_element_by_xpath(
                '/html/body/div/div[2]/div/div/div/div[2]/form/fieldset/div[1]/input').send_keys('wahaha')       #账号输入
        except:
            print("账号输入有误")
        try:
            self.browser.find_element_by_xpath(
                '/html/body/div/div[2]/div/div/div/div[2]/form/fieldset/div[2]/input').send_keys('laoganma')     #密码输入
        except:
            print("密码输入有误")
        try:
            self.browser.find_element_by_xpath\
                ("/html/body/div/div[2]/div/div/div/div[2]/form/fieldset/div[3]/input").send_keys(result)        #输入解析的验证码
        except:
            print("验证码输入错误")
        try:
            button = self.browser.find_element_by_xpath("/html/body/div/div[2]/div/div/div/div[2]/form/fieldset/button")
            button.click()        #点击登录按钮
            #span.badge:nth-child(3)
            try:
                self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.page-header > h3:nth-child(1)')))
            except:
                #重新执行的函数
                self.main()
        except:
            # testspider = Spider()
            # testspider.main()
            print('页面关闭')

    def login_url(self):                    #访问目标网址
        try:
            self.browser.get("http://apollonwmwenxcwa.onion/login.php")
            self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.btn')))
        except:
            self.browser.refresh()    #刷新当前页面,因为可能会因为网络问题造成阻塞


    def get_image(self):  # 对验证码所在位置进行定位,然后截取验证码图片

        self.browser.save_screenshot('img1.png')      # 截取全屏
        # 设置好图片的位置
        left = 840
        # print(left)
        upper = 480
        # print(upper)
        right = 230+left
        # print(right)
        lower = 90+upper
        # print(lower)
        img = Image.open('img1.png')                     # 打开全屏,进行验证码截取
        im = img.crop((left, upper, right, lower))        # 将图片的位置作为一个元组传入
        im.save('img.png')                               # 最后保存图片


if __name__ == '__main__':
    testspider = Spider()
    testspider.login_url()
    testspider.main()


猜你喜欢

转载自blog.csdn.net/weixin_42603784/article/details/90187655
今日推荐