urlopen()
方法
urlib.urlopen(url[,data[,proxies]])
:创建一个表示远程url的类文件对象,然后就相当于本地的文件对象,可以来获取远程数据。
url
表示远程数据的路径,一般为网址data
表示已post请求提交到url
的数据proxies
表示设置代理urlopen
返回一个类文件对象、
方法:
–read()
文件读操作/ reanline()
按行读取形成列表/ fileno()
返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作 / close()
关闭文件
–info()
返回一个httplib.HTTPMessage
对象,表示远程服务器返回的头信息
–getcode()
返回Http
状态码。如果是http
请求,200表示请求成功完成;404表示网址未找到
–geturl()
返回请求url
抓取url的内容,步骤:
1. 导包:'from urlib import request
2. 使用with
语句,发送GET
请求:with request.urlopen('https://api....')as f:
3. 查阅已读取的网页资源 :.read()
4.返回需要的数据,例如:(f.getheaders())
5.当需要将请求伪装成浏览器的情况时,需要加一个:
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
这是伪装成一个iphone 6 的请求,这个时候网站就会返回,相应的页面。
例子:
# -*- coding: utf-8 -*-
"""
利用urllib读取JSON,然后将JSON解析为Python对象:
@step1:使用with-closing方法请求url,并读取url中的内容
@step2:将读取的字节型文件,转化为字符串型
@step3:使用json.loads函数将str-python对象
"""
from urllib import request
from contextlib import closing
import json
def fetch_data(url):
with closing(request.urlopen(url)) as f:
text_json=f.readline()
return json.loads(text_json.decode('utf-8'))
# 测试
URL = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json'
data = fetch_data(URL)
print(data)
assert data['query']['results']['channel']['location']['city'] == 'Beijing'
print('ok')