您好,歡迎來到網暖!
?
當前位置:網暖 » 站長資訊 » 建站基礎 » 網絡技術 » 文章詳細 訂閱RssFeed

selenium+云打碼+百度ocr爬取360的電話號碼標記

來源:網絡整理 瀏覽:261次 時間:2019-12-06

??寫了個腳本,用于從www.so.com 上查詢電話號碼的標記情況,記錄下號碼所屬公司、標記類型、標記人數(如果存在)。如下圖紅框中的信息。主要使用python的beautifulsoup和selenium,還用到了云打碼平臺(固定ip頻繁查詢后會被360要求輸入驗證碼,需要收費,1分錢1個碼)和百度OCR(360的查詢結果中,所屬公司是圖片形式,因此需要文字識別,每天50000張以下免費)。約4-8秒處理一個號碼,只能單進程(多進程啥的無意義,畢竟固定ip只有一個)。我們用來處理9000個號碼,0點開始,大約10點結束。(python3.7.2)
selenium+云打碼+百度ocr爬取360的電話號碼標記
selenium+云打碼+百度ocr爬取360的電話號碼標記
??云打碼平臺: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

推薦站點

  • 騰訊騰訊

    騰訊網(www.QQ.com)是中國瀏覽量最大的中文門戶網站,是騰訊公司推出的集新聞信息、互動社區、娛樂產品和基礎服務為一體的大型綜合門戶網站。騰訊網服務于全球華人用戶,致力成為最具傳播力和互動性,權威、主流、時尚的互聯網媒體平臺。通過強大的實時新聞和全面深入的信息資訊服務,為中國數以億計的互聯網用戶提供富有創意的網上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐網是全球最大的中文門戶網站,為用戶提供24小時不間斷的最新資訊,及搜索、郵件等網絡服務。內容包括全球熱點事件、突發新聞、時事評論、熱播影視劇、體育賽事、行業動態、生活服務信息,以及論壇、博客、微博、我的搜狐等互動空間。

    www.sohu.com
  • 網易網易

    網易是中國領先的互聯網技術公司,為用戶提供免費郵箱、游戲、搜索引擎服務,開設新聞、娛樂、體育等30多個內容頻道,及博客、視頻、論壇等互動交流,網聚人的力量。

    www.163.com
  • 新浪新浪

    新浪網為全球用戶24小時提供全面及時的中文資訊,內容覆蓋國內外突發新聞事件、體壇賽事、娛樂時尚、產業資訊、實用信息等,設有新聞、體育、娛樂、財經、科技、房產、汽車等30多個內容頻道,同時開設博客、視頻、論壇等自由互動交流空間。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com
?
最牛一尾中特规律