您好,登錄后才能下訂單哦!
??寫了個(gè)腳本,用于從www.so.com 上查詢電話號(hào)碼的標(biāo)記情況,記錄下號(hào)碼所屬公司、標(biāo)記類型、標(biāo)記人數(shù)(如果存在)。如下圖紅框中的信息。主要使用python的beautifulsoup和selenium,還用到了云打碼平臺(tái)(固定ip頻繁查詢后會(huì)被360要求輸入驗(yàn)證碼,需要收費(fèi),1分錢1個(gè)碼)和百度OCR(360的查詢結(jié)果中,所屬公司是圖片形式,因此需要文字識(shí)別,每天50000張以下免費(fèi))。約4-8秒處理一個(gè)號(hào)碼,只能單進(jìn)程(多進(jìn)程啥的無意義,畢竟固定ip只有一個(gè))。我們用來處理9000個(gè)號(hào)碼,0點(diǎn)開始,大約10點(diǎn)結(jié)束。(python3.7.2)
??云打碼平臺(tái):http://www.yundama.com/apidoc/YDM_SDK.html#demo
??百度OCR:https://ai.baidu.com/sdk#ocr
#-*- 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)
# 調(diào)用云打碼api,需要提供賬號(hào)id、api key、用戶名、密碼、識(shí)別類型、超時(shí)時(shí)間
# 注意指定云打碼的dll文件路徑
YDMApi = windll.LoadLibrary('C:\\phone\\yundamaAPI-x64.dll')
appId = 賬號(hào)id
appKey = b'api key'
username = b'用戶名'
password = b'密碼'
# 1004表示識(shí)別類型是4個(gè)字母或數(shù)字
codetype = 1004
timeout = 60
# 使用selenium
chrome_options = webdriver.ChromeOptions()
# 使用最高權(quán)限模式,并使用無圖形化界面模式
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)
phone=號(hào)碼
# 中間有些sleep是為了保證運(yùn)行不出錯(cuò),可以適當(dāng)再調(diào)快
try:
# 定位搜索框控件
sousuokuang=browser.find_element_by_id("keyword")
time.sleep(0.5)
# 搜索框清空
sousuokuang.clear()
time.sleep(0.5)
# 輸入號(hào)碼
sousuokuang.send_keys(phone)
time.sleep(0.5)
# 點(diǎn)擊搜索按鈕
browser.find_element_by_id("su").submit()
time.sleep(random.uniform(0.5,1.3))
# 試圖定位驗(yàn)證碼控件,如果定位失敗,進(jìn)入except,如果定位成功(說明有驗(yàn)證碼),則進(jìn)入else
yanzhengma=browser.find_element_by_id("img")
except:
# 沒有驗(yàn)證碼,查詢成功,進(jìn)入結(jié)果頁面
pass
else:
# 如果有驗(yàn)證碼,先點(diǎn)擊驗(yàn)證碼圖片(圖片要先點(diǎn)擊一次才會(huì)顯示驗(yàn)證碼)
time.sleep(0.3)
ActionChains(browser).click(yanzhengma).perform()
time.sleep(0.3)
# 將驗(yàn)證碼圖片保存到本地(號(hào)碼.png)
yanzhengma.screenshot("c:\\phone\\%s.png" % phone)
# 進(jìn)行云打碼(參考云打碼文檔)
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)
# 驗(yàn)證碼數(shù)據(jù)解碼獲取
shuruma=(result.value).decode('gbk')
# 定位驗(yàn)證碼輸入框
shurukuang=browser.find_element_by_name("rcode")
time.sleep(0.3)
# 輸入驗(yàn)證碼并點(diǎn)擊按鈕
shurukuang.send_keys(shuruma)
time.sleep(0.3)
browser.find_element_by_class_name("btn").submit()
# 刪除驗(yàn)證碼圖片
os.remove('c:\\phone\\%s.png' % phone)
finally:
# 讀取網(wǎng)頁內(nèi)容并初始化
html=browser.page_source
data=str(pq(html))
# 讀取需要ocr識(shí)別的圖片
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
# 百度ocr需要有appid、apikey、秘鑰,調(diào)用函數(shù)
APP_ID = 'appid'
API_KEY = 'API key'
SECRET_KEY = '秘鑰'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 頁面信息分析
soup = BeautifulSoup(data,"lxml")
# 查找class名為mohe-tips的div標(biāo)簽
soup_div=soup.find('div',{'class':"mohe-tips"})
# 如果有mohe-tips
if soup_div!=None:
# 進(jìn)一層查找span標(biāo)簽
soup_spans=soup_div.findAll('span')
# 如果有2個(gè)span標(biāo)簽(有標(biāo)記的號(hào)碼,正常情況都是2個(gè)span)
if len(soup_spans)==2:
# 第1個(gè)span是號(hào)碼標(biāo)記(騷擾電話、中介等,用state變量)
state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','')
# 第2個(gè)span是標(biāo)記數(shù),有的號(hào)碼可能沒有,就標(biāo)為0(用num變量)
try:
num=soup_spans[1].find('b').getText()
except:
num=0
else:
pass
# 如果進(jìn)一層查找結(jié)果span標(biāo)簽有1個(gè)(第一種特殊情況)
else:
# 重新查找class名為mohe-tips mh-ws-hy的div標(biāo)簽
soup_div=soup.find('div',{'class':"mohe-tips mh-ws-hy"})
# 如果查找結(jié)果不為空
if soup_div!=None:
# 再進(jìn)一層查找span標(biāo)簽
soup_spans=soup_div.findAll('span')
# 第1個(gè)span是號(hào)碼標(biāo)記
state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','')
# 第2個(gè)span是標(biāo)記數(shù),有的號(hào)碼可能沒有,就標(biāo)為0
try:
num=soup_spans[1].find('b').getText()
except:
num=0
else:
pass
# 如果進(jìn)一層查找結(jié)果為空,則表示該號(hào)碼無標(biāo)記
else:
num=u'0'
state=u'無'
# 如果沒有mohe-tips標(biāo)簽,第二種特殊情況
else:
# 直接查找class名為mohe-tips mh-ws-hy的div標(biāo)簽
soup_div=soup.find('div',{'class':"mohe-tips mh-ws-hy"})
# 如果查找結(jié)果不為空
if soup_div!=None:
# 進(jìn)一層查找span標(biāo)簽
soup_spans=soup_div.findAll('span')
# 第1個(gè)span是號(hào)碼標(biāo)記
state=soup_spans[0].getText().replace('\t','').replace('\n','').replace(' ','')
# 第2個(gè)span是標(biāo)記數(shù),有的號(hào)碼可能沒有,就標(biāo)為0
try:
num=soup_spans[1].find('b').getText()
except:
num=0
else:
pass
#如果進(jìn)一層查找結(jié)果為空,則表示該號(hào)碼無標(biāo)記
else:
num=u'0'
state=u'無'
# 查找有無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:
# 如果刪除失敗,就表示沒有所屬公司標(biāo)記,就標(biāo)記為無(用company變量)
company=u'無'
else:
# 如果有img控件,就把圖片保存到本地
f = open('c:\\phone\\%s.png' % phone,'wb')
f.write(base64.b64decode(img_src))
f.close()
# 讀取本地圖片,通過百度ocr識(shí)別,并把圖片刪除
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:
# 進(jìn)一步查找有無img控件
soup_img=soup_strong.find('img')
img_src=soup_img.get("src").replace('data:image/png;base64,','')
except:
# 如果沒有img控件,公司標(biāo)記為無
company=u'無'
else:
# 有img控件,就把圖片識(shí)別處理并刪除
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)
print phone,state,num,company
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。