侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解python3百度指数抓取实例

Python  /  管理员 发布于 7年前   158

百度指数抓取,再用图像识别得到指数

前言:

土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字:

哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福

安装的库很多:

谷歌图像识别tesseract-ocrpip3 install pillowpip3 install pyocrselenium2.45Chrome47.0.2526.106 m or Firebox32.0.1chromedriver.exe

图像识别验证码请参考:///article/92287.htm

selenium用法请参考:///article/52329.htm

进入百度指数需要登陆,登陆的账号密码写在文本account里面:

万能登陆代码如下:

# 打开浏览器def openbrowser():  global browser  # https://passport.baidu.com/v2/?login  url = "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F"  # 打开谷歌浏览器  # Firefox()  # Chrome()  browser = webdriver.Chrome()  # 输入网址  browser.get(url)  # 打开浏览器时间  # print("等待10秒打开浏览器...")  # time.sleep(10)  # 找到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()  # 输入账号密码  # 输入账号密码  account = []  try:    fileaccount = open("../baidu/account.txt")    accounts = fileaccount.readlines()    for acc in accounts:      account.append(acc.strip())    fileaccount.close()  except Exception as err:    print(err)    input("请正确在account.txt里面写入账号密码")    exit()  browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(account[0])  browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(account[1])  # 点击登陆登陆  # id="TANGRAM__PSP_3__submit"  browser.find_element_by_id("TANGRAM__PSP_3__submit").click()  # 等待登陆10秒  # print('等待登陆10秒...')  # time.sleep(10)  print("等待网址加载完毕...")  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()        # 输入账号密码        account = []        try:          fileaccount = open("../baidu/account.txt")          accounts = fileaccount.readlines()          for acc in accounts:account.append(acc.strip())          fileaccount.close()        except Exception as err:          print(err)          input("请正确在account.txt里面写入账号密码")          exit()        browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(account[0])        browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(account[1])        # 点击登陆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):")

登陆的页面:

登陆过后需要打开新的窗口,也就是打开百度指数,并且切换窗口,在selenium用:

# 新开一个窗口,通过执行js来新开一个窗口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(keyword)# 点击搜索# <input type="submit" value="" id="searchWords" onclick="searchDemoWords()">browser.find_element_by_id("searchWords").click()time.sleep(2)# 最大化窗口browser.maximize_window()# 构造天数sel = int(input("查询7天请按0,30天请按1,90天请按2,半年请按3:"))day = 0if sel == 0:  day = 7elif sel == 1:  day = 30elif sel == 2:  day = 90elif sel == 3:  day = 180sel = '//a[@rel="' + str(day) + '"]'browser.find_element_by_xpath(sel).click()# 太快了time.sleep(2)

天数也就是这里:

找到图形框:

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

图形框就是:

根据坐标点的不同构造偏移量:

选取7天的坐标来观察:

第一个点的横坐标为1031.66666

第二个点的横坐标为1234

所以7天两个坐标之间的差为:202.33,其他的天数类似

用selenium库来模拟鼠标滑动悬浮:

from selenium.webdriver.common.action_chains import ActionChainsActionChains(browser).move_to_element_with_offset(xoyelement,x_0,y_0).perform()

但是这样子确定的点指出是在这个位置:

也就是矩形的左上角,这里是不会加载js显示弹出框的,所以要给横坐标+1:

x_0 = 1y_0 = 0

写个按照天数的循环,让横坐标累加:

# 按照选择的天数循环for i in range(day):  # 构造规则  if day == 7:    x_0 = x_0 + 202.33  elif day == 30:    x_0 = x_0 + 41.68  elif day == 90:    x_0 = x_0 + 13.64  elif day == 180:    x_0 = x_0 + 6.78

鼠标横移时会弹出框,在网址里面找到这个框:

selenium自动识别之...:

# <div class="imgtxt" style="margin-left:-117px;"></div>imgelement = browser.find_element_by_xpath('//div[@id="viewbox"]')

并且确定这个框的大小位置:

# 找到图片坐标locations = imgelement.locationprint(locations)# 找到图片大小sizes = imgelement.sizeprint(sizes)# 构造指数的位置rangle = (int(locations['x']), int(locations['y']), int(locations['x'] + sizes['width']),     int(locations['y'] + sizes['height']))

截取的图形为:


下面的思路就是:

1.将整个屏幕截图下来

2.打开截图用上面得到的这个坐标rangle进行裁剪

但是最后裁剪出来的是上面的那个黑框,我想要的效果是:

 

所以要对rangle进行计算,但是我懒,忽略了搜索词的长度,直接暴力的写成:

# 构造指数的位置rangle = (int(locations['x'] + sizes['width']/3), int(locations['y'] + sizes['height']/2), int(locations['x'] + sizes['width']*2/3),     int(locations['y'] + sizes['height']))

这个写法最终不太好,最起码要对keyword的长度进行判断,长度过长会导致截图坐标出现偏差,反正我知道怎么做,就是不写出来给你们看!

后面的完整代码是:

# <div class="imgtxt" style="margin-left:-117px;"></div>imgelement = browser.find_element_by_xpath('//div[@id="viewbox"]')# 找到图片坐标locations = imgelement.locationprint(locations)# 找到图片大小sizes = imgelement.sizeprint(sizes)# 构造指数的位置rangle = (int(locations['x'] + sizes['width']/3), int(locations['y'] + sizes['height']/2), int(locations['x'] + sizes['width']*2/3),     int(locations['y'] + sizes['height']))# 截取当前浏览器path = "../baidu/" + str(num)browser.save_screenshot(str(path) + ".png")# 打开截图切割img = Image.open(str(path) + ".png")jpg = img.crop(rangle)jpg.save(str(path) + ".jpg")

但是后面发现裁剪的图片太小,识别精度太低,所以需要对图片进行扩大:

# 将图片放大一倍# 原图大小73.29jpgzoom = Image.open(str(path) + ".jpg")(x, y) = jpgzoom.sizex_s = 146y_s = 58out = jpgzoom.resize((x_s, y_s), Image.ANTIALIAS)out.save(path + 'zoom.jpg', 'png', quality=95)

原图大小请 右键->属性->详细信息 查看,我的是长73像素,宽29像素

最后就是图像识别

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

最后效果图:

源码下载:demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Python 包含汉字的文件读写之每行末尾加上特定字符
    下一条:
    python实现多线程抓取知乎用户
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客