(二)python爬虫urllib库的基本使用及了解第一小节

urllib库是python官方提供的一个http请求库,在python3中的urllib库其实是把python2里的urllib库和urllib2整合在一起的.我们这里主要说的就是python3

首先开发环境:

系统: windows10

开发语言: Python3

IDE: pytharm


东西都准备好了就进入我们今天的主题.


如何使用urllib快速的请求一个网站并且获得网站的源码,

import urllib.request # 首先,从urllib库中导入内置函数request

'''
在这里给大家解释一下什么是url?
url是Uniform Resource Locator的简写
代表的含义就是统一资源定位符(就是平时我们称之为网址的东西).
那什么是统一资源定位符?
统一资源定位符是统一资源标志符的一个下种。统一资源标志符确定一个资源,而统一资源定位符不但确定一个资源,而且还表示出它在哪里。
'''

url = 'http://www.baidu.com'
html = urllib.request.urlopen(url) # urllib库中提供了一个request函数用urlopen的方法打开我们网址,并且赋值给html
html_content = html.read()# 返回的数据,用read方法读取里面的内容(内容其实是一个很长的字符串),并且用html_conten变量保存为一个对象
print(html.readline())# 因为我们的真实网页其实是有结构的,所以我们也可以通过readline方法来读取一行数据
print(html_content) # 打印以想我们读取出来的内容

执行结果:

b''
b'\n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n        \r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\t\t    \r\n\r\n\t\r\n        \r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\r\n\t\t\t        \r\n\t\t\t    \r\n\r\n\r\n\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\n\n\n\n    \n    \n    \n\t\n    \n    \n    \n    \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n    \n    \xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93\n    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\n    \r\n\r\n\r\n\r\n\n    \n\n\n\n\t\n    \n    
\n \n \n \n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n\n\r\n\r\n\r\n\n\r\n'

这样就获得了一个网站的一个页面的数据了,当然,不是所有的数据,因为还有很多数据是通过异步加载的,以后我们会说到!

那么我们现在获得的数据,我们可以通过python的方法保存到本地.

with open('./baidu_index.html', 'wb') as f: # 创建一个文件叫baidu_index.html的文件,并且用2进制的方法写入数据,取名了一个比较方便的名字f为对象
    f.write(html) # 用write方法,把我们请求返回来的数据写到我们打开的文件里面去

当然,urilib库也提供了更简单的方法,那就是urlretrieve方法,这个方法就相当于上面我们执行的所有代码

write_local = urllib.request.urlretrieve(url, 'baidu_index.html')# 传入2个参数,一个是url,一个是文件路径及文件名

无论上面哪种方法,执行后都可以看见这样的一个文件出现在我们的pycharm中.

其实我们用urlretrieve方法时会产生一定的缓存,所以我们可以通过urlcleanuo()方法来消除缓存.

urllib.request.urlcleanuo() # 这个方法可以消除缓存

还有一些常用的方法

print(html.info()) # 获取基本信息
输出结果:

Date: Thu, 08 Mar 2018 10:34:04 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=FED85239E3E56AF73FA96DD0CA8CC2C4:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=FED85239E3E56AF73FA96DD0CA8CC2C4; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1520505244; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1421_21098_20718; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+4516d37de5ab27ea925fb6746e81d124
Expires: Thu, 08 Mar 2018 10:33:23 GMT
X-Powered-By: HPHP
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 1
BDQID: 0xd15d86fd0003b199
BDUSERID: 0
print(html.geturl()) # 获取爬虫当前爬取的url

输出结果 :

http://www.baidu.com

编码和解码:

其实很多时候,我们看到的url都是通过编码后才能访问的.例如

url_1 = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_dg&wd=%E6%B3%95%E7%A5%9E%E9%99%8D%E4%B8%B4'

其实wd=后面的东西就是中文字符串,不过计算机程序只认识相关的编码,也就是你在百度搜索框输入的东西,他会自动给你进行一次编码,再传给服务器,如果不进行编码,服务器就不能识别,所以.我们正常复制下来的url应该的是这样的.那么我们想定义一个自己所有的接口的话,就需要我们用urllib库里的编码方式对中文进行编码,然后再组合在一起!

url_1 = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_dg&wd=%E6%B3%95%E7%A5%9E%E9%99%8D%E4%B8%B4'
encode_string = '法神降临'
encode_string = urllib.request.quote(encode_string)
url_2 = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=monline_dg&wd={}'.format(encode_string)
print(url_2)
print(url_1)

输出结果:


可以看见编码后看见的效果是一样的.但是,如果你不进行编码.服务器不能识别那么就GG了!

编码成这样我们就可以正常的访问了!!

解码:

decode_string = '%E6%B3%95%E7%A5%9E%E9%99%8D%E4%B8%B4'
unquote = urllib.request.unquote(decode_string)
print(unquote)

这个字符串就是我们刚才转换的字符串,解码后:



这一小节就到这里把,下一章我们来了解一下urllib库的一些高级用法!!!

当然,更新时间依然不定!千玩别打我!


你可能感兴趣的:(个人笔记,python,python爬虫,urllib库)