百度指数抓取-趋势截图+估算方法

来源:互联网 发布:时尚杂志知乎 编辑:程序博客网 时间:2024/05/22 15:38

十一在家陪孩子,过去一年,因为百度指数抓取那篇文章,很多人添加我的QQ询问百度指数抓取的事情,趁着有点闲心,就把批量全自动抓取趋势给做了。这次改用Python了,屈屈200行代码,搞定登录,查询,截图保存,识别,差值估算。现在程序可以全自动抓取一个词最近三十天的百度指数趋势,采用的预估模式。

要进一步扩展到多词,更细的时间力度,都很容易。


几个关键点如下
1. 使用selenium + chromedriver来获取百度指数的页面,这里有个坑,chromedriver每次都是全新的配置访问,每次使用百度指数的都需要输入用户名密码和验证码,没有验证码还好,有了验证码,为了实现全自动,chromedriver启动需要每次指定同一个用户数据目录,这样,登录一次,以后就不需要登陆了,直接启动chrome就可以直接访问了。
这里的核心代码是
options = webdriver.ChromeOptions()
options.add_argument("--user-data-dir=C:\\SomeWhere")
browser = webdriver.Chrome(chrome_options=options)


2. 无论是估算还是精确计算,都需要用到selenium的截图+tesseract的ocr。截图很容易。OCR会遇到一些麻烦
OCR我遇到的问题是,百度的数字,直接截图,然后ocr
pytesseract.image_to_string(img, lang="eng", config="-psm 7 baiduidx")
总是分不清5和6,0也经常识别不出来。识别率远低于50%,基本不可用。
(baiduidx是我自己仿照digits写的配置,只保留数字部分。)
经过多次尝试分析,百度的数字是一个像素粗细,5和6非常接近,只是左边一个像素的差别,因此OCR识别有困难。解决方案就是使用PIL对图形进行放大,灰度化,二值化,然后识别率100%


3. 预估的方法其实比较简单,就是找到右侧的7个坐标,自动识别,从而确定图像区域对应的最大值和最小值。找曲线,就按照固定的颜色找就行,根据曲线所在Y轴像素坐标,插值计算出对应的百度指数,大概有个1%左右的误差,其实百度指数也不是那么精确地,也是统计估算。


4. 下次有空了,再把精确识别也做了,基本思路有了,就是selenium模拟鼠标操作,然后从div里找到显示的文字,截图,然后ocr。 (百度用的一张数字打碎的图片做css背景,然后用css坐标来拼这个数字,截图+OCR是最有效的了)


不把代码贴上来,主要是防止太多人抓取百度,导致百度指数再次升级,使得自动抓取又要维护,又麻烦。愿意交流的欢迎加QQ齐齐死要久而吧QQ
0 0
原创粉丝点击