网络爬虫的常用技术有哪些?
1、Python的网络请求
本节介绍在python实战项目中实现HTTP网络请求常见的3种方式:urllib、urllib3和requests.
1)urllib 模块
urllib是Python自带模块,该模块中提供了一个urlopen()方法,通过该方法指定URL发送网络请求来获取数据。urllib提供了多个子模块,具体的CRM模块名称与含义如下表所示。
模块名称 | 描述 |
urllib.request | 该模块定义了打开UPL(主要是HTTP)的方法和类,如身份认证、重定向、cookie等 |
urllib.error | 该模块中主要包含异常类,基本的异常类是URLError |
urllib.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) #打印读取内容
上面的示例中,是通过Python开发get请求方式获取百度的网页内容。下面通过使用urllib.request模块的post请求实现获取网页信息的内容,示例如下:
import urllib.parse import urllib.request #将数据使用urlencode编码处理后,再使用encoding设置为utf-8编码 data = bytes(urllib.patse.urlencode({'word'"'hello}),encoding='utf8') #打开指定需要爬取的网页 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和deflate编码。
支持HTTP和SOCKS代理。
100 的测试覆盖率。
通过urllib3模块实现发送网络请求的WEB开发示例代码如下:
impot urllib3 #创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节 http = urllib3.PoolManager() # 对需要爬取的网页发送请求 response = http.request('GET','https://www.baidu.com/') print(response.data) #打印读取内容
post请求实现获取网页信息的内容,关键代码如下:
#对需要爬取的网页发送请求 response = http.request('POST', 'http://httpbin.org/post' ,fields = {'word':'hello'})
3)requests模块
requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该软件自动化测试模块在实现HTTP请求时要比urllib模块简化很多,操作更加人性化。在使用requests模块时需要通过执行pip install requesrsts代码进行该模块的安装。requests 功能特性如下:
Keep-Alive& 连接池。
国际化域名和URL。
带持久Cookie的会话。
浏览器式的SSL认证。
自动内容解码。
基本/摘要式的身份认证。
优雅的key/value Cookie.
自动解压。
Unicode响应体。
HTTP(S)代理支持。
文件分块上传。
流下载。
连接超时。
分块请求。
支持 .netrc。
以GET请求方式为例,打印selenium3自动化多种请求信息的示例代码如下:
import requests #导入模块 response = 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模块不仅提供了以上两种常用的请求方式,还提供以下多种网络请求的方式。代码如下:
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 requests payload = {'key1':'value1','key2':'value2'} #传递的参数 #对需要爬取的网页发送请求 response = requests.get("http://httpbin.org/get",params = payload) print(response.content) #以字节流形式打印网页源码
2、HTKL解析之BeautifulSoup
BeautifulSoup是一个用于从 HTML和XML文件中提取数据的Python库。BeautifulSoup 提供一些简单的函数用来处理导航、搜索、修改分析树等功能。BeautifulSoup 模块中的查找提取功能非常强大,而且非常便捷,它通常可以节省程序员数小时或数天的工作时间。
BeautifulSoup自动将输入文档转换为Unicode编码,软件测试输出文档转换为utf-8 编码。用户不需要考虑编码方式,除非文档没有指定一 个编码方式,这时,BeautifulSoup 就不能自动识别编码方式了。然后,用户仅仅需要说明一下原始编码方式就可以了。
1). BeautifulSoup的安装
BeautifulSoup 3已经停止开发,目前推荐使用的是BeautifulSoup4,不过它已经被移植到bs4当中了, 所以在Zabbix导入时 需要from bs4,然后再导入BeautifulSoup。 安装BeautifulSoup 有以下3种方式:
(1)如果您使用的是最新版本的Debian 或Ubuntu Linux, 则可以使用系统软件包管理器安装BeautifulSoup.安装命令为: apt-get install python-bs4。
(2)BeautifulSoup 4是通过PyPi发布的,可以通过easy_ install 或pip来安装。包名是beautifulsoup 4,它可以兼容Python 2和Python 3。安装命令为: easy_ install beautifulsoup4 或者是pip installbeautifulsoup 4.
(3)如果当前的Beautifulsoup不是您想要的版本,可以通过下载源码的方式进行安装,源码的下 载地址为hpttps://ww w.crummy .com/software/BeautifulSoup/bs4/download/,然后在控制台中打开源码的指定路径,输入命令python setup.py istall即可,如下图所示。
BeautifulSoup 支持Python标准库中包含的HTML解析器,但它也支持许多第三方Python解析器,其中包含lxml解析器,根据不同的操作系统,用户可以使用以下命令之一安装lxml。
apt-get install python-lxml。
easy_install lxml。
pip install lxml。
另个解析器是html5lib,它是一个用于解析 HTML的Python库,按照Web浏览器的方式解析 HTML。用户可以使用以下命令之一安装html5lib。
apt-get install python-html5lib。
easy_install html5lib。
pip install html5lib。
在下表中总结了每个解析器的优缺点。
2). BeautifulSoup的使用
BeautifulSoup安装完成以后,下面将介绍如何通过BeautifulSoup库进行HTML的解析工作,具体示例步骤如下:
(1) 导入bs4库,然后创建个模拟 HTML代码的字符串,代码如下:
from bs4 import BeautifuSoup # 导入BeauifulSoup库 #创建模拟HTML代码的字符串 html_doc="""The Dormouse's story/title> The Dormouse's story
Once upon a time there were three ltle sisters; and their names were Elsie, Lacie and Tillie; and they lved at the bottom of a well.
...
"""
(2) 创建BeauifulSoup对象,并指定解析器为lxml,最后通过打印的方式将解析的HTML代码显示在控制台当中,代码如下:
#创建一个BeautifulSoup对象,获取页面正文 soup = BeautifulSoup(html_doc,features="lxml") print(soup) #打印解析的HTML代码
运行结果 如图所示。
说明: 如果将html_doc字符串中的代码保存在index.html 文件中,可以通过打开HIML文件的方式进行代码的解析,并且可以通过prettify()方法进行代码的格式化处理,代码如下:
#创建BeautifulSoup对象打开需要解析的html文件 soup = BeautifulSoup(open('index.html'),'lxml') print(soup.prettify()) #打印格式化后的代码
¥299.00
¥29.00
¥399.00
¥498.00