怎样实现百度指数爬虫功能

这次给大家带来怎样实现百度指数爬虫功能,实现百度指数爬虫功能的注意事项有哪些,下面就是实战案例,一起来看一下。

之前看过一篇脑洞大开的文章,介绍了各个大厂的前端反爬虫技巧,但也正如此文所说,没有100%的反爬虫方法,本文介绍一种简单的方法,来绕过所有这些前端反爬虫手段。

下面的代码以百度指数为例,代码已经封装成一个百度指数爬虫node库: 注意事项github.com/Coffcer/baidu-index-spider

note: 请勿滥用爬虫给他人添麻烦

百度指数的反爬虫策略

观察百度指数的界面,指数数据是一个趋势图,当鼠标悬浮在某一天的时候,会触发两个请求,将结果显示在悬浮框里

可以发现,百度指数实际上在前端做了一定的反爬虫策略。当鼠标移动到图表上时,会触发两个请求,一个请求返回一段html,一个请求返回一张生成的图片。html中并不包含实际数值,而是通过设置width和注意事项,来显示图片上的对应字符。并且注意事项上带有res、res1这种我们不知如何模拟的参数,所以用常规的模拟请求或者html爬取的方式,都很难爬到百度指数的数据。

爬虫思路

怎么突破百度这种反爬虫方法呢,其实也很简单,就是完全不去管他是如何反爬虫的。我们只需模拟用户操作,将需要的数值截图下来,做图像识别就行。步骤大概是:

模拟登录

打开指数页面

鼠标移动到指定日期

等待请求结束,截取数值部分的图片

图像识别得到值

循环第3~5步,就得到每一个日期对应的值

这种方法理论上能爬任何网站的内容,接下来我们来一步步实现爬虫,下面会用到的库:

puppeteer 模拟浏览器操作

node-tesseract tesseract的封装,用来做图像识别

jimp 图片裁剪

安装Puppeteer, 模拟用户操作

Puppeteer是Google Chrome团队出品的Chrome自动化工具,用来控制Chrome执行命令。可以模拟用户操作,做自动化测试、爬虫等。用法非常简单,网上有不少入门教程,顺着本文看完也大概可以知道如何使用。

API文档: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md

安装:

npm install --save puppeteer

登录后复制

Puppeteer在安装时会自动下载Chromium,以确保可以正常运行。但是国内网络不一定能成功下载Chromium,如果下载失败,可以使用cnpm来安装,或者将下载地址改成淘宝的镜像,然后再安装:

npm config set PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrorsnpm install --save puppeteer

登录后复制

你也可以在安装时跳过Chromium下载,通过代码指定本机Chrome路径来运行:

// npmnpm install --save puppeteer --ignore-scripts// nodepuppeteer.launch({ executablePath: '/path/to/Chrome' });

登录后复制

实现

为版面整洁,下面只列出了主要部分,代码涉及到selector的部分都用了…代替,完整代码参看文章顶部的github仓库。

打开百度指数页面,模拟登录

这里做的就是模拟用户操作,一步步点击和输入。没有处理登录注意事项的情况,处理验证码又是另一个话题了,如果你在本机登录过百度,一般不需要验证码。

// 启动浏览器,// headless参数如果设置为true,Puppeteer将在后台操作你Chromium,换言之你将看不到浏览器的操作过程// 设为false则相反,会在你电脑上打开浏览器,显示浏览器每一操作。const browser = await puppeteer.launch({headless:false});const page = await browser.newPage();// 打开百度指数await page.goto(BAIDU_INDEX_URL);// 模拟登陆await page.click('...');await page.waitForSelecto('...');// 输入百度账号密码然后登录await page.type('...','username');await page.type('...','password');await page.click('...');await page.waitForNavigation();console.log(':white_check_mark: 登录成功');

登录后复制

模拟移动鼠标,获取需要的数据

需要将页面滚动到趋势图的区域,然后移动鼠标到某个日期上,等待请求结束,tooltip显示数值,再截图保存图片。

// 获取chart第一天的坐标const position = await page.evaluate(() => { const $image = document.querySelector('...'); const $area = document.querySelector('...'); const areaRect = $area.getBoundingClientRect(); const imageRect = $image.getBoundingClientRect(); // 滚动到图表可视化区域 window.scrollBy(0, areaRect.top); return { x: imageRect.x, y: 200 };});// 移动鼠标,触发tooltipawait page.mouse.move(position.x, position.y);await page.waitForSelector('...');// 获取tooltip信息const tooltipInfo = await page.evaluate(() => { const $tooltip = document.querySelector('...'); const $title = $tooltip.querySelector('...'); const $value = $tooltip.querySelector('...'); const valueRect = $value.getBoundingClientRect(); const padding = 5; return { title: $title.textContent.split(' ')[0], x: valueRect.x - padding, y: valueRect.y, width: valueRect.width + padding * 2, height: valueRect.height }});

登录后复制

截图

计算数值的坐标,截图并用jimp对裁剪图片。

await page.screenshot({ path: imgPath });// 对图片进行裁剪,只保留数字部分const img = await jimp.read(imgPath);await img.crop(tooltipInfo.x, tooltipInfo.y, tooltipInfo.width, tooltipInfo.height);// 将图片放大一些,识别准确率会有提升await img.scale(5);await img.write(imgPath);

登录后复制

图像识别

这里我们用Tesseract来做图像识别,Tesseracts是Google开源的一款OCR工具,用来识别图片中的文字,并且可以通过训练提高准确率。github上已经有一个简单的node封装: node-tesseract ,需要你先安装Tesseract并设置到环境变量。

