首页 > 技术文章 > 百度指数感想

caicaihong 2017-01-05 14:17 原文

一、百度指数的发现

首先,我们先进入百度指数的官网:https://index.baidu.com/,如下图所示:

 

经过进入百度指数发现百度指数并没有公开的API可以获取,因为百度似乎在有意的增加百度指数的抓取难度. 返回的数据进行了加密,并且数据并不直接出现在页面上.javascript把加密的数据直接变成了页面上看到的图形。比如我输入世界杯,就会出现指数的格式如下图所示:

1、考虑能否直接采用抓取html协议

直接通过get或者post参数来获取百度指数的返回页面,然后用网页DOM模型提取对应标签数据,或者用正则表达式来提取。然后这种方法是行不通的,要不然谁都可以去拿了,就不需要我们这么费劲了,,真的够可以的,看来百度真会玩哦。。。但是我相信一定可以解决这个会玩的家伙,嘻哈。

既然她是一个图片,那我们就使用可以破解图片(也就是识别图片的方法来试一下,要是可以那就更好了,要是不可以,也不需要gg,路是慢慢的探索的)

好了,回归正题,听说Tesseract OCR框架可以识别图片耶,真的还是假的,都说是听说啦,肯定需要试一下,才知道是真的还是假的了。

首先,肯定需要安装很多需要的库拉。

谷歌图像识别Tesseract OCR需要很多库,首先是

pip install pillow

pip install pyocr

因为涉及到模拟点击,肯定需要安装火狐浏览器或者谷歌浏览器

首先安装selenium (2.53.6) 这个版本最好是这个的以下,否则火狐浏览需要安装多一点东西,很麻烦的。(再提示一下,火狐也是最好是4.6得版本)

如果是安装谷歌的话,那就需要再安装一个插件chromedriver.exe.

2、进行实战

首先要进行模拟登陆百度,所以就必须要密码和账号,然后手动输入验证码。

百度模拟登陆:

from selenium import webdriver
import time
url = "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F"
browser=webdriver.Firefox()
browser.get(url)
browser.find_element_by_id("TANGRAM__PSP_3__userName").clear()
browser.find_element_by_id("TANGRAM__PSP_3__password").clear()
username="xxxx"
password="xxxx"
browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(username)
browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(password)
browser.find_element_by_id("TANGRAM__PSP_3__submit").click()
select = input("请观察浏览器网站是否已经登陆(y/n):")
while 1:
    if select == "y" or select == "Y":
      print("登陆成功!")
      print("准备打开新的窗口...")
      # time.sleep(1)
      # browser.quit()
      break

    elif select == "n" or select == "N":
      selectno = input("账号密码错误请按0,验证码出现请按1...")
      # 账号密码错误则重新输入
      if selectno == "0":

        # 找到id="TANGRAM__PSP_3__userName"的对话框
        # 清空输入框
        browser.find_element_by_id("TANGRAM__PSP_3__userName").clear()
        browser.find_element_by_id("TANGRAM__PSP_3__password").clear()
        browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(username)
        browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(password)
        # 点击登陆sign in
        # id="TANGRAM__PSP_3__submit"
        browser.find_element_by_id("TANGRAM__PSP_3__submit").click()

      elif selectno == "1":
        # 验证码的id为id="ap_captcha_guess"的对话框
        input("请在浏览器中输入验证码并登陆...")
        select = input("请观察浏览器网站是否已经登陆(y/n):")

    else:
      print("请输入“y”或者“n”!")
      select = input("请观察浏览器网站是否已经登陆(y/n):")

 进入百度主页之后就打开一个新的页面,也就是百度指数的页面,链接:

http://index.baidu.com

进入输入关键词和点击事件的完成为:

js = 'window.open("http://index.baidu.com");'
browser.execute_script(js)
# 新窗口句柄切换,进入百度指数
# 获得当前打开所有窗口的句柄handles
# handles为一个数组
handles = browser.window_handles
print(handles)
# 切换到当前最新打开的窗口
browser.switch_to_window(handles[-1])
browser.find_element_by_id("schword").clear()
browser.find_element_by_id("schword").send_keys('世界杯')
browser.find_element_by_id("searchWords").click()

 登陆进去指数的页面如下:

顿时好像笑呀,哈哈哈!接下来才是任务艰巨的时刻!更多精彩敬请期待!

 

12/19:

进入指数主页面之后,就可以看到天数 

 

然后根据个人需要去自己选择所需要的天数,实现如下:

sel = int(input("查询7天请按0,30天请按1,90天请按2,半年请按3:"))
day = 0
if sel == 0:
  day = 7
elif sel == 1:
  day = 30
elif sel == 2:
  day = 90
elif sel == 3:
  day = 180

 找到需要坐标的东西啦啦啦。。。

当你点击你需要的天数的时候,就会出现你想要如下的信息:

所以,如果这个不出来,一切都是浮云。可是不知道为什么第一次刷新出来之后,后来都不可以了呢?难道真的就要gg了吗?哭晕在厕所了的日子应该不远了。

主要获取这个之后,我们就可以获取到这个坐标了,然后就可以进行好好的玩耍了。

这个主要是通过鼠标的转移就会加载出来的啦。

 点击每一个点的时候就会出现指数的对应的图片,如图所示:

接下来就是激动人心的时刻到了,

既然图片出来了,那就进行 识别吧!通过pytesseract去识别数字(注意:可能会存在识别不准确的原因,但是没有办法,这是宝宝想的目前可以实现的办法了)

# 图像识别
index = []
image = Image.open(str(path) + "zoom.jpg")
code = pytesseract.image_to_string(image)
if code:
  index.append(code)

识别出来的数字就存在一个列表里面,然后就进行存放数据库 ,demo大概完成。

 感想一下:由于近段时间太多事情忙,做了这个都是一些琐碎的时间,就靠平常的一些灵感去获取,可能结果不如我想像的那样子,每次做完一个东西的记录下来的感觉很好,我以后会不断更新我的学到的一些东西,敬请期待。

推荐阅读