urllib实现http客户端功能
urllib.request 最长用的模块,可以用了发送和获取request的结果
request用法案例
爬取网页
>>> from urllib import request
>>> url = 'http://www.qq.com'
#打开并爬取url定义的网页
>>> html = request.urlopen(url)
#通过read读取
>>> html.readline()
b'<html>\n'
>>> html.read(20)
b'<head>\n<meta http-eq'
>>> html.readlines()
栗子: 将网页下载到本地
from urllib import request
import sys
def down(url, fname):
#爬取url网页
html = request.urlopen(url)
#打开要存入的文件以'wb'方式打开,因为并不确定要存入的是文件还是图片等
with open(fname, 'wb') as fobj:
while 1:
#以4096读取
data = html.read(4096)
#如果没有东西则break,有则写入
if not data:
break
fobj.write(data)
if __name__ == '__main__':
url = sys.argv[1]
fname = sys.argv[2]
down(url, fname)
修改请求头
如简书等网站,如果检测到请求头不正常会报403
那么我们可以修改请求头来骗过网站
from urllib import request
import sys
def down(url, fname):
'修改请求头为火狐浏览器'
heads = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}
r = request.Request(url, headers=heads)
# 爬取url网页
html = request.urlopen(r)
#打开要存入的文件以'wb'方式打开,因为并不确定要存入的是文件还是图片等
with open(fname, 'wb') as fobj:
while 1:
#以4096读取
data = html.read(4096)
#如果没有东西则break,有则写入
if not data:
break
fobj.write(data)
if __name__ == '__main__':
url = sys.argv[1]
fname = sys.argv[2]
down(url, fname)
url编码
默认我们url只运行一部分编码,比如数字,字母,如果我们想写汉字是不被允许的,所以我们可以用 ’ request.quote()'来进行编码
>>> url = 'https://www.baidu.com/web?query=' + request.quote('运维开发')
>>> url
'https://www.sogou.com/web?query=%E5%85%83%E6%97%A6%E6%94%BE%E5%81%87'