爬虫思路如下:

  • 利用自动化爬虫工具 Selenium 模拟点击输入等操作来进行登录
  • 分析页面,获取点触验证码的点触图片,通过将图片发送给超级鹰打码平台识别后获取坐标信息
  • 根据超级鹰返回的数据,模拟坐标的点选,即可实现登录
  • 很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:101677771

一.准备工作

在开始之前,需要先注册一个超级鹰账号并申请一个软件ID,注册页面链接为:https://www.chaojiying.com/user/reg/,注册完成后需要在后台添加一个软件ID,进行充值获得积分,一般充一块钱就可以了。

二.爬虫构建

1.首先我可以到官方网站下载对应的 Python API,链接为:https://www.chaojiying.com/api-14.html ,我这里使用了崔庆才大大修改后的超级鹰api

代码如下:

import requests
from hashlib import md5 class Chaojiying(object): def __init__(self, username, password, soft_id):
self.username = username
self.password = md5(password.encode('utf-8')).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 post_pic(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 report_error(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()

2.初始化函数

def __init__(self):
self.url = 'https://passport.bilibili.com/login'
self.browser = webdriver.Chrome()
self.browser.maximize_window()
self.wait = WebDriverWait(self.browser, 20)
self.username = USERNAME
self.password = PASSWORD

这里定义了发起请求的url、用户名、密码等全局变量,实例化 Chrome 浏览器、设置浏览器分辨率最大化、用户名、密码、同时也设置等待超时

3.登录函数

def open(self):
"""
打开网页输入用户名密码
:return: None
"""
self.browser.get(self.url)
user = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
user.send_keys(self.username)
password.send_keys(self.password)
login_btn = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login')))
# 随机暂停几秒
time.sleep(random.random() * 3)
# 点击登陆按钮
login_btn.click()

等待账号输入框和密码输入框对应的 ID 节点加载出来,然后获取对应节点,其中账号输入框 id=“login-username”,密码输框
id=“login-passwd”,通过调用 send_keys() 方法输入账号和密码,接着获取登录按钮 class=“btn
btn-login”,设置暂停时间,最后调用 click() 方法实现登录按钮的点击。

4.点触验证码的处理

def pick_code(self):
time.sleep(3)
pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img') # 获取点触图片标签
src = pick_img_label.get_attribute('src') # 获取点触图片链接
img_content = requests.get(src).content # 获取图片二进制内容
f = BytesIO()
f.write(img_content)
img0 = Image.open(f) # 将图片以文件的形式打开,主要是为了获取图片的大小
scale = [pick_img_label.size['width'] / img0.size[0],
pick_img_label.size['height'] / img0.size[1]] # 获取图片与浏览器该标签大小的比例
cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
result = cjy.post_pic(img_content, '9005') # 发送图片并获取结果
if result['err_no'] == 0: # 对结果进行分析
position = result['pic_str'].split('|') # position = ['110,234','145,247','25,185']
position = [[int(j) for j in i.split(',')] for i in position] # position = [[110,234],[145,247],[25,185]]
for items in position: # 模拟点击
ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0],
items[1] * scale[1]).click().perform()
time.sleep(1)
time.sleep(2)
# 点击登录
certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip')
certern_btn.click()
return cjy, result

通过css选择器,找到点触图片的标签,获取图标的src链接,对图片处理发送给超级鹰后台并获取结果,对结果进行分析,模拟坐标的点选,即可实现登录。

三.爬虫完整代码

