网络爬虫常用技术

  • 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笔记】网络爬虫——常用技术相关推荐

  1. python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

    在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集. 在网络爬虫技术应用中,Python 脚本语言的 ...

  2. 爬虫技术python流程图_基于Python的网络爬虫技术研究

    基于 Python 的网络爬虫技术研究 王碧瑶 [摘 要] 摘要:专用型的网络爬虫能够得到想要的返回结果 , 本文就以拉勾网作 为例子 , 对基于 Python 的网络爬虫技术进行研究和分析. [期刊 ...

  3. 基于python的网络爬虫技术_基于python的网络爬虫技术的研究

    龙源期刊网 http://www.qikan.com.cn 基于 python 的网络爬虫技术的研究 作者:刘文辉 李丽

  4. python网络爬虫程序技术_Python网络爬虫程序技术-中国大学mooc-题库零氪

    Python网络爬虫程序技术 - 中国大学mooc 已完结  94 项目1 爬取学生信息 1.2 Flask Web网站随堂测验 1.import flask app=flask.Flask(__n ...

  5. python网络爬虫技术-基于Python的网络爬虫技术综述

    汪洋 姜新通 [摘 要]人类社会已经进入大数据时代,这正在改变着我们的工作和生活.随着互联网的兴起和发展,同时也产生了各种对人类有价值的数据.快速搜索数据和充分利用数据信息已成为一个巨大挑战.这样的需 ...

  6. python网络爬虫的流程图_基于Python的网络爬虫的设计与实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的网络爬虫的设计与实现 作者:高祖彦 来源:<商情> 2020 年第 33 期 [摘要]一个爬虫从网上爬取数 ...

  7. python爬虫教程:Python写网络爬虫的优势和理由

    在本篇文章里小编给各位整理了一篇关于选择Python写网络爬虫的优势和理由以及相关代码实例,有兴趣的朋友们阅读下吧. 什么是网络爬虫? 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页 ...

  8. python网络爬虫课程设计题目_山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》...

    山东建筑大学计算机网络课程设计<基于Python的网络爬虫设计> 山东建筑大学 课 程 设 计 成 果 报 告 题 目: 基于Python的网络爬虫设计 课 程: 计算机网络A 院 (部) ...

  9. python六小时网络爬虫入门_一小时入门 Python 3 网络爬虫

    原标题:一小时入门 Python 3 网络爬虫 作者:Jack-Cui,热爱技术分享,活跃于 CSDN 和知乎,开设的<Python3网络爬虫入门>.<Python3机器学习> ...

最新文章

  1. 从清洁工到斯坦福教授,一路开挂的她近日入选美国国家医学科学院!
  2. 阿里云上git clone公司内网仓库遇到的错误消息 - cannot resolve host
  3. word域变成正常文本_超级干货|最全的PPT、Excel、Word实用宝典,助你办公效率翻倍!...
  4. LwIP应用开发笔记之五:LwIP无操作系统TCP服务器
  5. tomcat默认限制post请求参数大小
  6. 山石网科发布山石云·景产品 安全运维管理进入SaaS模式
  7. Windows | 常用软件
  8. P2P网络NAT穿透原理(打洞方案)
  9. mysql front不能上到_mysqlfront不能上到Mysql服务器连接quot;192.168.5.*_MySQL
  10. java基础之枚举类
  11. HTML5 通过Vedio标签实现视频循环播放
  12. php经典实例博客管理,PHP经典项目案例-(一)博客管理系统2
  13. 【LeetCode】第289场单周赛 --- 用中等题来骗来偷袭我这个老同志?
  14. 关于连接同一wifi,手机可以上网,电脑无法上网问题
  15. 更精确的新旧中国居民身份证号码验证算法
  16. 黑盘-蓝盘-绿盘-红盘
  17. 高德地图-缩放比例尺控件
  18. Unity游戏开发客户端面经——Unity(初级)
  19. 逆势获融资背后,神州租车示范不确定性应对策略
  20. MFC之位图加载10

热门文章

  1. 十年后,若中国基建基本完成了,还有什么能大规模拉动经济?
  2. SQL数据库引擎服务SQL Server启动参数概述
  3. easyUI+servlet+mysql项目总结
  4. gitlab 本地 定时备份
  5. 无锁atomicInteger
  6. web页面实时刷新之browser sync
  7. scala.list
  8. iOS自动布局之autoresizingi
  9. java.net.SocketException: Software caused connection abort: socket write error
  10. 在 Windows Server 2008 R2 下用 Visual Studio 2010 编译 Chrome 与 WebKit Chromium Port