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)上有较详细解释

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("哇咔咔咔!!")

你可能感兴趣的:(爬虫入门python)