Python网络数据采集之创建爬虫|第00天

主要内容:

网络相关知识;

BeautifulSoup介绍和使用。

说明

开始本系列的文章时,可能你需要了解一下Python的基础知识,熟悉Python的基本编程,了解一些网络知识等。如果不是特别了解,可以看看我的Python基础系列文章。

创建爬虫

网络链接

网络浏览器是一个非常有用的应用,它创建信息的数据包,发送它们,然后把你获取的数据解释成漂亮的图像、声音、视频和文字。但是,网络浏览器就是代码,而代码是可以分解的,可以分解成许多基本组件,可重写、重用,以及做成我们想要的任何东西。网络浏览器可以让服务器发送一些数据,到那些对接无线(或有线)网络接口的应用上, 但是许多语言也都有实现这些功能的库文件。关于浏览器的相关介绍,可以参考维基关于浏览器的官方介绍。

Python实现抓取网页。新建文件为urllib_request.py

1
2
3
4
# 查找 Python 的 request 模块(在 urllib 库里面),并导入 urlopen 函数
from urllib.request import urlopen
html = urlopen("http://www.baidu.cn")
print(html.read())

执行:

1
python urllib_request.py

在进行数据抓取时需要保证能够与该网页的连通性,可以尝试用ping的方式进行测试。这里我采用的是抓取百度的首页数据。返回的是百度首页的全部HTML代码。

urllibPython的标准库,包含了从网络请求数据,处理cookie,甚至改变像请求头和用户代理这些元数据的函数。urlopen用来打开并读取一个从网络获取的远程对象。urlib文档地址

标准库:不用额外安装的库就可以直接运行。

BeautifulSoup简介

BeautifulSoup通过定位HTML标签来格式化和组织复杂的网络信息,用简单易用的Python对象为我们展现XML结构信息。

安装BeautifulSoup

BeautifulSoup并不是标准库,所以需要通过安装后来使用。本人采用Mac的系统,同时已经安装了pip,所以直接可以采用pip来安装即可,不过需要注意版本问题。

Mac安装BeautifulSoup方法:

1
pip install beautifulsoup4

如果没有报错可以验证一下是否安装成功。验证的方式有很多。这里我举例两种最常用的验证方式。

第一种验证方式:终端直接查看包是否存在。

1
pip freeze | grep beautifulsoup4

如果输出:beautifulsoup4==4.6.0,表示已经有了,只不过版本可能会不一致,但是模块名是一致的。

第二种验证方式:进入python界面,然后倒入某一个函数看看是否报错,或者直接写代码执行一下。

1
2
3
4
5
6
➜  day0 python
Python 3.6.4 (default, Mar 1 2018, 18:36:50)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>> exit();

综上所述,两种验证方式都通过了,说明现在已经安装完成且可以使用了。

这里的安装是全局安装,如果在实际开发中不同的项目可能会有不同的环境或者版本要求,甚至会产生冲突,现在就就需要的能够支持多种的环境的需求,可以用虚拟环境保存库文件。安装一个Python虚拟环境来分而治之。具体的使用方法这里不做过多阐述,后续会有对应的更新,你可以关注我就可以收到更新提示。

运行BeautifulSoup

结合之前抓取百度首页的代码,现在针对某网站的某文件进行抓取。如下:

1
2
3
4
5
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read(),'lxml')
print(bsObj.h1)

运行后就得到了该网页的标题。如下:

1
2
➜  day0 python request.py
<h1>An Interesting Title</h1>

这就是根据网页的源码得到了该网页的标题。未来可以通过正则等方式获取。

可靠的网络连接

数据采集的问题在于保证程序与目标网站的服务器一直保持通信,否则的话爬虫就不会继续工作了。这个时候就需要进行网络异常处理。

例如我们上一节的代码中有下面一行代码:

1
html = urlopen("http://www.pythonscraping.com/pages/page1.html")

这里面会出现两个问题,服务器不存在或者这个页面不存在。也就是要么404,要么500

1
2
3
4
5
6
7
8
try:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
print(e)
# 返回空值,中断程序,或者执行另一个方案
else:
# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),
# 那么就不需要使用else语句了,这段代码也不会执行

也有可能获取的时候,该html页面就是一个空的,是不是又需要增加判断呢?

1
2
3
4
if html is None:
print("URL is not found")
else:
# 程序继续

获取到了内容,是不是需要继续判断一下该内容是否为我们所需要的内容呢?所以需要增加一个检查标签是否存在判断。

最后我们的判断是不是看起来代码特别的累赘,我们简单整理一下后,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
try:
html = urlopen(url)
except HTTPError as e:
return None
try:
bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1
except AttributeError as e:
return None
return title

title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
print("Title could not be found")
else:
print(title)
一分支持,也是鼓励!
0%