【Python笔记】网络爬虫——常用技术
网络爬虫常用技术
- Python 的网络请求
- 1.urllib 模块
- 2.urllib3 模块
- 3.requests 模块
- 请求 headers 处理
- 网络超时
- 代理服务
- HTML解析之 BeautifulSoup
- 1.BeautifulSoup 的安装
- 2.BeautifulSoup 的使用
Python 的网络请求
上一节中多次提到了 URL 地址与下载网页,这两项是网络爬虫必备而又关键的功能,说道这两个功能必然离不开与 HTTP 打交道。本小节将介绍在 Python 中实现 HTTP 网络请求常见的三种方式:
1.urllib 模块
urllib 是 Python 自带模块,urllib 提供了多个子模块,具体的模块名称与含义如下表:
模块名称 | 描述 |
---|---|
urlopen() | 指定 URL 发送网络请求来获取数据 |
urllib.request | 该模块定义了打开 URL(主要是HTTP)的方法和类,例如,身份验证,重定向,cookie 等等 |
urllib.error | 该模块中主要包含异常类,基本的异常类时 URLError |
urllibd.parse | 该模块定义的功能分为两大类:URL 解析 和 URL 引用 |
urllib.robotparser | 该模块用于解析 robots.txt 文件 |
通过 urllib.request 模块实现发送请求并读取网页内容的简单实例如下:
import urllib.request# 打开指定需要爬取的页面
response = urllib.request.urlopen('http://www.baidu.com')
html = response.read() # 读取网页代码
print(html) # 打印读取内容
上面的实例中,通过 get 请求方式获取百度的网页内容。
下面通过 urllib.request 模块的 post 请求实现获取网页信息的内容,如下:
import urllib.parse
import urllib.request# 将数据使用 urlencode 编码处理后,再使用 encoding 设置为 utf-8 编码
data = bytes(urllib.parse.urlencode({'word':'hello'}), encoding="utf-8")
# 打开指定需要爬取的网页
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
html = response.read() # 读取网页代码
print(html)
2.urllib3 模块
urllib3 是一个功能强大、条理清晰、用于 HTTP 客户端的 Python 库,许多 Python 的原生系统已经开始使用 urllib3。urllib3 提供了很多 python 标准库里所没有的重要特性:
- 线程安全
- 连接池
- 客户端 SSL/TLS 验证
- 使用多部分编码上传文件
- Helpers 用于重试请求并处理 HTTP 重定向
- 支持 gzip 和 default 编码
- 支持 HTTP 和 SOCKS 代理
- 100% 的测试覆盖率
通过 urllib3 模块实现发送网络请求的示例代码如下:
import urllib3
# 创建 PoolManager 对象,用于处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()
# 对需要爬取网页发送请求
response = http.request('GET','https://www.baidu.com/')
print(response.data) # 打印读取内容
post 请求实现获取网页信息的内容,代码如下:
import urllib3
# 创建 PoolManager 对象,用于处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()
# 对需要爬取网页发送请求
response = http.request('POST', 'https://httpbin.org/post', fields={'word':'hello'})
print(response.data) # 打印读取内容
3.requests 模块
requests 是 Python 中实现 HTTP 请求的一种方式,requests 是第三方模块,该模块在实现 HTTP 请求时要比 urllib 模块简化很多,操作更加人性化。在使用 requests 模块时需要通过执行 pi install requests 代码进行该模块的安装。requests 功能特性如下:
- Keep-Alive & 连接池
- 国际化域名 和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 Key/Value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc
以 GET 请求方式为例,打印多种请求信息的代码如下:
import requestsresponse = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
print(response.url) # 打印请求 Url
print(response.headers) # 打印头部信息
print(response.cookies) # 打印 cookie 信息
print(response.text) # 以文本形式打印网页源码
print(response.content) # 以字节流形式打印网页源码
以 POST 请求方式,发送 HTTP 网络请求的代码如下:
import requests
data = {'word':'hello'} # 表单参数
# 对需要爬取的网页发送请求
response = requests.post('http://httpbin.org/post',data= data)
print(response.content)
requests 模块不仅提供了以上两种常用的请求方式,还提供了以下多种网络请求的方式:
import requests
requests.put('http://httpbin.org/put',data = {'key':'value'}) # PUT 请求
requests.delete('http://httpbin.org/delete') # DELETE请求
requests.head('http://httpbin.org/get') # HEAD请求
requests.options('http://httpbin.org/get') # OPTIONS请求
如果发现请求的 URL 地址中参数是跟在?(问号)的后面,例如, httpbin.org/get?key=val。 Requests 模块提供了传递参数的方法,允许使用 params 关键字参数,以一个字符串字典来提供这些参数。例如,想传递“key1=value1” 和 “key2= value2” 到 “httpbin.org/get”,那么可以使用如下代码:
import requestspayload = {'key1':'value1','key2':'value2'} # 传递的参数
# 对需要爬取的网页发送请求
response = requests.get('http://httpbin.org/get', params=payload)
print(response.content)
请求 headers 处理
有时在请求一个网页内容时,发现无论通过 GET 或者是 POST 以及其他请求方式,都会出现 403 错误。这种现象多数是由于服务器拒绝了您的访问,那是因为这些网页为了防止恶意采集信息,所使用的的反爬虫设置。此时可以通过模拟浏览器的头部信息来进行访问,这样就能解决以上反爬设置的问题。下面以 requests 模块为例介绍请求头部 headers 的处理,具体步骤如下:
打开网络监视器,刷新当前页面,选中一条信息,查看它的请求头信息,然后复制其中的 User-Agent
实现代码,首先创建一个需要爬取的 url 地址,然后创建 headers 头部信息,再发送请求等待响应,最后打印网页的代码信息。代码如下:
import requests
url = 'https://www.baidu.com/'
# 创建头部信息,根据当前浏览器版本进行复制即可
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
response = requests.get(url, headers=headers) # 发送网络请求
print(response.content)
网络超时
在访问一个网页时,如果该网页长时间未响应,系统就会判断该网页超时,所以无法打开网页。下面通过代码来模拟一个网络超时的现象,代码如下:
for a in range(1,50):try:# 设置超时为0.5秒response = requests.get('https://www.baidu.com/', timeout=0.04)print(response.status_code) # 打印状态码except Exception as e: # 捕获异常print("异常" + str(e)) # 打印异常信息
上面的代码中,模拟进行了 50 次循环请求,并且设置了超时的时间为 0.04秒,所以在 0.04 秒内服务器未走出响应将视为超时,所以将超时信息打印在控制台中。根据以上的模拟此时结果,可以确认在不同的情况下设置不同的 timeout 值。
requests 模块同样提供了三种常见的网络异常类,示例如下:
import requests
# 导入 requests.eceptions 模块中的三种异常类
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 循环发送请求 50 次
for a in range(1,50):try:# 设置超时为 0.5 秒response = requests.get('http://www.baidu.com/', timeout=0.03)print(response.status_code) # 打印状态码except ReadTimeout: # 超时异常print('timeout')except HTTPError: # HTTP异常print('httperror')except RequestException: # 请求异常print('reqerror')
代理服务
在爬取网页的过程中,经常会出现不久以前可以爬取的网页现在无法爬取了,这是因为 IP 被爬取网站的服务器屏蔽了。此时代理服务可以解决这,设置代理时,首先需要找到代理地址,例如,“122.114.31.177”,对应的端口号为“808”,完整的格式为“122.114.31.177:808”。示例如下:
import requests
proxy = {'http':'122.114.31.177:808','https':'122.114.31.177:808'} # 设置代理IP与对应的 端口号
# 对需要爬取的网页发送请求
response = requests.get('http://www.mingrisoft.com/',proxies=proxy)
print(requests.content) # 以字节流形式打印网页源码
HTML解析之 BeautifulSoup
BeautifulSoup 是一个用于从 HTML 和 XML 文件中提取数据的 Python 库。BeautifulSoup 提供了一些简单的函数用来处理导航、搜索、修改分析树等功能。BeautifulSoup 模块中的查找提取功能非常强大和便捷,可以节省大量工作时间。
BeautifulSoup 自动将输入文档转换为 Unicode 编码,输出文档转换为 UTF-8 编码。不需要考虑编码方式,除非文档没有指定一个编码方式,这样 BeautifulSoup 就不能自动识别编码方式了,此时,你需要说明一下原始编码方式。
1.BeautifulSoup 的安装
BeautifulSoup3 已经停止开发,目前推荐使用的是 BeautifulSoup 4,不过它已经被移植到 bs4 当中,所以需要这样导入:
from bs4 import BeautifulSoup
cmd 下通过以下命令安装 BeautifulSoup:
pip install beautifulsoup4
注:在使用 BeautifulSoup4 之前需要先通过命令 “pip install bs4” 安装 bs4 库
BeautifulSoup 支持 Python 标准库中包含的 HTML 解析器,但它也支持许多第三方 Python 解析器,其中包含 lxml 解析器。
cmd 通过以下命令安装 lxml:
pip install lxml
另一个解析器是 html5lib,它是一个用于解析 HTML 的 Python 库,按照 Web 浏览器的方式解析 HTML。
cmd 通过以下命令安装 lxml:
pip install html5lib
下表总结了每个解析器的优缺点:
解析器 | 用法 | 优点 | 缺点 |
---|---|---|---|
Python 标准库 | BeautifulSoup(markup,“html.parser”) | Python库执行速度适中 | 文档容错能力差(2.7 或 3.2.2之前版本) |
lxml 的 HTML 解析器 | BeautifulSoup(markup,“lxml”) |
速度快 文档容错能力强 |
需要安装C语言库 |
lxml 的 XML 解析器 |
BeautifulSoup(markup,“lxml-xml”) BeautifulSoup(markup,“xml”) |
速度快 唯一支持 XML 的解析器 |
需要安装C语言库 |
html5lib | BeautifulSoup(markup,“html5lib”) |
最好的容错性 以浏览器的方式解析文档 生成 HTML5 格式的文档 |
速度慢 不依赖外部拓展 |
2.BeautifulSoup 的使用
BeautifulSoup 安装完成以后,下面的示例介绍通过 BeautifulSoup 库进行 HTML 的解析工作:
(1)创建一个模拟 HTML 代码的字符串
(2)创建 BeautifulSoup 对象,并指定解析器为 lxml,最后打印解析的 HTML 代码。
# 创建模拟 HTML 代码的字符串
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their name were
<a href="http://example.com/elisie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>and they lived at the bottom of a well.</p><p class="story">...</p>
"""
# 创建一个 BeautfiluSoup 对象,获取页面正文
soup = BeautifulSoup(html_doc,features="lxml")
print(soup) # 打印解析的 HTML 代码
运行结果:显示了解析后的 HTML 代码
如果将 html_doc 字符串中的代码,保存在 index.html 文件中,可以通过打开 HTML 文件的方式进行代码的解析,并且通过 prettify() 方法进行代码的格式化处理,代码如下:
# 创建 BeautifulSoup 对象打开需要解析的 html 文件
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html'),'lxml')
print(soup.prettify())
【Python笔记】网络爬虫——常用技术相关推荐
- python网络爬虫_python小知识,基于Python 的网络爬虫技术分析
在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集. 在网络爬虫技术应用中,Python 脚本语言的 ...
- 爬虫技术python流程图_基于Python的网络爬虫技术研究
基于 Python 的网络爬虫技术研究 王碧瑶 [摘 要] 摘要:专用型的网络爬虫能够得到想要的返回结果 , 本文就以拉勾网作 为例子 , 对基于 Python 的网络爬虫技术进行研究和分析. [期刊 ...
- 基于python的网络爬虫技术_基于python的网络爬虫技术的研究
龙源期刊网 http://www.qikan.com.cn 基于 python 的网络爬虫技术的研究 作者:刘文辉 李丽
- python网络爬虫程序技术_Python网络爬虫程序技术-中国大学mooc-题库零氪
Python网络爬虫程序技术 - 中国大学mooc 已完结 94 项目1 爬取学生信息 1.2 Flask Web网站随堂测验 1.import flask app=flask.Flask(__n ...
- python网络爬虫技术-基于Python的网络爬虫技术综述
汪洋 姜新通 [摘 要]人类社会已经进入大数据时代,这正在改变着我们的工作和生活.随着互联网的兴起和发展,同时也产生了各种对人类有价值的数据.快速搜索数据和充分利用数据信息已成为一个巨大挑战.这样的需 ...
- python网络爬虫的流程图_基于Python的网络爬虫的设计与实现
龙源期刊网 http://www.qikan.com.cn 基于 Python 的网络爬虫的设计与实现 作者:高祖彦 来源:<商情> 2020 年第 33 期 [摘要]一个爬虫从网上爬取数 ...
- python爬虫教程:Python写网络爬虫的优势和理由
在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧. 什么是网络爬虫? 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页 ...
- python网络爬虫课程设计题目_山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》...
山东建筑大学计算机网络课程设计<基于Python的网络爬虫设计> 山东建筑大学 课 程 设 计 成 果 报 告 题 目: 基于Python的网络爬虫设计 课 程: 计算机网络A 院 (部) ...
- python六小时网络爬虫入门_一小时入门 Python 3 网络爬虫
原标题:一小时入门 Python 3 网络爬虫 作者:Jack-Cui,热爱技术分享,活跃于 CSDN 和知乎,开设的<Python3网络爬虫入门>.<Python3机器学习> ...
最新文章
- 从清洁工到斯坦福教授,一路开挂的她近日入选美国国家医学科学院!
- 阿里云上git clone公司内网仓库遇到的错误消息 - cannot resolve host
- word域变成正常文本_超级干货|最全的PPT、Excel、Word实用宝典,助你办公效率翻倍!...
- LwIP应用开发笔记之五:LwIP无操作系统TCP服务器
- tomcat默认限制post请求参数大小
- 山石网科发布山石云·景产品 安全运维管理进入SaaS模式
- Windows | 常用软件
- P2P网络NAT穿透原理(打洞方案)
- mysql front不能上到_mysqlfront不能上到Mysql服务器连接quot;192.168.5.*_MySQL
- java基础之枚举类
- HTML5 通过Vedio标签实现视频循环播放
- php经典实例博客管理,PHP经典项目案例-(一)博客管理系统2
- 【LeetCode】第289场单周赛 --- 用中等题来骗来偷袭我这个老同志?
- 关于连接同一wifi,手机可以上网,电脑无法上网问题
- 更精确的新旧中国居民身份证号码验证算法
- 黑盘-蓝盘-绿盘-红盘
- 高德地图-缩放比例尺控件
- Unity游戏开发客户端面经——Unity(初级)
- 逆势获融资背后,神州租车示范不确定性应对策略
- MFC之位图加载10
热门文章
- 十年后,若中国基建基本完成了,还有什么能大规模拉动经济?
- SQL数据库引擎服务SQL Server启动参数概述
- easyUI+servlet+mysql项目总结
- gitlab 本地 定时备份
- 无锁atomicInteger
- web页面实时刷新之browser sync
- scala.list
- iOS自动布局之autoresizingi
- java.net.SocketException: Software caused connection abort: socket write error
- 在 Windows Server 2008 R2 下用 Visual Studio 2010 编译 Chrome 与 WebKit Chromium Port