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库的一些高级用法!!!
当然,更新时间依然不定!千玩别打我!