python爬虫-requests入门-20210807

今日所学: 利用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)上有较详细解释
【python爬虫-requests入门-20210807】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("哇咔咔咔!!")

    推荐阅读