今日所学:
利用requests库抓取豆瓣电影排行榜(喜剧片)前二十信息
来自B站相关视频
今日问题:
1.在教程中,它使用了print(resp.text)来输出网站返回的数据,但是这样在win的IDLE下会有报错:
UnicodeEncodeError:
'UCS-2' codec can't encode characters in position 2174-2174:
Non-BMP character not supported in Tk
这是因为IDLE使用的Tk字符集(大概叫这个名)中无法显示类似之类的符号,所以需要一个将此类符号映射为不可识别符(类似一个黑色菱形中间有一个?)的操作。
于是就有了这几行:
import sys
non_bmp_map=dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd)
print(resp.text.translate(non_bmp_map))
P.S.其实并未很理解translate函数、dict.fromkeys()的作用,在stack overflow(以后简称SO)上有较详细解释
2.同样,教程中为了把获得的输出的响应(Response object)变成字典格式(就是{“”:“”,“”:“”}那种),采用print(resp.json()),当然,在此方式中,不必import json
然而,同样遇到了问题:我不能在resp.text.translate(non_bmp_map)后面直接加.json(),因为我translate后的东西是一个str,没有json()方法。
于是找了找,采用了json.loads(str)函数(来自json库),来把str转换为字典。
于是有了这几行:
print(json.loads(resp.text.translate(non_bmp_map)))
以下为完整代码
import requests
import sys
import json #json.loads()需要用这个库
non_bmp_map=dict.fromkeys(range(0x10000,sys.maxunicode + 1),0xfffd)
url="https://movie.douban.com/j/chart/top_list"
#本来后面是有“?+参数”的,但是太长
#所以用以下方法重新封装参数
param={
"type": "24",
"interval_id": "100:90",
"action": "",
"start": 0,
"limit": 20,
}
header={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
resp=requests.get(url=url,params=param,headers=header)
#使用request来发出get请求
print(resp.request.url)#打印真实网址(加上参数的那种)
print(resp.request.headers)#打印默认的User-Agent
print(resp)
print(json.loads(resp.text.translate(non_bmp_map)))#打印内容
#with open("requests2.html",mode="w") as f:
# f.write(str(resp.text,""))
#用于文件输出
print("哇咔咔咔!!")