第一章:基础
爬虫的分类:
- 通用网络爬虫: 百度,Google等搜索引擎,从一些初识的URL扩展到整个网站,主要为门户站点搜索引擎和大型网站服务采集数据
- 聚焦网络爬虫: 又称主题网络爬虫,选择性地爬行根据需求的主题相关页面的网络爬虫
- 增量式网络爬虫: 对已下载网页采取增量式更新知识和只爬行新产生或者已经发生变化的网页爬虫
- 深层网络爬虫: 大部分内容不能通过静态的URL获取、隐藏在搜索表单后的、只有用户提交一些关键词才能获得的网络页面
1、HTTP与HTTPS
- HTTP 全称是HyperText Transfer Protocal ,中文意思是超文本传输协议,是一种发布和接收HTML(HyperText Markuup Language)页面的方法。服务器端口号为80端口
- HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer) ,是HTTP协议的加密版本,在HTTP下加入了SSL层,服务器端口号是443
- F12 调出浏览器的控制器
2、URL与URI
- URL(网址)是Uriform Resource Locator的简写,统一资源定位符。一个URL由以下几部分组成:
- 1)协议的类型
- 2)主机名称/域名
- 3)端口号
- 4)查找路径
- 5)查询参数
- 6)锚点,前端用来做面定位的。现在一些前后端分离项目,也用锚点来做导航
- 前端定位
- 锚点导航 动的是#之后的内容 ,根据锚点去请求数据 https://music.163.com/#/friend
- URI:统一资源标识符 Uniform Resource Identifier ,是一个用于标识某一互联网资源名称的字符串
3、常见的请求方式
- get请求:一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响的时候会使用get请求。
- post请求:向服务器发送数据(登录)、上传文件等,会对服务器资源产生影响的时候会使用Post请求。
区别:
- Get是不安全的,因为在传输过程,数据被放在请求的URL中;Post的所有操作对用户来说都是不可见的。
- Get传送的数据量较小,这主要是因为受URL长度限制,不能大于2kb;Post传送的数据量较大,一般被默认为不受限制。
- Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
- Get执行效率却比Post方法好。Get是form提交的默认方法。
4、常见的请求头参数
http协议中,向服务器发送一个请求,数据分为三部分:
- 第一个是把数据放在url中
- 第二个是把数据放在body中(post请求时)
- 第三个就是把数据放在head中
常见的请求头参数:
- user-agent:浏览器名称
- referer:表明当前这个请求是从哪个url过来的
- cookie: http协议是无状态的。也就是同一个人发送了两次请求。服务器没有能力知道这两个请求是否来自同一个人。
5、 常见的响应状态码
- 200: 请求正常,服务器正常的返回数据
- 301:永久重定向。比如访问http://www.360buy.com的时候会重定向到www.jd.com
- 404:请求的url在服务器上找不到,换句话说就是请求的url错误.
- 418:发送请求遇到服务器端反爬虫,服务器拒绝响应数据
- 500:服务器内部错误,可能是服务器出现了bug
6、HTTP请求的交互过程
- (1) 客户端浏览器向网站所在的服务器发送一个请求
- (2) 网站服务器接收到这个请求后进行解析、处理,然后返回响应对应的数据给浏览器
- (3) 浏览器中包含网页的源代码等内容(存在浏览器的缓存中),浏览器再对其进行解析,最终将结果呈现给用户
7、Chrome分析网站
F12 打开开发者界面,F5刷新
- Elements :可以帮助我们分析网页结构,获取我们想要的数据
- Console控制台 :打印输出网站的一些信息,比如说网站的招聘信息
- Sources相当于一个文件夹一样,加载这个网页所需要的所有的源文件,除了Elements的源代码之外,还有一些CSS文件、JS文件等。
- Network :查看整个网页发送的所有网络请求。一般我们想要去查看某个请求的信息,都可以到这里面去看
8、Session与Cookie
- Session
- Session代表服务器与浏览器的一次会话过程。
- Session是一种服务器端的机制,Session对象用来存储特定用户会话所需的信息。
- Session由服务器端生成,保存在服务器的内存、缓存、硬盘或数据库中
- Cookie
- Cookie是由服务端生成后发送给客户端(通常是浏览),Cookie总是保存在客户端
- Cookie的基本原理
- (1)创建Cookie
- (2)设置存储Cookie
- (3)发送Cookie
- (4)读取Cookie
9、JSON
JavaScript ObjectNotation,JS对象标记)是一种轻量级的数据交互格式,采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得JSON成为理想的数据交换语言,易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
- JSON的数据格式:
- (1)对象表示为键值对
- (2)数据由逗号分隔
- (3)花括号保存对象
- (4)方括号保存数组
- 在数据结构上,JSON与Python里的字典非常相似
10、Ajax
Ajax在浏览器与Web服务器之间使用异步数据传输。这样就可以使网页从服务器请求少量的信息,而不是整个页面。
- Ajax技术独立于浏览器和平台。
- Ajax一般返回的是JSON,直接对Ajax地址进行Post或get,就返回JSON数据了
第二章:实操
1、urllib简介
- urllib是Python自带的标准库中用于网络请求的库,无需安装,直接引用即可
- 通常用于爬虫开发、API(应用程序编程接口)数据获取和测试
- urllib库的4大模块:
- urllib.request :用于打开和读取URL
- urllib.error:包含提出的例外(异常)urllib.request
- urllib.parse:用于解析URL
- urllib.robotparser:用于解析robots.txt文件
import urllib.parse
kw = {'wd':'马士兵'}
# 编写
result = urllib.parse.urlencode(kw)
print(result)
# 解码
res = urllib.parse.unquote(result)
print(res)
2、发送请求
- urllib.request库
- 模拟浏览器发起一个HTTP请求,并获取请求响应结果
- urllib.request.urlopen的语法格式
- urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
- 参数说明:
- url:url参数是str类型的地址,也就是要访问的URL, 例如:https://www.baidu.com
- data:默认值为None, urllib判断参数data是否为None从而区分请求方式。或参数data为None,则代表请求方式为Get,反之请求方式为Post,发送Post请求。参数data以字典形式存储数据,并将参数data由字典类型转换成字节类型才能完成Post请求
- urlopen函数返回的结果是一个: http.client.HTTP Response 对象
- 发送请求-Request请求:
- 如果在请求中需要加入headers (请求头)、指定请求方式等信息,那么就可以利用更加大的Request来构建一个请求。 # 添加浏览器信息
- urllib.request.Request(url, data=None, headers={}, method=None)
import urllib.request
url = 'http://www.baidu.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}
# 构建请求对象
req = urllib.request.Request(url,headers=headers)
# 获取opener对象
opener = urllib.request.build_opener()
resp = opener.open(req)
print(resp.read().decode())
3、IP代理
- 为什么需要使用IP代理
- 假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理。
- IP代理的分类:
- 透明代理:目标网站知道你使用了代理并且知道你的源IP地址,这种代理显然不符合我们这里使用代理的初衷
- 匿名代理:匿名程序比较低,也就是网站知道你使用了代理,但是并不知道你的源IP地址
- 高匿代理:这是最保险的方式,目录网站既不知道你使用了代理更不知道你的源IP
- IP代理的方式:
# 免费代理IP :https://www.xicidaili.com/nn/
# 大象代理 :收费: http://www.daxiangdaili.com/
# 快代理:收费: https://www.kuaidaili.com/
4、使用Cookie
- 为什么需要使用Cookie
- 解决http的无状态性
- 使用步骤
- 实例化 MozillaCookieJar (保存cookie)
- 创建 handler对象(cookie的处理器)
- 创建opener对象
- 打开网页(发送请求获取响应)
- 保存cookie文件
5、错误解析
异常处理主要用到两大类:
- urllib.error.URLError :用于捕获由urllib.request产生的异常,使用reason属性返回错误原因
- urllib.error.HTTPError :用于处理HTTP与HTTPS请求的错误,它有三个属性:
- code:请求返回的状态码
- reason:返回错误的原因
- headers:请求返回的响应头信息
# url = 'http://www.google.com'
url = 'http://www.google.cn' # 正确的网址
try:
resp = urllib.request.urlopen(url)
print(resp)
except urllib.error.URLError as e:
print(e.reason)
6、requests库
- 最常用的方法为get()和post()分别用于发送Get请求和Post请求
- 语法结构:
- requests.get(url, params=None)
- 参数说明:
- url:需要爬取的网站的网址
- params:请求参数