美文网首页思科DevNetPython学习日志Python
Python网络数据采集之创建爬虫|第00天

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

作者: 你好我是森林 | 来源:发表于2018-03-27 16:33 被阅读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等语言有了解,可以点击关注我,后续就会收到我所有文章的更新推送。如果该文章对你有所帮助,可以点击喜欢,以后就可以直接在自己的主页查看。如有其他的问题,欢迎交流。

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

    知识星球

    相关文章

      网友评论

      • 失眠是真滴难受:在最后的return title 的缩进是不是有问题哦,return应该在函数体内啊,应该还要向后缩进四格
        失眠是真滴难受:@你好我是森林 不用这么尊称,,,我是看着您的文章在学,然后在运行的时候发现有错,才发现那缩进有问题的
        你好我是森林:@Richard0 我明天用电脑看看,手机好像不好用
        你好我是森林:@Richard0 我检查下,马上纠正。感谢您的提醒。
      • 壹二三:我会一直在你身后
      • 二的平方:最后的代码:bsObj = BeautifulSoup(html.read())
        运行会有一段提示虽然不影响最终输出,不过看意思应该是缺少参数"lxml",补充后提示消失。
        二的平方:@你好我是森林 get
        你好我是森林:这是解析器的参数。
      • 二的平方:为什么我这是这样:
        >>> from urllib.error import HTTPError
        Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        ImportError: No module named error
      • Jruing:没用过bs 一直用的requests配合xpath 或者re
      • Changeman:应该还有一个re正则
      • ebc6f23f4586:可是我用的Jupyter,beautiful怎么安装阿😶求解求解大神
        你好我是森林:@ChrisChan_33 我没用过Jupyter,谢谢分享
        ebc6f23f4586:@你好我是森林 发觉不用了阿,不用检查这个,Jupyter是直接引用beautifulsoup就可以用的嘞😜
        你好我是森林:@ChrisChan_29bf pip install jupyter
      • 为啥要创业:python的代码太美了

      本文标题:Python网络数据采集之创建爬虫|第00天

      本文链接:https://www.haomeiwen.com/subject/xbjscftx.html