如果需要帮忙爬取数据,请加QQ:2422035338

一.前言:

1、本博客主要介绍百度指数爬取,360指数获取类似;

2、想要获取数据必须先登录百度指数,频繁登陆会导致要求输入验证码和手机验证码;

3、百度指数的数值是采用html格式+加密二进制传输, 不能够通过直接获取节点进而获取数值。

二.爬取思路:

1、首先使用selenium+chrome模拟登陆百度账号,获取cookie;

2、由于有时候需要验证码登陆,所以需要保存cookie模拟登陆;

3、模拟登陆,输入关键词进入有指数页面,截整个图保存本地;

4、读取图片,找到搜索指数所在区域,截取图片;

5、使用Tesseract-OCR进行图像识别,若数字识别不准确,需使用jTessBoxEditor训练数据提高准确度。

三.主要代码介绍:

1.登录

url = 'http://index.baidu.com/'
driver = webdriver.Chrome(executable_path='C:/Program Files             (x86)/Google/Chrome/Application/chromedriver.exe')
driver.get(url)
cookieList = []
for cookie in cookieList:driver.add_cookie(cookie)
driver.get(url)
time.sleep(3)
driver.refresh()

此处cookieList已被我删除,获取方法:第一次模拟登陆时手动输入账号和密码,通过driver.get_cookies()获取,程序如下(该段程序只是获得cookies,获得的cookies添加到cookieList中,以后这段程序就无需放到爬虫程序中了):

url = 'http://index.baidu.com/'
driver = webdriver.Chrome(executable_path='C:/Program Files     (x86)/Google/Chrome/Application/chromedriver.exe')
driver.get(url)
time.sleep(30)
cookies=driver.get_cookies()
print(cookies)

设置中间停顿30秒,输入账号,把打印下来的cookies(字典形式)粘贴到原来代码的cookieList中,这样就可以跳过验证码和输入密码登录

2.输入关键词并最大化界面

WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='search-input']")))
driver.find_element_by_xpath("//input[@class='search-input']").send_keys(keyword)
WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='search-input-cancle']")))
driver.find_element_by_xpath("//span[@class='search-input-cancle']").click()
driver.maximize_window()

3.鼠标移动到指数所在矩形框并进行移动使出现viewbox

time.sleep(2)
WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#trend > svg > rect')))
element = driver.find_elements_by_css_selector('#trend > svg > rect')[1]
time.sleep(2)
ActionChains(driver).move_to_element_with_offset(element, x, y).perform()
time.sleep(3)
driver.get_screenshot_as_file(str(index)+'.png')
WebDriverWait(driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='viewbox']")))

4.获取viewbox位置截图并进行图像识别

element = driver.find_element_by_xpath("//div[@id='viewbox']")
getElementImage(driver,element, str(index)+'.png', 'day'+str(index)+'.png',keyword)
time.sleep(2)
number = Image.open('day'+str(index)+'.png')
number = pytesseract.image_to_string(number,lang='fontyp')
number = re.sub(r',?\.?\s?', '', number)
number=number.replace('z','2').replace('i','7').replace('e','9')
print(number)
def getElementImage(driver,element,fromPath,toPath,keyword):"""该元素所对应的截图:param element: 元素:param fromPath: 图片源:param toPath: 截图"""# 找到图片坐标locations = element.location# 跨浏览器兼容scroll = driver.execute_script("return window.scrollY;")top = locations['y'] - scroll# 找到图片大小sizes = element.size# 构造关键词长度add_length = (len(keyword) - 2) * sizes['width'] / 15# 构造指数的位置rangle = (int(locations['x'] + sizes['width'] / 4 + add_length)-2, int(top +         sizes['height'] / 2),int(locations['x'] + sizes['width'] * 2 / 3)+2, int(top + sizes['height']))time.sleep(2)image = Image.open(fromPath)cropImg = image.crop(rangle)cropImg.save(toPath)

四、优化

1.若想获取30天的数据,则鼠标往右移动的宽度为41.68像素较为合适,但这个宽度不是数据所在矩形框的平均值(41.86),前者使用没有问题,后者使用会不出现viewbox,小编也不知道为什么,有知道的朋友麻烦留言告知一下,非常感谢。

2.使用jTessBoxEditor训练数据集提高识别准确率,具体见https://www.cnblogs.com/zhang-ke/p/7606572.html

五、结尾

本博客主要介绍的是爬取30天每天的百度指数,读者可以拓展爬取其他时间段或者地区的指数。360指数爬取类似,不过到小编写这篇博客为止,360指数上有地区选项但仍然无法点开!

百度指数爬取代码在github:https://github.com/kingdomrushing/SpiderbaiduIndex-python

CSDN下载:https://download.csdn.net/download/qq_37913997/10711752

百度指数爬虫最新版(2020年12月1号):

