首先呢,今天要介绍的爬虫不同于我们日常生活中见到的昆虫,而是在网络世界中从网站中抓取数据的网络爬虫。我们日常百度搜索引擎中可以查询到诸如知乎,微博等网站的信息都要归功于爬虫,二者一个提供内容,一个提供流量,相得益彰。
比如说tophub这个网站,他上面集成了知乎,微信,b站,豆瓣等网站的热榜,网站建造的初衷是为了告别各大网站的智能推荐,他只是提供了一个平台,涉及到详情都会跳转到各网站的原始网页,不抓取正文内容。
robots.txt
各行都有各行的规矩,提到爬虫就不得不说一下robots.txt
这个文件,他是一个网站和爬虫间的协议,声明了对应的爬虫被允许的权限,我们在爬取之前最好也能够查阅下文件,看看自己要爬取的内容是否是被允许的。
下面给大家介绍下几个字段含义:
User-agent 标识允许的机器人种类,*泛指所有
Disallow 标识不被允许的访问路径
Allow 标识被允许的访问路径
下面为大家列举常见网站的爬虫名称:
百度蜘蛛:Baiduspider
谷歌蜘蛛:Googlebot
360蜘蛛:360Spider
有道蜘蛛:YoudaoBot,YodaoBot
MSN蜘蛛:msnbot
必应蜘蛛:bingbot
字节跳动:ByteSpider
下面列举几个网站的robots.txt
文件,便于理解:
// https://www.taobao.com/robots.txt
User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /
通过查看淘宝的文件,可以发现淘宝唯独禁用了百度的搜索引擎蜘蛛,在这个流量为王的时代,如果百度可以搜到淘宝的店铺,久而久之,百度就可以把商品的流量引向其他电商平台,这对淘宝无疑是一项损失,淘宝不禁用其他个人账户的原因也很明显,因为他需要其他个人或者网站对他的商品进行推广。
https://www.toutiao.com/robots.txt
User-agent: *
Disallow: /
Allow: /complain/
Allow: /media_partners/
Allow: /about/
Allow: /user_agreement/
Allow: /$
User-agent: ByteSpider
Allow: /
User-agent: ToutiaoSpider
Allow: /
可见,他对于ByteSpider
和ToutiaoSpider
是放行的(自己人),而对于其他引擎,则是规定了可以访问的几个路径,特别说明 Allow: /$
表示,可以抓取以/
结尾的路径,我不是很理解这样写的含义,知道的小伙伴希望能够留言告诉我。
本次会以爬取知乎为例进行介绍,由于知乎的robots文件过长,这里就不列举了。值得注意的是,他还单独添加了一个对Bytespider
的“禁令”,这个听名字就像是字节跳动的爬虫,实际上也是哈,这里面还有一些历史渊源。19年6月份开始字节的小爬虫就开始从各大网站疯狂爬取内容,当年经常把一些小网站直接爬瘫痪掉,所以很多网站对他也是敬而远之。有没有突然发现多涉猎一些还是挺有意思的,无意间会发现一些“陈年往事”。
我们爬取的网站有些是需要登录的,这类网站的爬取一般是比较复杂的,入门阶段我们可以选择一些暴露在公网的链接,例如同样是知乎热榜http://zhihu.com/hot
是需要登录的,而http://zhihu.com/billboard
则无需登录,由于我们不涉及商用或者谋取利益,所以本次行为并不违反法律,本次实现使用的是JavaScript
。
准备:
node
环境axios
// 网络访问cheerio
// 解析返回的html
文字Let’s go!
var fs = require("fs")
var cheerio = require("cheerio")
var axios = require("axios")
axios.get("http://zhihu.com/billboard").then(rst => {
var $ = cheerio.load(rst.data)
var divs = $(".Card a")
var hotArray = []
for (var i = 0; i < divs.length; i++) {
var div = divs.eq(i)
var hotNew = {
title: div.find(".HotList-itemTitle").eq(0).text().trim(),
metrics: div.find(".HotList-itemMetrics").eq(0).text().trim(),
pic: div.find("img").eq(0).attr('src').trim()
}
hotArray.push(hotNew)
}
console.log(hotArray.length)
})
单看代码还是比较容易理解的,billboard
接口返回的是一个页面,如下图所示:
通过f12
可以看到热榜的html
源代码,在class="Card"
的div
下有若干个以下代码结构:
<a class="HotList-item" data-za-detail-view-path-module="FeedItem" data-za-extra-module="{
"attached_info_bytes":"CjcIABADGgg2NzAwMDA3NiCtzqGHBjAPOK8EQAVyCTQ3MTI0MjgwNHgAqgEJYmlsbGJvYXJk0gEA"}">
<div class="HotList-itemPre">
<div class="HotList-itemIndex">06div>
<div class="HotList-itemLabel" style="color: rgb(241, 64, 60);">div>
div>
<div class="HotList-itemBody">
<div class="HotList-itemTitle">
滴滴全家桶被下架事件,给中国互联网行业带来哪些影响和警示?
div>
<div class="HotList-itemExcerpt">div>
<div class="HotList-itemMetrics">455 万热度div>
div>
<div class="HotList-itemImgContainer">
<span>span>
<img src="https://pic3.zhimg.com/80/v2-7f0a525ce7ceccb86a1d0229dce2ab50_720w.png" alt="滴滴全家桶被下架事件,给中国互联网行业带来哪些影响和警示?" />
div>a>
然后通过for
循环来解析每一个热点条目的标题,热度以及图片链接。根据解析的对象数组,在前端页面中将热点根据自己的需求进行展示。
以上就是爬虫的原理以及简单实现,简单梳理下实现“爬虫”的三个步骤
url
以及相关参数,可以通过浏览器network,或者更高级的抓包工具fidder
、wireshark
等完成url
模拟发送请求html
解析工具,复杂的可以通过xpath
、正则来解析返回的内容这里啰嗦一句,大家的用户名密码,千万不要在不可信的第三方的网站输入,比如一些信用卡助手,可以帮你接收多个信用卡的信息。提醒还款,但是一旦获取到你的用户名密码,就可以通过爬虫模拟请求获取你信用卡的很多私密信息,更有甚者,可以使用“套壳”操作模仿用户发送验证码,然后诱导你把验证码发给他们。他们窥探到你的信息,可能远比你知道的多。
最后,欢迎大家pick我的视频,多提宝贵意见!