selenium+云打码+百度ocr爬取360的电话号码标记
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日, 写了个脚本,用于从www.so.com 上查询电话号码的标记情况,记录下号码所属公司、标记类型、标记人数(如果存在)。如下图红框中的信息。主要使用python的beautifulsoup和sele
千家信息网最后更新 2025年12月02日selenium+云打码+百度ocr爬取360的电话号码标记
写了个脚本,用于从www.so.com 上查询电话号码的标记情况,记录下号码所属公司、标记类型、标记人数(如果存在)。如下图红框中的信息。主要使用python的beautifulsoup和selenium,还用到了云打码平台(固定ip频繁查询后会被360要求输入验证码,需要收费,1分钱1个码)和百度OCR(360的查询结果中,所属公司是图片形式,因此需要文字识别,每天50000张以下免费)。约4-8秒处理一个号码,只能单进程(多进程啥的无意义,毕竟固定ip只有一个)。我们用来处理9000个号码,0点开始,大约10点结束。(python3.7.2)
云打码平台:http://www.yundama.com/apidoc/YDM_SDK.html#demo
百度OCR:https://ai.baidu.com/sdk#ocr
1、需要用到的模块
#-*- coding: UTF-8 -*-import sysimport timeimport osimport reimport randomimport base64#百度ocr模块from aip import AipOcrimport datetimefrom ctypes import *from selenium import webdriverfrom pyquery import PyQuery as pqfrom bs4 import BeautifulSoupfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.action_chains import ActionChainsdefault_encoding = 'utf-8'if sys.getdefaultencoding() != default_encoding: reload(sys) sys.setdefaultencoding(default_encoding)2、准备工作
# 调用云打码api,需要提供账号id、api key、用户名、密码、识别类型、超时时间# 注意指定云打码的dll文件路径YDMApi = windll.LoadLibrary('C:\\phone\\yundamaAPI-x64.dll')appId = 账号idappKey = b'api key'username = b'用户名'password = b'密码'# 1004表示识别类型是4个字母或数字codetype = 1004timeout = 60# 使用seleniumchrome_options = webdriver.ChromeOptions()# 使用最高权限模式,并使用无图形化界面模式chrome_options.add_argument("--no-sandbox")chrome_options.add_argument('--headless')browser=webdriver.Chrome(chrome_options=chrome_options)# 窗口最大化,无图形化模式下不用browser.maximize_window()# 先打开360的查询页面url='https://www.so.com/s?q=021'browser.get(url)3、查询号码,这里只用1个号码举例,批量查询可以用循环
phone=号码# 中间有些sleep是为了保证运行不出错,可以适当再调快try: # 定位搜索框控件 sousuokuang=browser.find_element_by_id("keyword") time.sleep(0.5) # 搜索框清空 sousuokuang.clear() time.sleep(0.5) # 输入号码 sousuokuang.send_keys(phone) time.sleep(0.5) # 点击搜索按钮 browser.find_element_by_id("su").submit() time.sleep(random.uniform(0.5,1.3)) # 试图定位验证码控件,如果定位失败,进入except,如果定位成功(说明有验证码),则进入else yanzhengma=browser.find_element_by_id("img")except: # 没有验证码,查询成功,进入结果页面 pass4、有验证码的情况,尝试云打码
else: # 如果有验证码,先点击验证码图片(图片要先点击一次才会显示验证码) time.sleep(0.3) ActionChains(browser).click(yanzhengma).perform() time.sleep(0.3) # 将验证码图片保存到本地(号码.png) yanzhengma.screenshot("c:\\phone\\%s.png" % phone) # 进行云打码(参考云打码文档) result = c_char_p(b" ") filename = b'C:\\phone\\%s.png' % phone.encode('gbk') captchaId = YDMApi.YDM_EasyDecodeByPath(username, password, appId, appKey, filename, codetype, timeout, result) # 验证码数据解码获取 shuruma=(result.value).decode('gbk') # 定位验证码输入框 shurukuang=browser.find_element_by_name("rcode") time.sleep(0.3) # 输入验证码并点击按钮 shurukuang.send_keys(shuruma) time.sleep(0.3) browser.find_element_by_class_name("btn").submit() # 删除验证码图片 os.remove('c:\\phone\\%s.png' % phone)finally: # 读取网页内容并初始化 html=browser.page_source data=str(pq(html))5、百度OCR准备工作(如果号码有所属公司标记,公司名称是图片格式,需要识别)
# 读取需要ocr识别的图片def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()# 百度ocr需要有appid、apikey、秘钥,调用函数APP_ID = 'appid'API_KEY = 'API key'SECRET_KEY = '秘钥'client = AipOcr(APP_ID, API_KEY, SECRET_KEY)6、网页内容解析,找出标记类型和标记数量
# 页面信息分析soup = BeautifulSoup(data,"lxml")# 查找class名为mohe-tips的div标签soup_div=soup.find('div',{'class':"mohe-tips"})# 如果有mohe-tipsif soup_div!=None: # 进一层查找span标签 soup_spans=soup_div.findAll('span') # 如果有2个span标签(有标记的号码,正常情况都是2个span) if len(soup_spans)==2: # 第1个span是号码标记(骚扰电话、中介等,用state变量) state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','') # 第2个span是标记数,有的号码可能没有,就标为0(用num变量) try: num=soup_spans[1].find('b').getText() except: num=0 else: pass # 如果进一层查找结果span标签有1个(第一种特殊情况) else: # 重新查找class名为mohe-tips mh-ws-hy的div标签 soup_div=soup.find('div',{'class':"mohe-tips mh-ws-hy"}) # 如果查找结果不为空 if soup_div!=None: # 再进一层查找span标签 soup_spans=soup_div.findAll('span') # 第1个span是号码标记 state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','') # 第2个span是标记数,有的号码可能没有,就标为0 try: num=soup_spans[1].find('b').getText() except: num=0 else: pass # 如果进一层查找结果为空,则表示该号码无标记 else: num=u'0' state=u'无'# 如果没有mohe-tips标签,第二种特殊情况else: # 直接查找class名为mohe-tips mh-ws-hy的div标签 soup_div=soup.find('div',{'class':"mohe-tips mh-ws-hy"}) # 如果查找结果不为空 if soup_div!=None: # 进一层查找span标签 soup_spans=soup_div.findAll('span') # 第1个span是号码标记 state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','') # 第2个span是标记数,有的号码可能没有,就标为0 try: num=soup_spans[1].find('b').getText() except: num=0 else: pass #如果进一层查找结果为空,则表示该号码无标记 else: num=u'0' state=u'无'7、网页内容解析,识别所属公司
# 查找有无class名为mh-hy-img的img控件soup_img=soup.find('img',{'class':"mh-hy-img"})try: # 尝试把img控件的前缀_'data:image/png;base64,'给删除 img_src=soup_img.get("src").replace(_'data:image/png;base64,','')except: # 如果删除失败,就表示没有所属公司标记,就标记为无(用company变量) company=u'无'else: # 如果有img控件,就把图片保存到本地 f = open('c:\\phone\\%s.png' % phone,'wb') f.write(base64.b64decode(img_src)) f.close() # 读取本地图片,通过百度ocr识别,并把图片删除 image = get_file_content('c:\\phone\\%s.png' % phone) company=client.basicGeneral(image)['words_result'][0]['words'] os.remove('c:\\phone\\%s.png' % phone)# 在没有mh-hy-img的img控件情况下,有一种特殊情况if soup_img==None: # 查找有无class名为mohe-tips mh-hy的strong控件 soup_strong=soup.find('strong',{'class':"mohe-tips mh-hy"}) try: # 进一步查找有无img控件 soup_img=soup_strong.find('img') img_src=soup_img.get("src").replace(_'data:image/png;base64,','') except: # 如果没有img控件,公司标记为无 company=u'无' else: # 有img控件,就把图片识别处理并删除 f = open('c:\\phone\\%s.png' % phone,'wb') f.write(base64.b64decode(img_src)) f.close() image = get_file_content('c:\\phone\\%s.png' % phone) company=client.basicGeneral(image)['words_result'][0]['words'] os.remove('c:\\phone\\%s.png' % phone)8、输出结果
print phone,state,num,company
号码
标记
验证
图片
控件
标签
结果
公司
情况
进一
查询
所属
定位
类型
输入
特殊
内容
变量
模式
网页
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全漏洞方案
继电保护电子数据库
思科通过域名访问服务器
dota数据库苍之纪元
计算机网络技术基础数据链路层
网络安全与管理试卷
平安产险网络安全工作
手游怪物数据库在哪个文件
软件开发人员任务分配表
怎样查出数据库为空的数据
运营商网络安全联动方案
如何删除数据库中的字
wind数据库在线
华为服务器传统模式怎么删除阵列
对网络技术的建议
服务器怎么实现主备
电脑网络技术用什么笔记本
校园网无法解析服务器的dns地址
索尼相机修复影像数据库失败
天津私人服务器系统云主机
网银网络安全
数据库建立查询教学
南京有的网络技术
魔兽世界正式服的服务器
构成数据库最基本数据字段
数据库技术文案配图
北京web前端软件开发价格
对网络技术的建议
郑州大学网络安全
网络安全破坏他人计算机