import requests
import sys
import timeword_url = 'http://index.baidu.com/api/SearchApi/thumbnail?area=0&word={}'
COOKIES = ''
headers = {'Accept': 'application/json, text/plain, */*','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'no-cache','Cookie': COOKIES,'DNT': '1','Host': 'index.baidu.com','Pragma': 'no-cache','Proxy-Connection': 'keep-alive','Referer': 'http://index.baidu.com/v2/main/index.html','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36','X-Requested-With': 'XMLHttpRequest',
}def decrypt(t,e):n = list(t)i = list(e)a = {}result = []ln = int(len(n)/2)start = n[ln:]end = n[:ln]for j,k in zip(start, end):a.update({k: j})for j in e:result.append(a.get(j))return ''.join(result)def get_ptbk(uniqid):url = 'http://index.baidu.com/Interface/ptbk?uniqid={}'resp = requests.get(url.format(uniqid), headers=headers)if resp.status_code != 200:print('获取uniqid失败')sys.exit(1)return resp.json().get('data')def get_index_data(keyword, start='2011-01-03', end='2019-08-05'):keyword = str(keyword).replace("'", '"')url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={keyword}&area=0&startDate={start}&endDate={end}'resp = requests.get(url, headers=headers)if resp.status_code != 200:print('获取指数失败')sys.exit(1)content = resp.json()data = content.get('data')user_indexes = data.get('userIndexes')[0]uniqid = data.get('uniqid')ptbk = get_ptbk(uniqid)while ptbk is None or ptbk == '':ptbk = get_ptbk(uniqid)all_data = user_indexes.get('all').get('data')result = decrypt(ptbk, all_data)result = result.split(',')print(result)if __name__ == '__main__':words = [[{"name": "酷安", "wordType": 1}]]get_index_data(words)

该代码由网友提供,详情见https://zhuanlan.zhihu.com/p/78634149

百度指数后台代码经常更新,如需最新代码请加QQ:2422035338

百度指数、360指数爬虫python版:基于selenium+chrome和图像识别技术相关推荐

  1. Python版基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式

    基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式 按空格进入单人模式,按't'进入双人模式,双人模式下玛丽1采用空格键上跳,玛丽2采用方向上键上跳. 完整代码下载地址:Pyth ...

  2. python基础教程:Python如何基于selenium实现自动登录博客园

    这篇文章主要介绍了Python如何基于selenium实现自动登录博客园,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要做的准备: 本文章是使用 ...

  3. 【Python】基于Selenium实现上海大学校园网自动登录

    [Python]基于Selenium实现上海大学校园网自动登录 安装selenium Selenium官网 以anaconda环境为例,创建一个Selenium的虚拟环境,若不需要可以不做第一.二步 ...

  4. 读“基于深度学习的图像识别技术研究综述”有感

    "基于深度学习的图像识别技术研究综述"总结 现在流行的图像识别技术都是基于深度学习的算法,经过前辈们的探索改进,图像识别技术经历很多阶段,现如今图像识别技术已经广泛的应用于生活的方 ...

  5. python如何爬取图片_百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://5912119.blog.51cto.com/5902119/1771391 这一篇我想写写如何爬取百度图片的爬虫, ...

  6. Python版基于递归的冒泡排序算法

    应读者要求,写个基于递归的冒泡排序算法代码,之前发过的排序算法代码请参考Python版快速排序算法,Python版选择排序算法,Python版冒泡法排序算法. from random import r ...

  7. Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证

    配置一下"可能需要修改的参数",就可以食用底部代码了,ps:可能已失效 本文章代码功能 准备工作 Python用到的库和准备工作 可能需要修改的参数 在CMD中打开一个Chrome ...

  8. 【转载】从百度、360、搜狗对新站态度看国内搜索引擎技术现状

    为什么80%的码农都做不了架构师?>>>    原文链接:http://blog.lmlphp.com/archives/3  来自LMLPHP后院 我从事互联网行业这么多年,一直没 ...

  9. python webdriver save_Python + Selenium +Chrome 批量下载网页代码修改【新手必学】

    Python + Selenium +Chrome 批量下载网页代码修改 主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt 来达到在登陆状态下 批量打开并下载网 ...

最新文章

  1. 闲话能力管理(Capacity Management)
  2. 如何利用SEO做好网站推广
  3. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略
  4. 深度思考 | 从BERT看大规模数据的无监督利用
  5. 检索数据_22_根据数据项的值排序
  6. Factory Method工厂方法
  7. 说说 JavaScript 计时器的工作原理
  8. QQ注册时间查询非常准确源码程序
  9. 使用PHP对word文档进行操作的方法
  10. js生成xlsx/xls格式文件并下载到本地
  11. mysql双机备份软件_MySql双机热备份
  12. Centos7+搜狗拼音输入法 安装不踩雷
  13. redis 通道 java_【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?...
  14. java基础:运算符
  15. dango shell 操作crud
  16. 是否能够成为真正的编程高手,主要是在于是否有毅力坚持学习和练习。今天从最简单的输出名言“贵有恒,何必三更起五更眠:最无益,只怕一日曝十日寒。”开始,主要是想让读者激励自己,坚持学习C语言。
  17. python和按键精灵自动化测试_自动化测试程序和按键精灵
  18. 员工离职2个月,前领导要求他回去改代码,员工:收费5千一次
  19. 七段数码管26字母对照表(附带映射表以及映射数组)
  20. 中小企业数字化转型小课堂(五)丨睿企管家-企业舆情助手

热门文章

  1. Alien Skin Eye Candy 7 for Mac(眼睛糖果滤镜PS插件)
  2. uva 11419 SAM I AM (最小覆盖 König定理)
  3. Unity城市虚拟搭建的时候,【房子】或【桥廊】跟随鼠标在【地面】或者【水面】移动
  4. 全国行政区划下载(高德)
  5. 动态规划---例题6.多边形游戏
  6. 十周年再发重磅新品,小米发布50倍潜望式变焦小米10青春版、MIUI 12
  7. python速学,一看就会
  8. 国外大牛教你,如何用Python开发一个简单的区块链数据结构| 建议收藏
  9. linux 打印两个文件内容相同行和不同行(交集和差集)
  10. 服装设计Marvelous Designer 11程序安装及注意事项