爬虫基础知识
爬虫类型
按抓取范围分类
1、全网爬虫:用于抓取整个互联网的数据,主要用于搜索引擎(Google、Baidu)的数据源
2、站内爬虫:与全网爬虫相似,主要用于爬取站内的网络资源。主要用于企业内部搜索引擎的数据源。
3、定向爬虫
按抓取内容和方式分类
1、网页文本爬虫
2、图像爬虫
3、js爬虫
4、一步数据爬虫(json、xml),主要抓取基于AJAX的系统的数据
5、抓取其他数据的爬虫(word、excel、pdf等)
爬虫相关Web基础知识
HTTP请求方法
| 方法 | 描述
——————————————————————————————————————————
|GET |请求指定的网页内容,并返回页面内容
|HEAD |与GET请求相似,只不过返回的响应信息中没有具体的内容,该方法仅用于获取响应头
|POST |请求指定的页面信息,只是提交的数据包含在请求体中,通常用于表单提交或上传文件
|PUT |用客户端向服务器传送的数据取代指定的文档内容
|DELETE |请求服务器删除指定的页面
|CONNECT|将服务器作为跳板,让服务器代替客户端访问指定网页相当于将服务器作为代理使用
|OPTIONS|允许有客户端查看服务器的性能
|TRACE |回显服务器收到的请求,主要用于诊断或者测试
————————————————————————————————————————————————————————————————————————————————————
==请求头:编写请求头是一个重要步骤
1、Accept:请求报头域,用于告诉服务端,客户端可以接收什么类型的信息。
2、Accept-Charset:指定客户端可接受的编码格式
3、Accept-Encoding:指定客户端可接受的内容编码列表
4、Accept-Language:指定客户端可接受的语言列表
5、Content-Length:指定客户端提交的请求体的大小(以字节为单位)
6、Content-Type:请求体的文档类型
7、Cookie:存储在本地的数据,通常以key-value的方式存储
8、Host:服务器的域名和端口号
9、Referer:用来表示这个请求是从哪个页面发过来的,,服务器可以用这一信息做相应的处理
10、User-Agent:用于表示客户端的操作系统和浏览器版本。可以用于模拟浏览器和操作系统,反爬虫经常使用
————————————————————————————————————————————————————————————————————————————————————
Content-Type字段值 提交的数据类型
application/x-www-form-urlencoded 表单
multipart/form-data 上传的文件
application/json JSON格式
text/xml XML格式的数据
————————————————————————————————————————————————————————————————————————————————————
响应码状态 含义
1 信息,服务器受到请求,需要请求者继续执行
2 成功,操作被成功接收并处理
3 重定向,需要进一步的操作以完成请求
4 客户端错误,请求包含语法错误或无法完成请求
5 服务器错误,服务器在处理请求的过程中发生了错误
————————————————————————————————————————————————————————————————————————————————————
常见状态码 说明 详细
100 继续 客户端应继续提出请求,服务器已经收到了一部分,等待剩余部分
200 切换协议 服务器根据客户端的请求切换协议,只能向高协议切换
202 已接受 服务器已接受但未处理完成
204 已创建 请求成功,并且服务器创建了新的资源
301 永久移动 请求的网页已经永久移动到新位置,即永久重定向
404 未找到! 服务器找不到请求的资源
500 服务器内部错误 服务器内部错误,无法完成请求
503 服务不可用 由于超载或系统维护,服务器暂时无法处理客户端的请求
————————————————————————————————————————————————————————————————————————————————————
响应头:主要关注响应体中的数据内容,HTML格式(页面返回)和JSON格式(Web API)的数据
1、Content-Type:表示响应体中的数据属于什么类型。
2、Date:表示产生响应的时间
3、Content-Encoding:指定响应内容的编码
4、Server:包含服务器的信息,如服务器名、版本号等
5、Set-Cookie:设置Cookie。
6、Expires:指定缓存的过期时间
————————————————————————————————————————————————————————————————————————————————————
CSS选择器(很重要!)
选择器 例子 描述
.class .title 选择class="title"的所有节点
#id #b1 选择id="b1"的所有节点
* * 所有节点
element a 选择所有<a>节点
element,element div,a 选择所有<div>节点和所有<a>节点
element>element div>a 选择父节点以<div>之后的所有<a>节点
element+element div+a 选择紧接在<div>节点之后的所有<a>节点
[attribute] [target] 选择带有target属性的所有节点
[attribute=value] [target=_blank] 选择target="_blank"的所有节点
————————————————————————————————————————————————————————————————————————————————————
案例-抓取博客园网站中最新的文章标题和url地址
这里的案例不作为学习要求,读者可以自己尝试,后续继续学习。
from urllib3 import *
from re import *
http = PoolManager()
#禁止显示警告信息
disable_warnings()
#下载url对应的Web页面
def download(url):
result = http.request('GET',url)
#获取Web页面对应的HTML代码
htmlStr = result.data.decode('utf-8')
return htmlStr
#分析HTML代码
def analyse(htmlStr):
#通过正则表达式获取所有class属性为post-item的<a>节点
aList = findall('<a[^>]*post-item[^>]*>[^<]*</a>',htmlStr)
result = []
#提取每一个<a>节点中的URL
for a in aList:
#利用正则表达式提取<a>节点中的URL
g = search('href[\s]*=[\s]*[\'"]([^>\'""]*)[\'"]',a)
#通过查找的方式提取<a>节点的博客标题)[\'"]', a)
if g != None:
url = g.group(1)
index1 = a.find(">")
index2 = a.rfind("<")
#获取博客标题
title = a[index1 + 1:index2]
d = {}
d['url'] = url
d['title'] = title
result.append(d)
#返回一个包含博客标题和URL的对象
return result
#抓取博客列表
def crawler(url):
html = download(url)
blogList = analyse(html)
#输出博客园首页的所有博客的标题和URL
for blog in blogList:
print("title:",blog["title"])
print("url:",blog["url"])
#开始抓取博客列表
crawler('https://www.cnblogs.com')
Pycharm中输出的结果
写在前面:
- 爬虫主要分为两部分:
网络库,是用来地址访问网页的工具。
解析库,是用来解析网页内容的工具。 - 除了上述以外还会提到数据存储,更高级的爬虫知识,更高效更便捷的爬虫框架。