Tesseract.process(imgPath, (err, val) => {if (err || val == null) { console.error(':x: 识别失败:' + imgPath); return;}console.log(val);

登录后复制

实际上未经训练的Tesseracts识别起来会有少数几个错误,比如把9开头的数字识别成`3,这里需要通过训练去提升Tesseracts的准确率,如果识别过程出现的问题都是一样的,也可以简单通过正则去修复这些问题。

封装

实现了以上几点后,只需组合起来就可以封装成一个百度指数爬虫node库。当然还有许多优化的方法,比如批量爬取,指定天数爬取等,只要在这个基础上实现都不难了。

const recognition = require('./src/recognition');const Spider = require('./src/spider');module.exports = { async run (word, options, puppeteerOptions = { headless: true }) { const spider = new Spider({  imgDir,  ...options  }, puppeteerOptions); // 抓取数据 await spider.run(word); // 读取抓取到的截图,做图像识别 const wordDir = path.resolve(imgDir, word); const imgNames = fs.readdirSync(wordDir); const result = []; imgNames = imgNames.filter(item => path.extname(item) === '.png'); for (let i = 0; i < imgNames.length; i++) { const imgPath = path.resolve(wordDir, imgNames[i]); const val = await recognition.run(imgPath); result.push(val); } return result; }}

登录后复制

反爬虫

最后,如何抵挡这种爬虫呢,个人认为通过判断鼠标移动轨迹可能是一种方法。当然前端没有100%的反爬虫手段,我们能做的只是给爬虫增加一点难度。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

注意事项

注意事项

以上就是怎样实现百度指数爬虫功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2773211.html

(0)
上一篇 2025年3月8日 13:43:51
下一篇 2025年3月8日 13:43:58

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue中调用百度地图插件

    这次给大家带来Vue中调用百度地图插件,Vue中调用百度地图插件的地图有哪些,下面就是实战案例,一起来看一下。 最近的项目里面,需要用到将具体地址转换成百度坐标系的经纬度,需求比较简单,所以就没有采用GitHub里面的百度Vue插件。 废话…

    2025年3月8日
    200
  • 如何用node实现爬虫功能

    这次给大家带来如何用node实现爬虫功能,用node实现爬虫功能的注意事项有哪些,下面就是实战案例,一起来看一下。 node是服务器端的语言,所以可以像python一样对网站进行爬取,下面就使用node对博客园进行爬取,得到其中所有的章节信…

    2025年3月8日
    200
  • 怎样使用JS实现百度搜索框

    这次给大家带来怎样使用JS实现百度搜索框,使用JS实现百度搜索框的注意事项有哪些,下面就是实战案例,一起来看一下。 效果:   1.当进入界面时,自动调用方法,获取当前的时间,并且实时更新时间。   2.点击页面头部的换肤,自动更换背景图片…

    2025年3月8日
    200
  • 浅谈Vue下使用百度地图的简易方法

    本篇文章主要介绍了浅谈vue下使用百度地图的简易方法,现在分享给大家,也给大家做个参考。 Vue下使用百度地图的简易方法,分享给大家,具体如下: 最近的项目里面,需要用到将具体地址转换成百度坐标系的经纬度,需求比较简单,所以就没有采用Git…

    2025年3月8日
    200
  • 怎样操作node实现爬虫效果

    这次给大家带来怎样操作node实现爬虫效果,操作node实现爬虫效果的注意事项有哪些,下面就是实战案例,一起来看一下。 node是服务器端的语言,所以可以像python一样对网站进行爬取,下面就使用node对博客园进行爬取,得到其中所有的章…

    2025年3月8日
    200
  • 怎样使用源生JS代码实现百度搜索框

    这次给大家带来怎样使用源生JS代码实现百度搜索框,使用源生JS代码实现百度搜索框的注意事项有哪些,下面就是实战案例,一起来看一下。 最近做了个百度搜索框今天给大家分享下。 效果:   1.当进入界面时,自动调用方法,获取当前的时间,并且实时…

    2025年3月8日
    200
  • vue项目中打包后通过百度的BAE发布到网上的流程步骤有哪些?

    这篇文章主要介绍了将vue的项目打包后通过百度的bae发布到网上的流程,主要运用的技术是vue+express+git+百度的应用引擎bae。需要的朋友可以参考下 经过两天的研究终于将VUE打包后的项目通过BAE发布到了网上。虽然接口方面还…

    2025年3月8日
    200
  • 爬虫分析之 JS逆向某验滑动加密(1)

    相关学习推荐:javascript视频教程 今天给大家来分析并还原某验的 JS 加密,做过爬虫的应该都知道这个验证码,如果你还没遇到以后你会碰到的相信我 话不多说,时间宝贵,进入正题! 抓包 进入官网,点击选择今天的主题滑动验证,其他验证类…

    2025年3月7日 编程技术
    200
  • 爬虫之 JS逆向某验滑动加密(2)

    相关学习推荐:javascript视频教程 上篇文章给大家分析还原了某验滑动的混淆代码,然后后台很多人在问后面的加密以及整个流程是啥,所以今天索性就把整个加密都弄出来吧 话不多说,时间宝贵,开干! 回到之前 w 的加密处 可以看到该函数接收…

    2025年3月7日 编程技术
    200
  • 使用nodejs实现一个简单的网页爬虫功能(附代码)

    本篇文章通过实例给大家介绍一下nodejs实现简单网页爬虫功能的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs》 网页源码 使用http.get()方法获取网页源码,以hao123网站的头条…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论