0%

廖雪峰商业爬虫笔记

爬虫的分类

通用爬虫

定义:又称全网爬虫,爬行对象从种子URL扩充到整个WEB,主要为搜索引擎和大型web服务提供商采集数据,一般用于搜索引擎系统的数据采集模块。

优势:开放性 速度快

缺点:目标不明确 返回内容包含大量用户不需要的东西

聚焦爬虫

定义:又称主题网络爬虫,是指选择性的爬取那些预定好的主题相关页面的爬虫。

优势:目标明确 对用户的需要明确 返回内容固定

爬虫robots协议

定义

robots协议是一种用于限制爬虫爬取路径的一个规则文件,用于告知搜索引擎哪些网页可以被抓取,哪些页面不能被抓取。一般存放在网站根目录下,以robots.txt命名。

值得注意的是:聚焦爬虫不遵守robots

文件写法

1
2
3
4
5
User-agent: 爬虫身份,如google网页搜索爬虫为Googlebot。*代表所有爬虫
Disallow: 列出要拦截的网页,以/开头
Allow: 允许被抓取的网页,以/开头。
Sitemap: 站点地图,用于告知搜索引擎本网站上有哪些可供抓取的网页。
Crawl-delay: 值为一个数字,用于设置两次抓取之间的秒数。

示例:

1
2
3
4
5
User-agent: *
Disallow: /admin/ 表示禁止爬取admin目录下的目录
Disallow: /admin 表示禁止爬取admin这个目录,及其子目录
Disallow: /.jpg$ 表示禁止爬取网页所有的.jpg格式文件
Disallow: /seo/*.html 表示禁止爬取seo目录下的html后缀网页

使用

爬取流程

一个简单的爬取baidu.com的示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import urllib.request

def sp_baidu():
# 确定抓取的网站URL
url="https://baidu.com"
# 通过urllib库模拟发送URL请求,获取响应信息
response=urllib.request.urlopen(url);
# 读取响应信息
result=response.read().decode("utf-8")
# 持久化
with open("baidu.html","w",encoding="utf-8") as fp:
fp.write(result)

sp_baidu()

运行后的html文件打开如下:
运行结果

HTTP请求

七个步骤

"http请求流程"

  1. 建立TCP连接 即三次握手
  2. 浏览器发送请求(Request)
  3. 浏览器发送请求头(request header)
  4. 服务器发送响应(Response)
  5. 服务器发送响应头(response header)
  6. 服务器发送数据
  7. 服务器关闭连接 即四次挥手

请求头

请求头描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度,refer,等等。refer干嘛的,一般用来做简单的防跨站攻击。
一些常用的参数及含义如下:

参数 示例 解释
Accept text/plain, text/html,application/json 客户端能够接收的内容类型
Cookie - 一般是用户标识
User-Agent Mozilla/5.0 (Linux; X11) 发送请求的用户浏览器信息
Accept-Charset iso-8859-5 ;utf-8 可以接受的字符编码集
Accept-Language en,zh 可接受的语言

响应头

响应头用来描述服务器回给你对所返回的content的一些一些描述,我是什么服务器,我返回的是啥编码,我返回的内容有多长等等。
一些常用的参数及含义如下:

参数 示例 解释
Content-Type text/html; charset=utf-8 返回内容的MIME类型
Date Mon, 03 May 2021 02:11:53 GMT 日期

爬虫设置请求头

以urllib.request库为例

1
2
3
4
5
6
7
8
9
10
11
12
13
import urllib.request
def load_baidu():
url="http://www.baidu.com"
#这里以字典的形式设置请求头信息
header={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
}
#创建请求对象,在此设置请求头
request=urllib.request.Request(url,headers=header)
# 请求网络数据(不在此处增加请求头信息,因为此方法系统没有提供参数)
response=urllib.request.urlopen(request)

load_baidu()

IP代理

IP分类
透明:对方知道我们的真实IP
匿名:对方不知道我们的真实IP,只知道我们用了代理
高匿:对方即不知道我们的真实IP,也不知道我们用了代理

关于Python爬虫设置IP池代理可以查看我的这篇博客

数据解析

通过Python爬虫获取到页面信息后,我们需要将数据进行解析,获取到其中我们需要的信息。通常有以下几种方式:

正则表达式

正则表达式是用来解析字符串的一个工具,应用广泛。在JS、Java、Python中都可以看见它的身影。

Xpath

Xpath是一门在XML或HTML文档中查找信息的语言。使用Xpath一般需要先把内容转换成XML格式的文档。其获取到的结果为列表。一般流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from lxml import etree
#定义一个HTML文档
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
</ul>
</div>
'''
# 利用etree.HTML将字符串转化为HTML文档
html=etree.HTML(text)
# 获取所有li标签中<a></a>里的内容
result=html.xpath("//li/a/text()")

print(result)

运行结果如下:

1
['first item', 'second item', 'third item', 'fourth item', 'fifth item']

此处只简单介绍一下Xpath,更多用法还得参见其他博客。

BeautifulSoup4

Beautiful Soup 是一个可以从DOM文件(HTML或XML)中提取数据的Python库,和Xpath的作用类似,有官方中文文档
关于BeautifulSoup4的介绍可以看我的这篇博客

-------------------本文结束 感谢阅读-------------------