爬虫三大库简介

  • A+
所属分类:python

爬虫三大库简介

Requests库

Requests库官方文档链接:http://docs.python-requests.org/zh_CN/latest/

Requests: 让 HTTP 服务人类。

Requests库的作用就是请求网站获取网页数据。

简单的使用示例:

#简单的请求https://ruby-china.org/wiki数据,并打印结果
import requests
res = requests.get('https://ruby-china.org/wiki')
print(res)
#pycharm中返回结果未<Response [200]>,说明请求网址成功,若为404,400则请求网址失败
print(res.text)

部分结果如下图:
爬虫三大库简介

打开浏览器,进入https://ruby-china.org/wiki,在空白处右键,在如下所示的弹出菜单中,选择"查看网页源码"选项。
爬虫三大库简介
我们在新弹出的页面中看到,先前代码print(res.text)返回的结果就是网页的源代码。
爬虫三大库简介

有时候爬虫程序为了更好地抓取数据,需要加入请求头来伪装成浏览器。
在浏览器器中,我们打开开发者工具(一般快捷键是F12),并刷新网页后找到User-Agent进行复制。如下图所示。
爬虫三大库简介

user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.112 Safari/537.36 Vivaldi/1.91.867.48
请求头的使用
# 请求头使用示例
import requests
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
    Chrome/59.0.3071.112 Safari/537.36 Vivaldi/1.91.867.48'
}
res = requests.get('https://ruby-china.org/wiki', headers=headers)
print(res)
print(res.text)

Requests库不仅有get()方法,还有post()等方法。post()方法用于提交表单来进行爬取需要登陆才能获得数据的网站数据。

错误和异常

在使用Requests库请求时,可能并不会很顺利,有时候我们可能会遇到一些情况,这时Requests库会抛出错误或者异常,Requests库的错误和异常主要有以下4种。

  • Requests抛出一个ConnectionError异常,原因为网络问题(如DNS查询失败、拒绝连接等)。
  • Response.raise_for_status()抛出一个HTTPError异常,原因未HTTP请求返回了不成功的状态码。
  • Requests抛出一个TimeOut异常,原因为请求超时。
  • Requests抛出一个TooManyRedirects异常,原因为请求超过了设定的最大重定向次数。

所有的Requests显示抛出的异常都继承自requests.exceptions.RequestException,我们可以通过异常捕获try来避免异常发生导致需要重新运行爬虫程序重头开始爬取数据。

try方法使用示例:

#try异常捕获示例
import requests
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
    Chrome/59.0.3071.112 Safari/537.36 Vivaldi/1.91.867.48'
}
res = requests.get('https://ruby-china.org/wiki', headers=headers)
print(res)
try:
    print(res.text)
except ConnectionError: #出现错误会执行下面的打印
    print("拒绝连接")

BeautifulSoup库

BeautifulSoup库是一个非常流行的Python模块。通过BeautifulSoup库可以轻松地解析Requests库请求的网页,并把网页源代码解析为Soup文档,以便数据的提取。

BeautifulSoup库示例

BeautifulSoup简单使用示例:

# BeautifulSoup简单使用示例
import requests
from bs4 import BeautifulSoup
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
    Chrome/59.0.3071.112 Safari/537.36 Vivaldi/1.91.867.48'
}
res = requests.get('https://ruby-china.org/wiki', headers=headers)
print(res)
soup = BeautifulSoup(res.text, 'html.parser') #对返回的结果进行解析
print(soup.prettify())

运行结果如下图所示,看上去与Requests库请求返回的网页源代码类似,但通过BeautifulSoup库解析得到的Soup文档按照标准缩进格式的结构输出,为结构化的数据,为数据的过滤提取提供了方便。
爬虫三大库简介

解析器

BeautifulSoup库除了支持Python标准库中的HTML解析器外,还支持一些第三方的解析器。

解析器 使用方法 优点 缺点
Python标准库 BeautifulSoup(markup,"html.parser") Ptyhon的内置标准库执行速度适中,文档容错能力强 Python2.7.3 or Python3.2.2前的版本中文档容错能力差
lxml HTML解析器 BeautifulSoup(markup,"lxml") 速度快
文档容错能力强
需要安装C语言库
Lxml XML解析器 BeautifulSoup(markup,["lxml","xml"])
BeautifulSoup(markup,"xml")
速度快
唯一支持XML的解析器
需要安装C语言库
htm5lib BeautifulSoup(makup,"html5lib") 最好的容错性
以浏览器的方式解析文档
生成HTML5格式的文档
速度慢
不依赖外部扩展


PS:BeautifulSoup库官方推荐使用lxml作为解析器,因为效率高。

Soup文档元素定位

解析得到的Soup文档可以使用find()和find_all()方法以及selector()方法定位需要的元素。find()和find_all()方法用法相似,BeautifulSoup文档中对这两个方法的定义是:

# 定义
find_all(tag, attibutes, recursive, text, limit, keywords)
find(tag, attibutes, recursive, text, keywords)
1.find_all()方法
soup.find_all('div', "item") # 查找div标签,class="item"
soup.find_all('div', class='item')
soup.find_all('div', attrs={"class":"item"}) # attrs参数定义一个字典参数表搜索包含特殊属性的tag
2.find()方法

find()方法与find_all()方法类似,只是find_all()方法返回的是文档中符合条件的所有tag,是一个集合(class 'bs4.element.ResultSet'),find()方法返回的是一个Tag(class 'bs4.element.Tag')。

3.selector()方法
soup.selector('div.item > a > h1') # 括号内容通过浏览器复制得到

(1) 鼠标定位到想要提取的数据位置,右击,在弹出的快捷菜单中选择“检查”命令。
(2) 在网页源代码中右击所选元素。
(3) 在弹出的快捷菜单中选择Copy selector。便可得到需要传递给soup.selector的参数。
爬虫三大库简介


PS: li:nth-child(1)在Python中运行会报错,需改为li:nth-of-type(1)。

Lxml库

Lxml库是基于libxml2这一个XML解析库的Python封装。该模块使用C语言编写,解析速度比BeautifulSoup库更快。

百分购

发表评论

您必须才能发表评论!