思科DevNetPython学习日志Python

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

2018-03-27  本文已影响1304人  你好我是森林

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代码。

urllibPython的标准库,包含了从网络请求数据,处理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等语言有了解,可以点击关注我,后续就会收到我所有文章的更新推送。如果该文章对你有所帮助,可以点击喜欢,以后就可以直接在自己的主页查看。如有其他的问题,欢迎交流。

欢迎你免费加入我的星球,一起分享,共同成长。

知识星球
上一篇下一篇

猜你喜欢

热点阅读