千家信息网

selenium+云打码+百度ocr爬取360的电话号码标记

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,  写了个脚本,用于从www.so.com 上查询电话号码的标记情况,记录下号码所属公司、标记类型、标记人数(如果存在)。如下图红框中的信息。主要使用python的beautifulsoup和sele
千家信息网最后更新 2026年11月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:    # 没有验证码,查询成功,进入结果页面    pass
  4、有验证码的情况,尝试云打码
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安全错误 数据库的锁怎样保障安全 互联网金融科技 厦门中拓互联网络科技有限公司 互联网科技股票 互联网金融科技平台 唐信互联网科技 大连 广州紫鲸互联网科技 互联网科技股午盘股票涨跌 阿里互联网科技公司 福建科技产业互联网发展 成都互联网科技公司工作好不好 健康食品互联网创新科技园项目 银川新华互联网科技学校联系电话 下一代互联网重大应用科技园 互联网科技包装股份有限公司上市 互联网科技和医药行业 恒生科技指数 中概互联网 盐城市攀科互联网科技有限公司 中国主要互联网科技公司 广州全民伙伴互联网科技有限公司 颐高云石互联网科技 瑰夏咖啡 深圳科技互联网 深圳互联网科技公司 万易互联网科技 北京三清互联网科技 赶超互联网科技 微信多开 朱啸虎曾投资哪些互联网科技企业 南通创西澳互联网科技有限公司 黑云互联网科技有限公司 互联网企业和网络科技有限公司
0