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

User:你好我是森林 Date:2018-03-27 Mark:《Python网络数据采集》 原文:https://chensenlin.cn/posts/26519/

说明

开始本系列的文章时,可能你需要了解一下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)

如果你也对爬虫感兴趣,对Python等语言有了解,可以点击关注我,后续就会收到我所有文章的更新推送。如果该文章对你有所帮助,可以点击喜欢,以后就可以直接在自己的主页查看。如有其他的问题,欢迎交流。

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

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python专栏

Python | 利用Python实现微博监控小姐姐动态

作者:奶权 来源:http://www.jianshu.com/p/9e7ba0a0a610

35620
来自专栏码神联盟

碎片化 | 第一阶段-06-第一个小程序-视频

如清晰度低,可转PC网页观看高清版本: 第一个java程序Hello word 暂时我们先使用记事本来编写代码,不建议直接使用开发工具eclipse,那都自动生...

38180
来自专栏张戈的专栏

WordPress发布文章同步到新浪微博失败的问题解决与分享

张戈博客很久之前分享过一篇 WordPress 发布文章同步到新浪微博 的文章,但经常有站长留言反馈同步失败,我一直觉得是代码部署问题。 最近很长一段时间,张戈...

38070
来自专栏一名叫大蕉的程序员

分布式文件系统.get(V2)No.106

2018年9月28号,我估计会记得很久这一天,因为那天刚刚好是我来西厂的一周年,那天刚刚好是农历生日,刚刚好那天晚上我挖了一个大坑,跟遣怀师兄和小美姐姐一起填坑...

12520
来自专栏Java架构师学习

通过 Java 线程堆栈进行性能瓶颈分析

30860
来自专栏携程技术中心

干货 | Android工程模块化平台的设计

19430
来自专栏Java技术分享

为什么要使用存储过程?

项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是

453150
来自专栏tiane12

通过抓包获取ActiveX控件通信数据时的一点心得

14420
来自专栏领域驱动设计DDD实战进阶

微服务实战(九):落地微服务架构到直销系统(回顾总结)

这个系列我们大概写了八篇文章,将微服务的最重要的内容过了一遍。当然其中有些内容还没有涉及到,比如Docker(不是微服务架构风格中必须的)等,关于Docker我...

16410
来自专栏idealclover的填坑日常

从零开始折腾博客(0):静态?动态?

这两天心血来潮,忽然想折腾一个属于自己的博客,也就是这一系列的缘由。而最终也总算是折腾出来了,要不你就不会看到这篇文章了

16610

扫码关注云+社区

领取腾讯云代金券