puppeteer爬虫的奇妙之旅

news/2024/7/1 2:53:49

@(爬虫)[puppeteer|]

爬虫又称网络机器人。每天或许你都会使用搜索引擎,爬虫便是搜索引擎重要的组成部分,爬取内容做索引。现如今大数据,数据分析很火,那数据哪里来呢,可以通过网络爬虫爬取啊。那我萌就来探讨一下网络爬虫吧。


[TOC]

爬虫的工作原理

如图所示,这是爬虫的流程图,可以看到通过一个种子URL开启爬虫的爬取之旅,通过下载网页,解析网页中内容存储,同时解析中网页中的URL 去除重复后加入到等待爬取的队列。然后从队列中取到下一个等待爬取的URL重复以上步骤,是不是很简单呢?

广度(BFS)还是深度(DFS)优先策略

上面也提到在爬取完一个网页后从等待爬取的队列中选取一个URL去爬去,那如何选择呢?是选择当前爬取网页中的URL 还是继续选取当前URL中同级URL呢?这里的同级URL是指来自同一个网页的URL,这就是爬取策略之分。

广度优先策略(BFS)

广度优先策略便是将当前某个网页中URL先爬取完全,再去爬取从当前网页中的URL爬取的URL,这就是BFS,如果上图的关系图表示网页的关系,那么BFS的爬取策略将会是:(A->(B,D,F,G)->(C,E));

深度优先策略(DFS)

深度优先策略爬取某个网页,然后继续去爬取从网页中解析出的URL,直到爬取完。 (A->B->C->D->E->F->G)

下载网页

下载网页看起来很简单,就像在浏览器中输入链接一样,下载完后浏览器便能显示出来。当然结果是并不是这样的简单。 ####模拟登录 对于一些网页来说需要登录才能看到网页中内容,那爬虫怎么登录呢?其实登录的过程就是获取访问的凭证(cookie,token...)

let cookie = '';
let j = request.jar()
async function login() {if (cookie) {return await Promise.resolve(cookie);}return await new Promise((resolve, reject) => {request.post({url: 'url',form: {m: 'username',p: 'password',},jar: j}, function(err, res, body) {if (err) {reject(err);return;}cookie = j.getCookieString('url');resolve(cookie);})})
}
复制代码

这里是个简单的栗子,登录获取cookie, 然后每次请求都带上cookie.

获取网页内容

有的网页内容是服务端渲染的,没有CGI能够获得数据,只能从html中解析内容,但是有的网站的内容并不是简单的便能获取内容,像linkedin这样的网站并不是简单的能够获得网页内容,网页需要通过浏览器执行后才能获得最终的html结构,那怎么解决呢?前面我萌提到浏览器执行,那么我萌有没有可编程的浏览器呢?puppeteer,谷歌chrome团队开源的无头浏览器项目,利用无头浏览器便能模拟用户访问,便能获取最重网页的内容,抓取内容。 利用puppeteer 模拟登录

async function login(username, password) {const browser = await puppeteer.launch();page = await browser.newPage();await page.setViewport({width: 1400,height: 1000})await page.goto('https://maimai.cn/login');console.log(page.url())await page.focus('input[type=text]');await page.type(username, { delay: 100 });await page.focus('input[type=password]');await page.type(password, { delay: 100 });await page.$eval("input[type=submit]", el => el.click());await page.waitForNavigation();return page;
}
复制代码

执行login()后便能像在浏览器中登录后,便能像浏览器中登录后便能获取html中的内容,当然也可以直接请求CGI

async function crawlData(index, data) {let dataUrl = `https://maimai.cn/company/contacts?count=20&page=${index}&query=&dist=0&cid=${cinfo.cid}&company=${cinfo.encodename}&forcomp=1&searchTokens=&highlight=false&school=&me=&webcname=&webcid=&jsononly=1`;await page.goto(dataUrl);let res = await page.evaluate((e) => {return document.body.querySelector('pre').innerHTML;});console.log(res)res = JSON.parse(res);if (res && res.result == 'ok' && res.data.contacts && res.data.contacts.length) {data = data.concat(res.data.contacts.map((item) => {let contact = item.contact;console.log(contact.name)return {name: contact.name,occupation: contact.line4.split(',')[0],company: contact.company,title: contact.position}}));return await crawlData(++index, data);}return data;}
复制代码

像有的网站,拉钩,每次爬取的cookie都一样,也能利用无头浏览器取爬取,这样每次就不用每次爬取的时候担心cookie.

写在最后

当然爬虫不仅仅这些,更多的是对网站进行分析,找到合适的爬虫策略。对后关于puppeteer,不仅仅可以用来做爬虫,因为可以编程,无头浏览器,可以用来自动化测试等等。

转载于:https://juejin.im/post/5bee48ee6fb9a049cd53c606


http://lihuaxi.xjx100.cn/news/235894.html

相关文章

linux常用运维工具uptime、iostat、vmstat、sar

目录 一、uptime 二、iostat 三、vmstat 四、sar 一、uptime uptime可以告诉你系统已经运行了多久。uptime命令回显一行信息,包括:系统运行了多久,目前有多少用户在登录,过去1、5、15分钟系统平均负载。这些内容和命令w回显的…

手持终端以物联网的模式

近年来,物联宇手持终端以物联网的模式,开启了信息化的管理模式,迸发了新的自我提升和业务新商机。手持终端是一款智能的电子设备,它的核心功能为用户速带来业务效率的提升,如快递行业,每天的工作量需求大&a…

Linux基础教程之linux文件权限深度解读

基本命令——来源于马哥教育官网1.cut: cat /etc/passwd | cut -d’:’ -f7| uniq -c| sort -nr 2.authconfig 修改加密方式–passalgosha256 — update3.scp 上传文件-r dir ip:path 传目录file ip:path传文件-P port 指定端口4.rsync 同步文件-avz 源文件 ip:pathscp和rsync都…

中国互联网公司开源项目调研报告

近年来,开源技术得到越来越多的重视,微软收购GitHub、IBM收购红帽,都表明了开源的价值。国内公司也越来越多的参与开源,加入开源基金会/贡献开源项目。但是,它们到底做得如何呢?为此InfoQ统计了国内在GitHu…

centos8编译openssl-1.0.2u、openssl-1.1.1k

目录 一、给openssl-1.0.2u打包rpm 二、编译安装openssl-1.1.1k 三、给openssl-1.1.1k打包rpm(不推荐!) 近日openssl爆出拒绝服务、证书绕过漏洞,CVE编号CVE-2021-3449、CVE-2021-3450。 解决方法: CentOS7默认ope…

rabbitmq可靠发送的自动重试机制 --转

原贴地址 https://www.jianshu.com/p/6579e48d18ae https://www.jianshu.com/p/4112d78a8753 git项目代码地址 https://github.com/littlersmall/rabbitmq-access 转载于:https://www.cnblogs.com/hmpcly/p/10641688.html

【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用

目录 一、故障重现 二、救援过程 一、故障重现 近日为了解决CVE-2021-3449: 拒绝服务漏洞、CVE-2021-3450: 证书校验漏洞,自己编译了openssl-1.1.1k。 亲测发现:只升级openssl的版本,动态库版本没有升级,系统可用。 升级openss…