整理资料时发现从SoJSON在线(sojson.com)上获取json数据,然后进行整理输出万年历的查询程序(代码见:PythonABC.org->应用实例->网站API数据和CSV文件->万年历查询)不灵了,给出的错误是:
到SoJSON网站上查看使用json数据的技术说明,没发现需要改动的说明。代码中组建提取json数据链接的函数是url_name(),在返回链接return full_url前加一条语句print(full_url):
运行结果可以看到该函数组建的链接字串“https://www.sojson.com/open/api/lunar/json.shtml”,后面跟着出错信息(直接敲回车查询今天的黄历):
把得到的链接字串拷贝到浏览器上的地址框,确认这样获取json数据没问题:
回头查看程序获取的数据,输出网站上取回来的数据内容(程序很短,逻辑也很简单,就不麻烦logging直接用print语句啦):
运行结果为:
把红圈内的错误提示拷贝到搜索引擎上,可以在前面加上python的字符串,看别人对错误的分析以及怎么处理这个错误的。
我们向服务器发出请求的语句是response = requests.get(“https://www.sojson.com/open/api/lunar/json.shtml”),采用浏览器用的请求方式发送的。却不想被对方识破了,返回信息说“不对,你这个请求User-Agent Header对不上(驴唇不对马嘴),请求无效!”。为了把User-Agent Header伪装成浏览器瞒哄过服务器,调用request.get()时加一个headers的字符串:
headers的内容就是各个浏览器。运行,顺利通过,可见服务器很实诚,咱们的程序说啥是啥:
除了这个直截了当的办法外,还可用第三方模块帮忙做伪装。可用的一个模块是fake_useragent。这个模块在PyCharm安装第三方模块的界面上没搜到,用终端命令pip install fake_useragent可以安装(安装第三方模块见pythonabc.org->python基础->准备工作->安装第三方模块)。安装完毕后引入到程序中:
向服务器提出请求部分改为:
我用的浏览器是safari,所以是ua.safari,你用的浏览器是啥就写啥,详细可查看模块的技术文档(https://pypi.org/project/fake-useragent/)。
另一个帮忙做伪装的第三方模块可以用my_fake_useragent,这个模块在PyCharm搜索第三方模块的界面上可以搜到并安装,终端用命令行pip install my_fake_useragent安装也没问题。安装完毕后引入到程序中:
向服务器提出请求用:
参数family=的选择有chrome、firefox、edge、ie、opera、safari ,查看技术文档https://pypi.org/project/my_fake_useragent/,还可以设置操作系统平台参数。
问题会不断出现怎么办?见招拆招呗¯\_(ツ)_/¯