@(爬虫)[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

puppeteer爬虫的奇妙之旅相关推荐

  1. puppeteer爬虫

    @(爬虫)[puppeteer|] 爬虫又称网络机器人.每天或许你都会使用搜索引擎,爬虫便是搜索引擎重要的组成部分,爬取内容做索引.现如今大数据,数据分析很火,那数据哪里来呢,可以通过网络爬虫爬取啊. ...

  2. 《Arduino奇妙之旅:智能车趣味制作天龙八步》一2.4 准备好了吗?

    本节书摘来华章计算机<Arduino奇妙之旅:智能车趣味制作天龙八步>一书中的第2章 ,第2.4节,(美)James Floyd Kelly Harold Timmis 著 程晨 译更多章 ...

  3. 瑶琳c语言,来桐庐瑶琳仙境,开启一场18°C的奇妙之旅

    在杭州桐庐的瑶琳镇的瑶琳仙境,常年恒温在18摄氏度,是华东沿海中部亚热带湿润区喀斯特洞穴的典型代表. 瑶琳仙境得名于清朝,据清<桐庐县志>记载:"瑶琳洞,在县西北四十五里,洞口阔 ...

  4. 跟随报文,开启一段奇妙之旅

    摘要:跟随报文,从windows主机经过路由器到linux主机上溜达一下吧. 本文分享自华为云社区<报文在不同设备的奇妙之旅>,原文作者:鼓瑟吹笙. 简介 在上图中,HostA的报文转发到 ...

  5. 【实战】1382- 一文拥有属于你的 puppeteer 爬虫应用

    王志远,微医前端技术部.爱好吉他.健身.桌游,最最关键,资深大厂员工(kfc外卖小哥),trust me,好奇心使生命有趣起来! 背景 公司有日报,每天需要在公司的周报系统中填写并提交,日报内容很简单 ...

  6. Python奇妙之旅-出发吧

    IT赶路人,专注分享与IT相关的知识,关注我,一起成就最好的自己! 从今天开始,我就跟大家一块来学习Python.我把这个学习的过程定义为Python的奇妙之旅.那我们就开始我们今天的第一节,也就是我 ...

  7. 有故事的网页设计——Flash网站奇妙之旅

    [转]有故 事的网页设计--Flash网站奇妙之旅--by流氓兔斯基 当浏览网页时,总有那么一类网站华丽而富有趣味性.在浏览信息的同时,足够让我们眼前 一亮.它们 在充分融入动画.视频.游戏.甚至是与 ...

  8. 奇妙之旅:SIMD加速矩阵运算

    奇妙之旅:SIMD加速矩阵运算 1.前言 2.预备知识 3.计算逻辑 4.代码实战 1.前言   游戏会涉及到大量4x4的矩阵乘法运算,而乘法最简单直观的实现就是循环4×4×4次乘法,以及若干次加法, ...

  9. UNCTF2020的奇妙之旅-----CryptoMisc部分wp

    UNCTF2020的奇妙经历-----Crypto&Misc部分wp Crypto 1.easy_rsa 题目: from Crypto.Util import number import g ...

最新文章

  1. Python可视化matplotlib多子图可视化(Multiple Subplots):plt.axes()、plt.subplot()、plt.subplots()、
  2. Gitlab 生成 swagger 文档
  3. string类的各种函数用法
  4. 精通 ASP.NET MVC 4 学习笔记(一)
  5. 推荐实践:新一代Rank技术在阿里巴巴定向广告推荐系统中的应用与实践
  6. 华米OV 万亿 IoT 争夺战
  7. 华为s5700-SI交换机常用命令
  8. Android使adb作为host运行在arm64平台
  9. 开发时浏览器缓存问题
  10. jquery class选择器循环_web前端教程分享Jquery常见面试题
  11. 《算法导论》.pdf
  12. 使用cisco2811c当pptp ***接入设备
  13. 陕西省本级城镇企业退休人员 - 人脸识别APP资格认证操作指南
  14. C语言实现文件的加密解密
  15. 用无线插板控制RC(远程遥控)小车
  16. FFmpeg 安装与使用
  17. canvas 闭合_canvas绘图无法闭合问题
  18. Matlab exercise05
  19. 全球10支“超级”战队瓜分高达200万的总奖金,这是京东机器人挑战赛吗?
  20. 民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】...

热门文章

  1. Linux下的Shell编程(2)环境变量和局部变量
  2. switch和case的理解
  3. js正则表达式的使用详解
  4. DDD领域驱动设计之聚合、实体、值对象
  5. 【转】Linux Oracle服务启动停止脚本与开机自启动
  6. 河南省第二届ACM程序设计大赛解题报告(置换群)
  7. IPV6的设置问题!
  8. ASP.NET TricksTip:关于Tooltip(title)的换行问题
  9. 第四层到第七层的高层交换技术及其应用
  10. ASP.NET 2.0 读取配置文件[INI](示例代码下载)