网络爬虫开发
第一章 课程介绍
- 什么是爬虫
- 爬虫的意义
- 课程内容
- 前置知识
1.什么是爬虫
可以把互联网比喻成一张大网,爬虫就是在这张大网上不断爬取信息的程序
所以,一句话总结: 爬虫是请求网站并提取数据的自动化程序
爬虫的基本工作流程如下:
- 向指定的URL发送http请求
- 获取响应(HTML、XML、JSON、二进制等数据)
- 处理数据(解析DOM、JSON等)
- 将处理好的数据进行存储
爬虫工作流程图:
根据URL地址发送请求 --> 获得响应
^ |
|
解析出新的URL <-- 对DOM文档进行解析 --> 过滤出符合要求的数据 --> 下载到本地或存储到数据库
2.爬虫的意义
爬虫就是一个探测程序,他的基本功能就是模拟人的行为去各个网站转悠,点点按钮,找找数据,或者把看到的信息背回啦。就像是一只虫子在一栋大楼里不知疲倦爬来爬去。
你可以简单的想象:每个爬虫都是你的“分身”。
你每天使用的百度和Google,其实就是利用了这种爬虫技术:每天放出无数的爬虫在各个网站上,把他们的信息抓回来,存储到数据库中等你来检索。
抢票软件,就相当于撒出无数个分身,每一个分身都不断帮你刷新12306网站的或者票剩余。一旦发现有票,就马上下单,然后对你提示“赶快来付款啦”
在现实中,几乎所有的行业的网站都会被爬虫所骚扰,而这些骚扰都是为了方便用户。
当然,有些网站是不能被过分骚扰的,其中排第一的就是出行类行业。
12306就是因为被爬虫折磨的无可奈何所以才会出各种变态的验证码
正所谓道高一尺魔高一丈,某些爬虫工具,为了解决这种变态的验证码,甚至推出了“打码平台”
原理就是爬虫还是在不断的工作,但只要遇到二维码,就通过打码平台下发任务,打码平台另一边就雇佣一大堆网络闲人,只要看到有验证码来了,就人工选一下验证码,完美的让程序与人工结合!
3. 课程内容及目标
- 爬虫简介
- 制作一个自动下载图片的小爬虫
- 使用Selenium爬取动态网站
4. 前置知识
- js基础
- node基础
第二章 爬虫基础
例如要下载黑马官网上所有老师的照片,需要一下步骤能实现:
- 发送http 请求,获取整个网页的内容
- 通过cheerio 对网页内容进行分析
- 提取img标签的src属性
- 使用download库进行批量图片下载
1. 发送一个http请求
2. 通过cheerio库对网页内容进行分析
2.1 安装cheerio
2.2 使用cheerio库进行解析html
2.3 提取img标签的src属性
2.4 使用download库进行批量图片下载
4. 爬取新闻信息
爬取目标:http://www.itcast.cn/newsvideo/newslist.html
5. 封装爬虫的基础库
以上代码重复的地方非常多,可以考虑以面向对象的思想对其进行封装,进一步提高代码的复用率,为了方便开发,保证代码规范,建议使用TS进行封装
以下知识点为扩展内容,需要对面向对象和TS有一定的了解
TS配置:
tsc --init
{
"compilerOptions": {
// basic Options
"target": "es2015",
"module": "commonjs",
"outDir": "./bin",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}
然后使用”ctrl+shift+b“快捷键,选择配置文件,就会运行ts转换成js的程序
会在当前目录下创建你所设定的输出文件夹以及对应的编译好文件,你可以直接运行编译好的js文件
第三章 爬虫高级
学习目标:
- 使用Selenium库爬取动态网页
- 反反爬虫技术
1. Selenium简介
Selenium是一个用于web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE7+,Mozilla Firefox,Safari,Google Chrome,Opera等。之歌工具主要包括:测试与浏览器的兼容性–测试你的应用程序看是否能够很好的工作在不同的浏览器和操作系统之上。测试系统功能–创建回归测试检验软件功能和用户需求。支持自动录制动作和自主生成.net,java,Perl等不同语言的测试脚本。
简单总结:
2. Selenium的基本使用
- 根据平台下载需要的webdriver
- 项目中安装selenium-webdriver包
- 根据官方文档写一个小demo
2.1 根据平台选择webdriver
首先要查看自己浏览器的版本,然后要在官网webdriver的安装包中找跟自己浏览器版本尽量一致的版本
浏览器 | webdriver |
---|---|
Chrome | chromederver |
IE | IEDriverserver |
Edge | MicrosoftWebDriver.msi |
Firefox | geckodriver |
Safari | safaridriver |
2.2 安装selenium-webdriver的包
npm i selenium-webdriver
2.3 自动打开搜索“黑马程序员”
const { Builder, By, Key, until } = require('selenium-webdriver')
(async function example() {
let driver = await new Builder().forBrowser('chrome').build()
try {
// 自动打开百度,并搜索河马程序员
await driver.get('http://www.baidu.com')
// 找到元素,按回车并执行搜索
await driver.findElemnet(By.id('kw')).sendKeys('黑马程序员', Key.RETURN)
// 验证搜索是否成功
await driver.wait(until.titleIs('黑马程序员 - 百度搜索'), 1000)
} finally {
// 退出
// await driver.quit()
}
})()
3. 使用selenium实现爬虫
在使用selenium之前要搞清楚一个问题
- 为什么要用selenium来做爬虫?
了解完后,还需要知道,如何实现爬虫?
- 自动打开拉勾网并搜索“前端开发”
- 获取所有列表项
- 获取其中想要的信息数据
3.1 为什么要用selenium来做爬虫
目前的大流量网站,都会有些对应的反爬虫机制
例如在拉勾网上搜索传智播客:
找到对应的ajax请求地址,使用postman来测试数据:
多测试几次,就会出现“您的操作太频繁,请稍后再访问“的响应
而通过selenium可以操作浏览器,打开某个网址,接下来只要学习API,就能获取网页中所需要的内容了!
反爬虫技术只是针对爬虫的,例如检查请求头是否像爬虫,检查IP地址的请求频率(如果过高则封杀)等手段而selenium 打开就是一个自动化测试的浏览器,和用户正常使用浏览器并没有差别,所以再厉害的反爬虫技术,也无法直接把它干掉,除非这个网站连普通用户都想放弃掉
3.2 seleniumAPI学习
核心对象:
- Builder
- WebDriver
- WebElement
辅助对象: - By
- Key
3.2.1 Builder
用于构建WebDriver对象的构造器
let driver = new webdriver.Builder()
.forBrowser('chrome')
.build()
3.3 自动打开拉勾网并搜索“前端”
let { Builder, By, Key } = require('selenium-webdriver')
(async function start() {
let driver = await new Builder().forBrowser('chrome').build()
try {
// 自动打开百度,并搜索河马程序员
await driver.get('http://www.lagou.com/')
// 找到元素,按回车并执行搜索
await driver.findElement(By.css('#changeCityBox .checkTips .tab.focus')).click()
await driver.findElement(By.id('#search_input')).sendKeys('前端',ENTER)
} finally {
// 退出
// await driver.quit()
}
})()
3.4 获取需要的数据
使用driver,findElement()找到所有DOM元素,根据需求分析页面元素,获取其文本内容即可
3.5 自动翻页
思路如下:
- 定义初始页码
- 获取数据后,获取页码上的总页码定义最大页码
- 开始获取数据时打印当前正在获取的页码数
- 获取完一页数据后,当前页码自增,然后判断是否达到最大页码
- 查找下一页按钮并调用点击API,进行自动翻页
- 范爷后递归调用获取数据的函数
第四章 课程总结
参考官网下robots.txt文件,看是否允许爬相关数据