Python网络爬虫基本库
1、网络爬虫概述
1.1、什么是网络爬虫
- 网络爬虫(Web Crawler)是一种自动化程序,用于从互联网上采集信息。它通过自动访问网页并提取所需的数据,实现对大量网页的快速检索和数据抓取
- 网络爬虫通常使用HTTP协议来访问网页,并通过解析HTML、XML等网页内容来提取数据。爬虫可以从一个起始点(如某个特定网页)开始,然后根据链接关系自动地遍历和抓取其他相关网页
1.2、网络爬虫的工作原理
- 确定起始点:选择一个或多个起始网页作为爬虫的入口点
- 发送HTTP请求:通过HTTP协议向起始网页发送请求,并获取网页的内容
- 解析网页:解析网页的内容,通常使用HTML解析器或XML解析器来提取所需的数据
- 提取链接:从解析后的网页中提取其他相关网页的链接
- 存储数据:将爬取到的数据存储到数据库、文件或其他存储介质中
- 遍历网页:根据提取到的链接继续遍历和抓取其他相关网页,重复上述步骤
网络爬虫可以根据需要进行配置,例如设置爬取的深度、限制爬取的速度,以及处理反爬机制等
1.3、网络爬虫的分类与应用
-
网络爬虫根据不同的目标和应用可以分为多种类型,如通用爬虫、聚焦爬虫、增量爬虫等
- 通用爬虫是一种广泛应用的爬虫,可以遍历互联网上的大部分网页,并抓取数据进行索引和检索。搜索引擎的爬虫就是一种通用爬虫的例子
- 聚焦爬虫是针对特定领域或特定网站进行抓取的爬虫。它只关注特定的内容,能够更精准地抓取所需的数据
- 增量爬虫是在已有数据的基础上,只抓取新增或更新的数据。它可以根据时间戳或其他标识来判断数据的更新情况,减少重复抓取和处理的工作量
-
网络爬虫在很多领域都有应用,如搜索引擎、数据挖掘、舆情分析、价格比较等
2、urllib库
urllib是Python的标准库之一,用于处理URL相关的操作
urllib库包含四个子模块:
"""
urllib.request:请求模块,用于打开和读取URL
urllib.error:异常处理模块,捕获urllib.error抛出异常
urllib.parse:URL解析,爬虫程序中用于处理URL地址
urllib.robotparser:解析robots.txt文件(一个遵循Robots Exclusion Protocol(机器人排除协议)的文本文件),判断目标站点哪些内容可爬,哪些不可以爬
"""
2.1、urllib.request模块
# 1)发送Get、Post请求
'''
urlopen(url,data,timeout)
'''
import urllib.request
with urllib.request.urlopen('https://www.example.com') as resp:
# getcode() 获取网页状态码
print(resp.getcode())
# read() 获取服务器响应的内容,读取整个网页数据
content = resp.read().decode('utf-8')
print(content)
HTTPResposne响应对象的其它成员:
'''
getheaders():获取请求头内容
getheader(name):获取指定请求头
readline():读取网页一行数据
readlines():读取网页多行数据
status:获取响应状态码
'''
# 2)Request()类 发送指定类型请求
'''
urllib.request.Request(url,data,headers,method)
'''
import urllib.parse
# 转换数据类型为bytes(data参数类型必须为bytes类型)
data = urllib.parse.urlencode({
"key": "value"}).encode()
headers = {
"User-Agent": "Mozilla/5.0"}
req = urllib.request.Request(url='https://www.example.com', data=data, method='POST', headers=headers)
with urllib.request.urlopen(req) as resp:
# getcode() 获取网页状态码
print(resp.status)
# read() 获取服务器响应的内容,读取整个网页数据
content = resp.read().decode('utf-8')
print(content)
2.2、urllib.parse模块
# 解析URL:
'''
urlparse(url,scheme协议类型,allow_fragments=True是否忽略URL中的fragment部分)
'''
# 标准的URL格式:
'''
scheme://netloc/path;params?query#fragment
'''
# 说明:
'''
scheme:URL协议
netloc:域名和端口
path:路径
params:最后一个路径元素参数
query:查询字符串
fragment:片段标志
'''
from urllib.parse import urlparse
url = 'https://www.example.com/path?query=hello#fragment'
parsed_url = urlparse(url)
print(parsed_url.scheme) # https
print(parsed_url.netloc) # www.example.com
print(parsed_url.path) # /path
print(parsed_url.query) # query=hello
print(parsed_url.fragment) # fragment
# 其它方法:
'''
urlunparse():构建URL,与urlparse()方法逻辑相反
urljoin():方法用于拼接链接
urlencode():格式化URL请求参数
quote():编码URL特殊字符,尤其是转换中文字符
unquote():解码URL特殊字符
'''
2.3、urllib.error模块
urllib.error模块提供的异常类:
import urllib.error
'''
error.URLError:OSError的一个子类,用于处理URL相关的错误,如无法连接到服务器、网络问题等
error.HTTPError:URLError的一个子类,用于处理HTTP相关的错误,如页面不存在(404)、权限问题等
'''
异常类对象的属性:
'''
e.code:响应的状态码
e.reason:获取原因字符串
e.headers:获取响应的头部信息
'''
2.4、urllib.robotparser模块
3、requests库
requests是一个常用的第三方库,用于发送HTTP请求和处理响应。它提供了简洁而直观的API,使得发送请求和处理数据变得非常方便
3.1、发送请求:Request
3.1.1、发送请求的方法
'''
1)requests.request(method, url, params, data, headers, cookies)
- method: 请求方式,对应以下各方法
- url: 页面链接
- params: url参数,字典或字节流类型
- data: 请求内容、请求体,字典、字节序列或文件对象类型
- headers: HTTP自定义请求头,字典类型
- cookies: 请求中的cookie,字典类型
- json: 请求内容、请求体,JSON格式的数据
- files: 请求内容、请求体,用于传输文件
- timeout: 设置请求超时时间,单位秒
- allow_redirects: 重定向开关,默认为True
- proxies: 设置访问代理服务器,可以增加登录认证,字典类型
2)requests.get() # 获取HTML网页的主要方法,对应HTTP的GET
3)requests.head() # 获取网页头信息的方法,对应HTTP的HEAD(HTTP 头部本质上是一个传递额外重要信息的键值对)
4)requests.post() # 向HTML网页提交POST请求,对应HTTP的POST
5)requests.put() # 向HTML网页提交PUT请求,对应HTTP的PUT
6)requests.delete() # 向HTML网页提交删除请求,对应HTTP的DELETE
7)requests.patch() # 向HTML网页提交局部修改请求,对应HTTP的PATCH
'''
3.1.2、Get请求
# 1)基本用法
response = requests.get('https://httpbin.org/get')
print(response.text)
# 2)url参数
params = {
"k1": "v1",