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 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的电话号码标记相关推荐
- 爬虫——百度图片爬取
通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用网络爬虫:是捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分,是从互联网中搜集网页.采集信 ...
- 爬虫实战(1)————百度首页爬取
百度首页爬取 提供我的爬取页面的思路,不一定是正确的但是我都是按照这个思路走的 第一步(页面分析) 可以看到页面非常简单 那么我们的需求就是 首先 构造url 然后观察我们想要爬取的对象 我们的需求是 ...
- 【Python爬虫】百度指数爬取+导入数据库+QuickBI展示
百度指数爬取原文在这里:如何用Python下载百度指数的数据_小小明-代码实体的专栏-CSDN博客 00.序言 一直想把百度指数每天定时爬下来,然后放到Dashboard里展示,终于,我看到了大神给出 ...
- Python 百度图片爬取
Python 百度图片爬取 还在为图片不够,一张张点下载发愁吗,这次我们图片一次爬到够! 这次的代码还是很常规的,只是链接的获取要有些技巧,直接代码解说. """这次从逻 ...
- Selenium根据输入的公司名称来爬取公司的详细信息!
1.下载驱动并设置环境变量 1.1.查看你的浏览器的版本 在网址栏输入:chrome://version PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料 ...
- python爬虫实战之百度新闻爬取
百度新闻信息爬取 目录 百度新闻信息爬取 序言 获取在百度新闻中搜索"阿里巴巴"的网页源代码 编写正则表达式提取新闻信息 数据清洗并打印输出 实战完整代码 序言 通过对百度新闻标 ...
- Selenium 根据输入的公司名称来爬取公司的详细信息
Selenium 根据输入的公司名称来爬取天眼查中的公司的详细信息 1.下载驱动并设置环境变量 1.1.查看你的浏览器的版本 1.2.下载对应版本的ChromeDriver驱动 1.3.设置环境变量 ...
- 初探Scrapy爬虫框架之百度网页爬取
初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...
- (九)python网络爬虫(理论+实战)——爬虫实战:指定关键词的百度新闻爬取
目录 4.5 动手写网络爬虫--指定关键词的百度新闻爬取(实战) 序言 本人从事爬虫相关工作已8年以上,从一个小白到能够熟练使用爬虫,中间也走了些弯路,希望以自身的学习经历,让大家能够轻而易举的,快速 ...
最新文章
- 关于while 和if
- git 提交修改到github上
- JavaScript+HTML+CSS 无缝滚动轮播图的两种方式
- 再度吐槽,PHP在centos7的安装方式稍不注意可能就打击你的积极性
- 物理借助传感器用计算机测速度,用打点计时器测速度教案_物理_教学设计_人教版...
- ubuntu tftp 服务器故障排除一例
- 后背疼的厉害有可能是哪些原因导致的?该怎么办?
- HoloToolkit视频共享接受发送脚本
- 朋友,谁会Symbian S40 Symbian S60 v3/v5 Android?
- 像素值,像素坐标,灰度值
- java开源cad_.Net开源项目(包含CAD支持)
- 多传感器信息融合matlab程序,传感器信息融合:MATLAB程序实现
- C++验证奇偶性时求余运算%和位运算的速度比较
- 对计算机网络的认识400字,对计算机网络的初步认识
- Visual Paradigm 下载安装及使用
- iOS 导航栏下拉菜单框
- 原生JS编写简单的编辑器
- 怎么就是不弹出key呢?提交前14个字符即可过关
- mysql基础操作和查询语句
- 虚拟专用网协议之PPTP
热门文章
- 以太网采集欧姆龙PLC DM数据并存入ACCESS 使用C#编写上位机程序
- RealView编译器常用特有功能(转)
- 计算机速度由CPU决定,电脑CPU的计算速度由什么决定
- 路由器开发整理(1)
- SAR学习笔记-代码部分
- SAAS(软件即服务) 离我们还有多远?
- Mac安装MongoDB(极简)
- 多传感器数据融合发展综述
- mm1排队系统仿真matlab实验报告,matlab仿真实验报告_mm1排队系统仿真matlab实验报告资料...
- Visual Studio中Git的使用(完全图解)