User:你好我是森林
Date:2018-03-27
Mark:《Python网络数据采集》
说明
开始本系列的文章时,可能你需要了解一下Python
的基础知识,熟悉Python
的基本编程,了解一些网络知识等。如果不是特别了解,可以看看我的Python
基础系列文章。
Pyhton基础学习
《Python编程从入门到实践》第0天
《Python编程从入门到实践》第1天
《Python编程从入门到实践》第2天
《Python编程从入门到实践》第3天
《Python编程从入门到实践》第4天
《Python编程从入门到实践》第5天
《Python编程从入门到实践》第6天
《Python编程从入门到实践》第7天
《Python编程从入门到实践》第8天
《Python编程从入门到实践》第9天
《Python编程从入门到实践》第10天
《Python编程从入门到实践》第11天
《Python编程从入门到实践》第12天
《Python编程从入门到实践》第13天
创建爬虫
网络链接
网络浏览器是一个非常有用的应用,它创建信息的数据包,发送它们,然后把你获取的数据解释成漂亮的图像、声音、视频和文字。但是,网络浏览器就是代码,而代码是可以分解的,可以分解成许多基本组件,可重写、重用,以及做成我们想要的任何东西。网络浏览器可以让服务器发送一些数据,到那些对接无线(或有线)网络接口的应用上, 但是许多语言也都有实现这些功能的库文件。关于浏览器的相关介绍,可以参考维基关于浏览器的官方介绍。
Python
实现抓取网页。新建文件为urllib_request.py
。
# 查找 Python 的 request 模块(在 urllib 库里面),并导入 urlopen 函数
from urllib.request import urlopen
html = urlopen("http://www.baidu.cn")
print(html.read())
执行:
python urllib_request.py
在进行数据抓取时需要保证能够与该网页的连通性,可以尝试用ping
的方式进行测试。这里我采用的是抓取百度的首页数据。返回的是百度首页的全部HTML
代码。
urllib
是Python
的标准库,包含了从网络请求数据,处理cookie
,甚至改变像请求头和用户代理这些元数据的函数。urlopen
用来打开并读取一个从网络获取的远程对象。urlib
的文档地址。
标准库:不用额外安装的库就可以直接运行。
BeautifulSoup简介
BeautifulSoup
通过定位HTML
标签来格式化和组织复杂的网络信息,用简单易用的Python
对象为我们展现XML
结构信息。
安装BeautifulSoup
BeautifulSoup
并不是标准库,所以需要通过安装后来使用。本人采用Mac
的系统,同时已经安装了pip
,所以直接可以采用pip
来安装即可,不过需要注意版本问题。
Mac
安装BeautifulSoup
方法:
pip install beautifulsoup4
如果没有报错可以验证一下是否安装成功。验证的方式有很多。这里我举例两种最常用的验证方式。
第一种验证方式:终端直接查看包是否存在。
pip freeze | grep beautifulsoup4
如果输出:beautifulsoup4==4.6.0
,表示已经有了,只不过版本可能会不一致,但是模块名是一致的。
第二种验证方式:进入python
界面,然后倒入某一个函数看看是否报错,或者直接写代码执行一下。
➜ 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
结合之前抓取百度首页的代码,现在针对某网站的某文件进行抓取。如下:
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)
运行后就得到了该网页的标题。如下:
➜ day0 python request.py
<h1>An Interesting Title</h1>
这就是根据网页的源码得到了该网页的标题。未来可以通过正则等方式获取。
可靠的网络连接
数据采集的问题在于保证程序与目标网站的服务器一直保持通信,否则的话爬虫就不会继续工作了。这个时候就需要进行网络异常处理。
例如我们上一节的代码中有下面一行代码:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
这里面会出现两个问题,服务器不存在或者这个页面不存在。也就是要么404
,要么500
。
try:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
print(e)
# 返回空值,中断程序,或者执行另一个方案
else:
# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),
# 那么就不需要使用else语句了,这段代码也不会执行
也有可能获取的时候,该html页面就是一个空的,是不是又需要增加判断呢?
if html is None:
print("URL is not found")
else:
# 程序继续
获取到了内容,是不是需要继续判断一下该内容是否为我们所需要的内容呢?所以需要增加一个检查标签是否存在判断。
最后我们的判断是不是看起来代码特别的累赘,我们简单整理一下后,代码如下:
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)
博客原文链接:https://chensenlin.cn/posts/26519/
如果你也对爬虫感兴趣,对Python
等语言有了解,可以点击关注我,后续就会收到我所有文章的更新推送。如果该文章对你有所帮助,可以点击喜欢,以后就可以直接在自己的主页查看。如有其他的问题,欢迎交流。
欢迎你免费加入我的星球,一起分享,共同成长。
知识星球
网友评论
运行会有一段提示虽然不影响最终输出,不过看意思应该是缺少参数"lxml",补充后提示消失。
>>> from urllib.error import HTTPError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named error