抱歉,云打码公司已经倒闭,目前还未找到能替代的云服务

  写了个脚本,用于从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 sys
import time
import os
import re
import random
import base64
#百度ocr模块
from aip import AipOcr
import datetime
from ctypes import *
from selenium import webdriver
from pyquery import PyQuery as pq
from bs4 import BeautifulSoup
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
default_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 = 账号id
appKey = b'api key'
username = b'用户名'
password = b'密码'
# 1004表示识别类型是4个字母或数字
codetype = 1004
timeout = 60# 使用selenium
chrome_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,如果定位成功(说明有验证码),则进入elseyanzhengma=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_sourcedata=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-tips
if 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=0else: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是标记数,有的号码可能没有,就标为0try:num=soup_spans[1].find('b').getText()except:num=0else: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是标记数,有的号码可能没有,就标为0try:num=soup_spans[1].find('b').getText()except:num=0else: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

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

  1. 爬虫——百度图片爬取

    通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用网络爬虫:是捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分,是从互联网中搜集网页.采集信 ...

  2. 爬虫实战(1)————百度首页爬取

    百度首页爬取 提供我的爬取页面的思路,不一定是正确的但是我都是按照这个思路走的 第一步(页面分析) 可以看到页面非常简单 那么我们的需求就是 首先 构造url 然后观察我们想要爬取的对象 我们的需求是 ...

  3. 【Python爬虫】百度指数爬取+导入数据库+QuickBI展示

    百度指数爬取原文在这里:如何用Python下载百度指数的数据_小小明-代码实体的专栏-CSDN博客 00.序言 一直想把百度指数每天定时爬下来,然后放到Dashboard里展示,终于,我看到了大神给出 ...

  4. Python 百度图片爬取

    Python 百度图片爬取 还在为图片不够,一张张点下载发愁吗,这次我们图片一次爬到够! 这次的代码还是很常规的,只是链接的获取要有些技巧,直接代码解说. """这次从逻 ...

  5. Selenium根据输入的公司名称来爬取公司的详细信息!

    1.下载驱动并设置环境变量 1.1.查看你的浏览器的版本 在网址栏输入:chrome://version PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料 ...

  6. python爬虫实战之百度新闻爬取

    百度新闻信息爬取 目录 百度新闻信息爬取 序言 获取在百度新闻中搜索"阿里巴巴"的网页源代码 编写正则表达式提取新闻信息 数据清洗并打印输出 实战完整代码 序言  通过对百度新闻标 ...

  7. Selenium 根据输入的公司名称来爬取公司的详细信息

    Selenium 根据输入的公司名称来爬取天眼查中的公司的详细信息 1.下载驱动并设置环境变量 1.1.查看你的浏览器的版本 1.2.下载对应版本的ChromeDriver驱动 1.3.设置环境变量 ...

  8. 初探Scrapy爬虫框架之百度网页爬取

    初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...

  9. (九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取

    目录 4.5 动手写网络爬虫--指定关键词的百度新闻爬取(实战) 序言 本人从事爬虫相关工作已8年以上,从一个小白到能够熟练使用爬虫,中间也走了些弯路,希望以自身的学习经历,让大家能够轻而易举的,快速 ...

最新文章

  1. 关于while 和if
  2. git 提交修改到github上
  3. JavaScript+HTML+CSS 无缝滚动轮播图的两种方式
  4. 再度吐槽,PHP在centos7的安装方式稍不注意可能就打击你的积极性
  5. 物理借助传感器用计算机测速度,用打点计时器测速度教案_物理_教学设计_人教版...
  6. ubuntu tftp 服务器故障排除一例
  7. 后背疼的厉害有可能是哪些原因导致的?该怎么办?
  8. HoloToolkit视频共享接受发送脚本
  9. 朋友,谁会Symbian S40 Symbian S60 v3/v5 Android?
  10. 像素值,像素坐标,灰度值
  11. java开源cad_.Net开源项目(包含CAD支持)
  12. 多传感器信息融合matlab程序,传感器信息融合:MATLAB程序实现
  13. C++验证奇偶性时求余运算%和位运算的速度比较
  14. 对计算机网络的认识400字,对计算机网络的初步认识
  15. Visual Paradigm 下载安装及使用
  16. iOS 导航栏下拉菜单框
  17. 原生JS编写简单的编辑器
  18. 怎么就是不弹出key呢?提交前14个字符即可过关
  19. mysql基础操作和查询语句
  20. 虚拟专用网协议之PPTP

热门文章

  1. 以太网采集欧姆龙PLC DM数据并存入ACCESS 使用C#编写上位机程序
  2. RealView编译器常用特有功能(转)
  3. 计算机速度由CPU决定,电脑CPU的计算速度由什么决定
  4. 路由器开发整理(1)
  5. SAR学习笔记-代码部分
  6. SAAS(软件即服务) 离我们还有多远?
  7. Mac安装MongoDB(极简)
  8. 多传感器数据融合发展综述
  9. mm1排队系统仿真matlab实验报告,matlab仿真实验报告_mm1排队系统仿真matlab实验报告资料...
  10. Visual Studio中Git的使用(完全图解)