一般而言,想要获取网站页面上的信息,有两种方法:GET和POST。我们打开浏览器,点开一个网页(我这边用的是火狐浏览器),然后按下F12,点开它的"网络选项",会发现出现了如下界面,我们可以看到方法那一栏的"GET"。采用GET获取信息
既然只是笔记,我就记得随意一点,通俗一点。
GET方法就是直接获取页面上的信息,而POST是向网站发送一个清单,网站根据清单执行某些特定的操作,然后返回信息。
在Python中,使用这两种方法需要使用模组requests。
以哔哩哔哩的一个api为例,"https://api.bilibili.com/x/v2/reply?pn=page(page一个数字,代表页数)&type=1&oid=AVID(AVID就是一个视频的av号)&sort=2" ,通过对这个网址的GET操作,我们可以获取网址返回的信息。 以我的一个视频为例,其av号为882742969,我想查看这个视频第一页的评论。不妨先直接在网站上输入这个网址查看结果:"https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=882742969&sort=2"可以看到网站返回了一个JSON文件
JSON文件我并不是很了解,但是我觉得它就像是一个MAP,每个key都有一个对应的值。像生活中的字典检索表。
在Python中,我们可以实现上面操作。
import requests #需要requests模块
import json #需要json模块来处理json文件
url = 'https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=882742969&sort=2' #存放网址
result = requests.get(url) #获取页面上的信息 调用requests.get函数
resultContent = json.loads(result.text) #获取json文件里的内容
print(resultContent)
控制台输出结果为:控制台输出结果
网页上直接查看JSON文件
显然,我们成功获取了JSON文件中的内容,下面我们可以处理我们需要的信息了。这个就很简单了,和C++ STL库里的map是一样的,用key作为容器的序号来获取其对应的值。JSON文件中的信息
分析信息,发现replies(replies在data这个key下)这个key下存放的就是评论信息,0下存放着第一条评论的相关信息,包括用户信息和评论信息。content下的message就存放着我们需要的评论信息。我们试着输出print(resultContent['data']['replies'][0]['content']['message'])控制台的输出
这正是我的视频下的第一条评论。到此,我们已经实现了GET方法。
接下来实现POST方法,以有道翻译为例,我们打入“起飞”并且翻译,看到网络请求那边多了一个POST方法。POST方法
打开右边的消息头,参数和选项,我们看到如下信息:消息头
参数
响应
POST实现方法和GET类似,只不过在函数的参数多加了个表单和请求头。
这边的url复制消息图的请求网址,同时复制请求头和表单信息,代码如下
import requests
import json
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers ={
'Host': 'fanyi.youdao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Content-Length': '260',
'Origin': 'http://fanyi.youdao.com',
'Connection': 'keep-alive',
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=-1456668739@10.169.0.83; OUTFOX_SEARCH_USER_ID_NCOO=763697263.1371856; JSESSIONID=aaaeDH1zuXfg860X50_gx; ___rl__test__cookies=1588045743097'}
fromData = {"i":"起飞\n","from":"AUTO","to":"AUTO","smartresult":"dict","client":"fanyideskweb","salt":"15880445399187","sign":"3064ec4bec4669034a4278e80b202ee4","ts":"1588044539918","bv":"e2a78ed30c66e16a857c5b6486a1d326","doctype":"json","version":"2.1","keyfrom":"fanyi.web","action":"FY_BY_REALTlME"}
result = requests.post(url, data = fromData, headers = headers)
resultContent = json.loads(result.text)
print(resultContent)
print(resultContent['translateResult'][0][0]['tgt'])
控制台的结果为:控制台结果