當前位置:首頁 > 科技 > 正文

抓取百度指數引發的圖像數字識别

作者介紹:

葉成,數據分析師,就職于易居中國,熱愛數據分析和挖掘工作,擅長使用倒騰數據。

前言

學習爬蟲也有段時間了,閑着無趣,想找點項目練練手,于是乎通過順祥老師介紹,接到了一個關于百度指數的爬蟲需求。(百度指數可以反映一個詞在一段時間内的搜索熱度,不知道百度指數的同學們可以自行百度)。好的,話不多說,開始我們的項目。

百度指數頁面

百度指數_指數百度com_三倍做空納斯達克指數百度

輸入查詢的關鍵字

百度指數_指數百度com_三倍做空納斯達克指數百度

嗯?跳轉到了登陸界面!(趕緊拿出小本本記下,這裡需要登陸)。

登陸後的展現

三倍做空納斯達克指數百度_百度指數_指數百度com

心中竊喜,腦子裡滿是抓包分析,模拟請求,獲取指數,!!!然而事實并沒那麼簡單,根據爬蟲的套路,需要查看屬性(在上圖中右鍵檢查,找到文件):

百度指數_指數百度com_三倍做空納斯達克指數百度

正常來說這裡的json文件中應該就有我們需要的文本内容,然而打開後發現它是一張圖片,而且還是一張拼圖,如下圖所示:

并且這個圖片鍊接包含了三個參數,如下圖所示(黃色标出):

指數百度com_百度指數_三倍做空納斯達克指數百度

看得腦殼都大了,先不說怎麼分析加密參數,就算是破解了拿到圖片鍊接,也無法直接取出需要的數字,因為還需要進行圖像識别…沉思中…沒辦法,打算曲線救國,我們直接模拟鼠标移動,然後截取懸浮的黑框圖片,再進行圖像識别,得到百度指數。新的思路就是這樣,開搞。具體步驟如下:

browser= webdriver.Chrome('C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe')
browser.get('http://index.baidu.com/?from=pinzhuan')
browser.find_element_by_id("schword").clear()
browser.find_element_by_id("schword").send_keys(keys)
browser.find_element_by_id("searchWords").click()
time.sleep(2)
e1 = browser.find_element_by_id("TANGRAM_12__userName")
e1.send_keys("百度賬号")
e2 = browser.find_element_by_id("TANGRAM_12__password")
e2.send_keys("密碼")
e3 = browser.find_element_by_id("TANGRAM_12__submit")
e3.click()

我們使用驅動谷歌浏覽器,定位到輸入框,清空并輸入關鍵詞,跳轉登陸頁面後在登陸百度指數。

browser.maximize_window()
xoyelement = browser.find_elements_by_css_selector("#trend rect")[2]
x_0=1

for i in range(30):        ActionChains(browser).move_to_element_with_offset(xoyelement, x_0, 0).perform()        time.sleep(2)        display = browser.find_element_by_xpath("//*[@id='viewbox']").get_attribute("style")        style = re.findall('display: (.*?); ',display)[0]        print(style)        #browser.execute_script(js)        cot=0        while style == 'none':            ActionChains(browser).move_to_element_with_offset(xoyelement, x_0+ random.uniform(0,3), 0).perform()            display = browser.find_element_by_xpath("//*[@id='viewbox']").get_attribute("style")            style = re.findall('display: (.*?); ',display)[0]            browser.execute_script(js)            time.sleep(1)
           if style == 'block':                print('viewbox已找到')
               break            cot = cot +1            if cot >200:                print('未找到viewbox')                
               break        time.sleep(1)        browser.save_screenshot("E:/downloads/%s.png" %i)

這當中的核心是().(, x_0, 0).()。這個是用來确定鼠标的懸浮位置,我們先是通過css定位到,然後通過(, x_0, 0),确定偏移的位置,我們這裡使x_0初始值為1,是因為發現為0時數值不出現。

指數百度com_百度指數_三倍做空納斯達克指數百度

下圖中顯示的是, 為了防止鼠标移動時沒有的情況,我們通過判斷樣式是否為隐藏來确定是否出現。

要确保出現後才能進行屏幕截圖。

imgelement = browser.find_element_by_xpath('//div[@id="viewbox"]')
locations = imgelement.location
sizes = imgelement.size
add_length = (len(keys) - 2) * sizes['width'] / 15scroll = browser.execute_script("return window.scrollY;")
top = locations['y'] - scroll
rangle = (int(locations['x'] + sizes['width'] / 4 + add_length), int(top + sizes['height'] / 2),
       int(locations['x'] + sizes['width'] * 2 / 3), int(top + sizes['height']))
img = Image.open("E:/downloads/%s.png"%i)
jpg = img.crop(rangle)
jpg.save('E:/downloads/crop%s.jpg' %i)

先定位到位置,然後我們構建了一個關鍵字長度的公式,以及的範圍的公式,這當中絕大部分參考百度,感謝百度!通過上面的布置,可以把百度指數的圖片給下載下來,接下來的工作就是從這些圖片中進行數字的識别。

三倍做空納斯達克指數百度_百度指數_指數百度com

index = []
for m in range(30):    jpgzoom = Image.open("E:/downloads/crop%s.jpg" %m)    (x, y) = jpgzoom.size    x_s = 2*x    y_s = 2*y    out = jpgzoom.resize((x_s, y_s), Image.ANTIALIAS)    out.save('E:/downloads/zoom%s.jpg' %m, quality=95)    image = Image.open('E:/downloads/zoom%s.jpg' %m)    code = pytesseract.image_to_string(image)
   if code:        code=code.replace('.','').replace(',','')        index.append(code)
   else:        code=''        index.append(code)

with
open ('E:/downloads/index.txt','w') as f:
   for item in index:        f.write(item + '\n')

這裡的主要思想是:先将圖片放大一倍從而提高識别率,然後用這個模塊進行識别,因為我們截取的數字在圖片中十分‘幹淨’,無需做什麼處理,很開心,隻需對識别結果中的 ’,’ 或者是 ’.’ 去除即可。

指數百度com_三倍做空納斯達克指數百度_百度指數

結語

OK,關于百度指數數據抓取的分享就到這裡,歡迎各位網友投稿和交流。如需完整代碼,可關注公衆号并回複“百度指數”。

你可能想看:

有話要說...

取消
掃碼支持 支付碼