python爬虫进阶-每日一学(图片反爬-雪碧图-2)

目的

了解熟悉雪碧图反爬策略

详细需求

在这里插入图片描述

url:http://glidedsky.com/level/crawler-sprite-image-2

思路解析

一、猜想

我不关心,后台逻辑怎么实现的,我就关心我看到的网页数字,能不能直接拿到!!

二、网页分析
在这里插入图片描述
在这里插入图片描述
三、已实现内容

python爬虫-selenium安装:
https://jia666666.blog.csdn.net/article/details/111933807

区域截图参考代码,可以根据下面demo改写
思路:
1.selenium进入指定网页
2.全屏截图
3.定位区域截图元素
4.获取区域截图元素的属性
5.根据属性进行区域截图
from selenium import webdriver
from time import sleep
from PIL import Image


def ele_coor(ele):  # 定义了一个方法,此方法的作用是传入一个元素,返回此元素左上角和右下角的坐标
    elem_posi = ele.location  # 将元素左上角的位置赋值给 elem_posi
    elem_size = ele.size  # 将元素的大小赋值给elem_size
    right = elem_posi["x"] + elem_size["width"]  # 元素左上角x + 元素宽 = 元素右下角x坐标
    bottom = elem_posi["y"] + elem_size["height"]  # 元素左上角y + 元素搞 = 元素右下角y坐标
    coor = (elem_posi["x"], elem_posi["y"], right, bottom)  # 将左上角x,y,右下角x,y 写成一个元组
    return coor  # 将元组返回给调用者


driver = webdriver.Chrome()  # webdriver启动谷歌浏览器
driver.fullscreen_window()  # 将浏览器设为全屏
driver.get("https://www.baidu.com/")  # 请求网页地址
sleep(2)
driver.save_screenshot('baidu.png')  # 截全屏,如果需要的是全屏截图 ,除了driver.close()以外,其余皆不写
im = Image.open('baidu.png')  # 打开此图片
ele = driver.find_element_by_id("kw")  # 定位元素的方法,

sleep(3)
im = im.crop(ele_coor(ele))  # 先调用ele_coor方法传入元素,返回一个坐标。将原全屏的图片,截取 ele_coor返回的坐标赋值给im
im.save('baidu.png')  # 保存新的图片覆盖原全屏的图
driver.close()  # 关闭浏览器


在这里插入图片描述

在这里插入图片描述

图片切割demo
import cv2 as cv


# 读取要被切割的图片
img = cv.imread("1.png")
w = img.shape  # 图片的宽

# def pngcut(height,width):
number=0  #切割第一个数组(0-11)
# 要被切割的开始的像素的高度值
beH = 0
# 要被切割的结束的像素的高度值
hEnd = 62
# 要被切割的开始的像素的宽度值
beW = int(91.5*number)
# 要被切割的结束的像素的宽度值
wLen = int(91.5*(number+1))
# 对图片进行切割
dstImg = img[beH:hEnd, beW:wLen]

# cv.imshow("dstImg", dstImg)
cv.imwrite("60.png",dstImg)

在这里插入图片描述

ocr批量识别及入库-仅供参考
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author  : jia666
# Time    : 2021/1/27 14:04
from PIL import Image
import pytesseract
import os
import time
import pandas as pd
from conf import base_path      # 导入编写的配置模块
from to_database import ToMysql # 导入编写的数据入库模块
from tqdm import tqdm

path=base_path+'/cutpng2/'
png_name=os.listdir(path) #获取当前路径下的文件名称

start=time.time()

index_list=[] #入库列表
fail_list=[]  #识别失败列表
for png in tqdm(png_name):
    index_value = {}  # 临时字典
    image = Image.open(base_path+'/cutpng/%s'%png)
    index=png.split('.')[0] #序号代码
    index_value.update({'index': index})
    result = pytesseract.image_to_string(image)
    try:
        result=int(result) #尝试整数,失败则说明识别失败
        index_value.update({'value': result})
    except:
        index_value.update({'value': ''})

    index_list.append(index_value)


print(time.time()-start)

tm=ToMysql()
df=pd.DataFrame(index_list)
df.to_csv('2.csv')
tm.save_data(df)
批量OCR识别cutpng文件夹下的图片,识别后入数据库

在这里插入图片描述
在这里插入图片描述

重复操作:15次以上,越多越正确,若有服务器可以设置定时任务启动...
1.完成1000页的区域截图及切割
2.批量识别切割的图片及入库
数据清洗
#删除值位数大于3及等于1位的数据
DELETE FROM xbt_table where LENGTH(`value`)>3 or LENGTH(`value`)=1 
#删除空值
DELETE FROM xbt_table where `value`=''
#编码次数,注意若查询结果<12000,则继续重复爬取切割识别入库操作,直至结果=12000
SELECT distinct `index` FROM xbt_table

读mysql表,相应编码出现次数最多的即为正确数值,累计求和即结果,
当结果三次一样则正确
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author  : jia666
# Time    : 2021/1/29 16:21

import os
from conf import ENGINE_STR
from sqlalchemy import create_engine
import pandas as pd
from tqdm import tqdm
engine=create_engine(ENGINE_STR)

path='./cutpng/'
png_name=os.listdir(path)
sum=0
for png in tqdm(png_name):
    index=png.split('.')[0] #序号代码
    sql="""SELECT count(`value`) as maxvar,`value`  FROM xbt_table where `index` = '{}' GROUP BY `value`""".format(index)
    df=pd.read_sql(sql,engine)
    var_list=df['maxvar'].tolist()
    max_index=var_list.index(max(var_list))
    value_list=df['value'].tolist()[max_index]
    sum+=int(value_list)
print(sum)
#第一次:2840124
#第二次:2840926

四、汇总

1.登陆、遍历1000页、区域截图、截图切片
2.批量OCR识别及入库
3.重复1、2操作15次+
4.数据清洗
5.累计求和
6.求和结果不正确,重复3-5
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页