python3实现网络爬虫(1)--urlopen抓取网页的html

准备开始写一些python3关于爬虫相关的东西,主要是一些简单的网页爬取,给身边的同学入门看。

首先我们向网络服务器发送GET请求以获取具体的网页,再从网页中读取HTML内容。

       我们大家平时都使用网络浏览器,并且它已经成为我们上网不可或缺的软件。它创建信息的数据包,发送他们,然后把我们获取的的数据 显示 成漂亮的图像、声音、视频和文字。我们应该注意的是,浏览器就是代码,而代码是可以分解的,可以分解成许多基本组件,可重用、重写,以及做成我们想要 的任何东西。

那么现在我们就来看看如何从一个网页获取html并显示出来(代码可在pycharm等编辑器 中编写):

#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.read())

当我们执行这个程序后会得到如下的结果:

b'<!DOCTYPE html><!--STATUS OK--><html><head><meta name="keywords" content="xe8xb4xb4xe5x90xa7,xe7x99xbexe5xbaxa6xe8xb4xb4xe5x90xa7,xe8xaexbaxe5x9dx9b,xe5x85xb4xe8xb6xa3,xe7xa4xbexe5x8cxba,BBS"/><meta name="description" content="xe7x99xbexe5xbaxa6xe8xb4xb4xe5x90xa7xe2x80x94xe2x80x94xe5x85xa8xe7x90x83xe6x9cx80xe5xa4xa7xe7x9ax84xe4xb8xadxe6x96x87xe7xa4xbexe5x8cxbaxe3x80x82xe8xb4xb4xe5x90xa7xe7x9ax84xe4xbdxbfxe5x91xbdxe6x98xafxe8xaexa9xe5xbfx97xe5x90x8cxe9x81x93xe5x90x88xe7x9ax84xe4xbaxbaxe7x9bxb8xe8

这是百度贴吧的首页啊,代码还是比较长的,我就粘贴了首页的一些代码。

大家仔细看我们拿回的网页代码会发现,这个程序中拿回来的html中为什么会有些xe8xb4xb4xe5的东西,其实呢这个是编码问题,大家仔细观察会发现,在html代码最前面有b这个字母,后面的html代码用引号括起来了,这就表示这是个bytes类型的字节序列,在这种类型的序列中,中文会用16进制进行表示,所以我们看不到中文了。关于这个问题呢,是python中的编码问题,我们可以通过译码操作来对bytes进行解码,这就就要用到decode函数了

下面我们只要稍微修改下代码:

#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.read().decode('utf-8'))

当我们再次执行这个程序会得到如下的结果:

<!DOCTYPE html><!--STATUS OK--><html><head><meta name="keywords" content="贴吧,百度贴吧,论坛,兴趣,社区,BBS"/><meta name="description" content="百度贴吧——全球最大的中文社区。贴吧的使命是让志同道合的人相聚。不论是大众话题还是小众话题,都能精准地聚集大批同好网友,展示自我风采,结交知音,搭建别具特色的“兴趣主题“互动平台。贴吧目录涵盖游戏、地区、文学、动漫、娱乐明星、生活、体育、电脑数码等方方面面,是全球最大的中文交流平台,它为人们提供一个表达和交流思想的自由网络空间,并以此汇集志同道合的网友。" /><meta charset="UTF-8

现在我们就可以读懂这个html了。

有兴趣的话可以将抓取到的html代码粘贴到自己记事本中,将文件后缀名保存成.html,然后用浏览器打开,你会发现百度贴吧首页已经在你自己的电脑上了。

一番观赏之后,我们来解释下这个程序中用到的技术啊,程序中我们导入了一个urllib包中的函数用于访问网页。

首先来介绍下urlopen函数:

函数原型:def urlopen(url, data=None, proxies=None)

形参:

(1)url:符合URL规范的字符串(包括http,ftp,gopher,local-file标准),其实就是我们平时输入在浏览器中的网址。

(2)data : 向指定的URL发送的数据字符串,GET和POST都可以,但必须符合标准格式,即key=value&key1=value1....

(3)proxies : 

         代理服务器地址字典,如果未指定,在WINDOWS平台上则依据IE的设置,不支持需要验证的代理服务器。
          例如:proxies = {'http': 'http://www.someproxy.com:3128'},该例子表示一个http代理服务器http://www.someproxy.com:3128

从代码可以看到,我只用到了第一个参数url,后两个参数是可选的,可以根据自己的需求进行定义的,也可以不指定,这时使用的是默认的参数。

返回值:

返回一个类似文件对象的对象(file_like) object

该对象拥有的方法为:

 info()返回从服务器传回的MIME标签头,即网页的头部信息。

 geturl()返回真实的URL,之所以称为真实,是因为对于某些重定向的URL,将返回被重定后的,大部分情况下可以认为就是我们输入的网址

getcode():获取网页的状态码,200是正常访问,301是重定向,404是网页不存在,403是禁止访问(有可能网页不存在,也可能是此网站有反爬虫机制,无法爬取;500是网站正忙)。

 其它的函数如 read()、readline()、 readlines()、fileno()、close()则和我们的文件对象类似了。

下面我们来展示下info()的用法:

#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.info())
程序执行的结果为:

Content-Type: text/html; charset=UTF-8
Date: Sat, 05 Nov 2016 07:54:57 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: TIEBAUID=cb23caae14130a0d384a57f1; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com
Set-Cookie: TIEBA_USERTYPE=6a1c7afddb7bc564bf21c11e; expires=Thu, 31-Dec-2020 15:59:59 GMT; path=/; domain=tieba.baidu.com
Set-Cookie: BAIDUID=071A5C2537394FD906AA0DDCDC3E138D:FG=1; expires=Sun, 05-Nov-17 07:54:57 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Tracecode: 32974281920539063562110515
Tracecode: 32974281920790459658110515
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Bd-Id: 12371245289908688739
X-Bd-Oc: 0
X-Bd-Ul: 752bcb03d01cc2fed9326fe0daa239d7
Connection: close
Transfer-Encoding: chunked

虽然这个返回的结果是很多的,但都是以键值对的形式展现给我们的,还是比较清晰易于理解的。

我们看看这句:Content-Type: text/html; charset=UTF-8,它告诉我们这个网页的文本格式是text/html,字符集是utf-8,后面的一些信息大家有兴趣的可以自己去查查资料,这里就不一一说明了。

下面我们来看看网页的状态码:

#coding:utf-8
from urllib.request import urlopen
html=urlopen("http://tieba.baidu.com/")
print(html.getcode())
执行这个程序我们得到的结果是:200,这就说明我们的访问的网页是正常的,我们可以安心解析自己需要的东西了。

好了,这一次就介绍到这里,还有很多好玩的就留给大家自己去体验了。





    

原文地址:https://www.cnblogs.com/hliu17/p/7399928.html