51Testing软件测试论坛

标题: Python爬虫——写出最简单的网页爬虫 [打印本页]

作者: 测试积点老人    时间: 2018-12-4 16:37
标题: Python爬虫——写出最简单的网页爬虫
本帖最后由 测试积点老人 于 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>
复制代码

结果如下图:
[attach]119803[/attach]

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

当然,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()  
复制代码

运行结果如图:


[attach]119804[/attach]


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()  
复制代码

运行结果如图:


[attach]119805[/attach]


既然为了处理错误,那么最好两个错误都写入代码中,毕竟越细致越清晰。须注意的是,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软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2