51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1634|回复: 0
打印 上一主题 下一主题

Python爬虫——写出最简单的网页爬虫

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 527 天

    连续签到: 4 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-4 16:37:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 2018-12-4 16:39 编辑

    最近对python爬虫有了强烈地兴趣,在此分享自己的学习路径,欢迎大家提出建议。我们相互交流,共同进步。

    1.开发工具

    笔者使用的工具是sublime text3,它的短小精悍(可能男人们都不喜欢这个词)使我十分着迷。推荐大家使用,当然如果你的电脑配置不错,pycharm可能更加适合你。

    sublime text3搭建python开发环境推荐查看此博客:

    [sublime搭建python开发环境][http://www.cnblogs.com/codefish/p/4806849.html]

    2.爬虫介绍

    爬虫顾名思义,就是像虫子一样,爬在Internet这张大网上。如此,我们便可以获取自己想要的东西。

    既然要爬在Internet上,那么我们就需要了解URL,法号“统一资源定位器”,小名“链接”。其结构主要由三部分组成:

    (1)协议:如我们在网址中常见的HTTP协议。

    (2)域名或者IP地址:域名,如:www.baidu.com,IP地址,即将域名解析后对应的IP。

    (3)路径:即目录或者文件等。

    3.urllib开发最简单的爬虫

    百度首页简洁大方,很适合我们爬虫。

    爬虫代码如下:

    1. from urllib import request

    2. def visit_baidu():
    3.     URL = "http://www.baidu.com"
    4.     # open the URL
    5.     req = request.urlopen(URL)
    6.     # read the URL  
    7.     html = req.read()
    8.     # decode the URL to utf-8
    9.     html = html.decode("utf_8")
    10.     print(html)

    11. if __name__ == '__main__':
    12.     visit_baidu()  <span style="background-color: rgb(255, 255, 255);">结果如下图:</span>
    复制代码

    结果如下图:


    我们可以通过在百度首页空白处右击,查看审查元素来和我们的运行结果对比。

    当然,request也可以生成一个request对象,这个对象可以用urlopen方法打开。

    代码如下:
    1. from urllib import request

    2. def vists_baidu():
    3.     # create a request obkect
    4.     req = request.Request('http://www.baidu.com')
    5.     # open the request object
    6.     response = request.urlopen(req)
    7.     # read the response  
    8.     html = response.read()
    9.     html = html.decode('utf-8')
    10.     print(html)

    11. if __name__ == '__main__':
    12.     vists_baidu()  
    复制代码

    运行结果和刚才相同。


    (3)错误处理

    错误处理通过urllib模块来处理,主要有URLError和HTTPError错误,其中HTTPError错误是URLError错误的子类,即HTTRPError也可以通过URLError捕获。

    HTTPError可以通过其code属性来捕获。

    处理HTTPError的代码如下:

    1. from urllib import request
    2. from urllib import error

    3. def Err():
    4.     url = "https://segmentfault.com/zzz"
    5.     req = request.Request(url)

    6.     try:
    7.         response = request.urlopen(req)
    8.         html = response.read().decode("utf-8")
    9.         print(html)
    10.     except error.HTTPError as e:
    11.         print(e.code)
    12. if __name__ == '__main__':
    13.     Err()  
    复制代码

    运行结果如图:



    404为打印出的错误代码,关于此详细信息大家可以自行百度。

    URLError可以通过其reason属性来捕获。

    chuliHTTPError的代码如下:

    1. from urllib import request
    2. from urllib import error

    3. def Err():
    4.     url = "https://segmentf.com/"
    5.     req = request.Request(url)

    6.     try:
    7.         response = request.urlopen(req)
    8.         html = response.read().decode("utf-8")
    9.         print(html)
    10.     except error.URLError as e:
    11.         print(e.reason)
    12. if __name__ == '__main__':
    13.     Err()  
    复制代码

    运行结果如图:



    既然为了处理错误,那么最好两个错误都写入代码中,毕竟越细致越清晰。须注意的是,HTTPError是URLError的子类,所以一定要将HTTPError放在URLError的前面,否则都会输出URLError的,如将404输出为Not Found。

    代码如下:

    1. from urllib import request
    2. from urllib import error

    3. # 第一种方法,URLErroe和HTTPError
    4. def Err():
    5.     url = "https://segmentfault.com/zzz"
    6.     req = request.Request(url)

    7.     try:
    8.         response = request.urlopen(req)
    9.         html = response.read().decode("utf-8")
    10.         print(html)
    11.     except error.HTTPError as e:
    12.         print(e.code)
    13.     except error.URLError as e:
    14.         print(e.reason)  
    复制代码







    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 04:48 , Processed in 0.062938 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表