爬虫思路如下:

  • 利用自动化爬虫工具 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. 华为手机内核代码的编译及刷入教程【通过魔改华为P9 Android Kernel 对抗反调试机制】

    0x00  写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...

  2. ssm框架中applicationContext.xml文件中配置别名

    在applicationContext.xml中配置如下: 通过以下property标签中给定name属性value属性及对应的值,来将domain包下所有实体类设置别名. 在xxxDao.xml中 ...

  3. Pytest单元测试框架-allure测试报告

    Allure Test Report 对于不同的编程语言,有很多很酷的测试框架.不幸的是,它们中只有少数能够提供测试执行输出的良好表示.Qameta软件测试团队正在致力于Allure--一个开源框架, ...

  4. 用Spark进行实时流计算

    Spark Streaming VS Structured Streaming Spark Streaming是Spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstr ...

  5. 手把手教你使用Python网络爬虫获取招聘信息

    1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...

  6. 标星7000+,这个 Python 艺术二维码生成器厉害了!

    微信二维码,相信大家也并不陌生,为了生成美观的二维码,许多用户都会利用一些二维码生成工具. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手 ...

  7. Ternary weight networks

    Introduction 这两天看了一下这篇文章,我就这里分享一下,不过我还是只记录一下跟别人blog上没有,或者自己的想法(ps: 因为有时候翻blog时候发现每篇都一样还是挺烦的= =) .为了不 ...

  8. Windows聚焦失效问题的解决办法

    1. 设置Windows聚焦 步骤:任务栏右键 → 任务栏设置 → 锁屏界面 → 背景选择Windows聚焦 2. 解决Windows聚焦失效问题 设置完Windows聚焦之后,锁屏界面却没有变. 尝 ...

  9. 为何选择spark!

    随着大数据处理的应用场景越来越多,人们对Hadoop的要求也越来越高,开发出的对应的系统也越来越多,人们迫切的需要一个综合的计算框架,Spark应运而生,我们可以看看Spark可以干些什么. 那么为什 ...

  10. 熵权法原理及matlab代码实现

    参考原理博客地址https://blog.csdn.net/u013713294/article/details/53407087 一.基本原理 在信息论中,熵是对不确定性的一种度量.信息量越大,不确 ...