import random
import time
from io import BytesIO
import requests
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from chaojiying import Chaojiying USERNAME = 'b站账号'
PASSWORD = '密码' CHAOJIYING_USERNAME = '超级鹰账号'
CHAOJIYING_PASSWORD = '密码'
CHAOJIYING_SOFT_ID = 907581
CHAOJIYING_KIND = 9004 class CrackTouClick():
def __init__(self):
self.url = 'https://passport.bilibili.com/login'
self.browser = webdriver.Chrome()
self.browser.maximize_window()
self.wait = WebDriverWait(self.browser, 20)
self.username = USERNAME
self.password = PASSWORD def open(self):
"""
打开网页输入用户名密码
:return: None
"""
self.browser.get(self.url)
user = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
user.send_keys(self.username)
password.send_keys(self.password)
login_btn = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login')))
# 随机暂停几秒
time.sleep(random.random() * 3)
# 点击登陆按钮
login_btn.click() def pick_code(self):
time.sleep(3)
pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img') # 获取点触图片标签
src = pick_img_label.get_attribute('src') # 获取点触图片链接
img_content = requests.get(src).content # 获取图片二进制内容
f = BytesIO()
f.write(img_content)
img0 = Image.open(f) # 将图片以文件的形式打开,主要是为了获取图片的大小
scale = [pick_img_label.size['width'] / img0.size[0],
pick_img_label.size['height'] / img0.size[1]] # 获取图片与浏览器该标签大小的比例
cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
result = cjy.post_pic(img_content, '9005') # 发送图片并获取结果
if result['err_no'] == 0: # 对结果进行分析
position = result['pic_str'].split('|') # position = ['110,234','145,247','25,185']
position = [[int(j) for j in i.split(',')] for i in position] # position = [[110,234],[145,247],[25,185]]
for items in position: # 模拟点击
ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0],
items[1] * scale[1]).click().perform()
time.sleep(1)
time.sleep(2)
# 点击登录
certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip')
certern_btn.click()
return cjy, result def crack(self):
"""
破解入口
:return: None
"""
self.open()
self.pick_code()
if __name__ == '__main__':
crack = CrackTouClick()
crack.crack()

四.GIF登录图

Python爬虫实战点触验证码, 模拟登陆bilibili的更多相关文章

  1. 【python爬虫】用requests库模拟登陆人人网

    说明:以前是selenium登陆取cookie的方法比较复杂,改用这个 """ 用requests库模拟登陆人人网 """ import r ...

  2. Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化

    代码如下: # coding:utf-8 from selenium import webdriver import requests import sys import time from lxml ...

  3. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  4. Python爬虫实战——反爬策略之模拟登录【CSDN】

    在<Python爬虫实战-- Request对象之header伪装策略>中,我们就已经讲到:=="在header当中,我们经常会添加两个参数--cookie 和 User-Age ...

  5. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  6. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  7. Python爬虫实战三之实现山东大学无线网络掉线自动重连

    综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...

  8. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  9. 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战

    <精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...

随机推荐

  1. hdu6787(骰子+往回推的传输带问通过方案,dp)

    题:http://acm.hdu.edu.cn/showproblem.php?pid=6787 题意:有1~n标号的格子,上面有m个传输带(传送带传的位置要传到之前去,1位置不能有格子)1~11的骰 ...

  2. iptables基础实战练习

    目录: 一.基本规则练习 二.SNAT源地址转移 三.DNAT目标地址转移 一.基础规则练习 (1) 放行ssh (端口:22) 1 iptables -A INPUT -d 192.168.42.1 ...

  3. mysql删除数据库提示mysql Error dropping database (can't rmdir './db'...

    1.执行ps aux | grep mysql,查看mysql的data目录,比如结果是--datadir=/var/lib/mysql. 2.进入data目录,删除以该数据库为名字的文件夹.cd / ...

  4. aria2使用ajax调用/页面浏览器RPC调用aria2

    @ 目录 1. aria2使用ajax调用/页面浏览器RPC调用aria2 1.1. 总结: 1.2. ajax调用aria2-Demo 1.3. postMan命令测试 1.3.1. post基本使 ...

  5. 使用cors完成跨域请求处理

    跨域的含义 同源策略以及其限制内容 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CSFR等攻击.所谓同源是指"协议+域名+端口&quo ...

  6. 2020重新出发,JAVA入门,标识符&修饰符

    标识符(Identifier ) 标识符是程序员用来命名变量,方法,类或标签的单词,其实就是我们在开发过程中凡是自己可以命名的一些单词就是标识符 标识符命名规则 标识符由字母(a-z,A-Z),数字( ...

  7. nginx进程模型解析

    nginx进程模型解析 概念   master会发送请求给worker,用于处理用户的请求,模型图如下 nginx进程分类   master进程(只有1个)    接受信号传递给worker   wo ...

  8. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树)   48.6% 中等 211 添加与搜索单词 - 数据结构设计   39.9% 中等 212 单词搜索 II   27.9% ...

  9. c++ sort函数三个参数解释

    第一个参数 一般为 排序的起始点 vector.begin()(起点) 或者其他位置 第二个参数 一般为 排序的终止点 vector.end() (终点) 或者其他位置 第三个参数是排序函数 对于一些 ...

  10. JavaScript基础-05-数组、Date对象、Math、包装类、字符串方法

    数组(Array) 1. 数组 数组也是一个对象,不同点:普通对象是使用字符串作为属性名的,数组是使用数字作为索引操作元素. 数组的存储性能比普通对象要好,在开发中经常使用数组来存储一些数据. 向数组 ...