[笔记]python爬虫学习笔记(二)——向网页发送请求(json)

本文介绍了在Python中使用urllib库进行POST请求以获取JSON数据的过程,包括解决因参数加密导致的错误以及如何解析JSON响应。通过一个翻译API的示例,展示了如何处理HTTP请求和响应,包括GET与POST的区别,以及如何处理返回的HTTP状态码和元信息。
摘要由CSDN通过智能技术生成

运行平台:Windows 

Python版本:Python3.x 

IDE:Sublime text3

学习参考博客:http://blog.csdn.net/c406495762/article/details/58716886

# -*- coding: UTF-8 -*-
import io
import sys
from urllib import request
from urllib import parse
import json
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')		#改变标准输出的默认编码
if __name__ == "__main__":
	Request_URL = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
	#创建Form_Data字典,存储数据
	Form_Data = {}
	Form_Data['i'] = 'crush'
	Form_Data['from'] = 'AUTO'
	Form_Data['to'] = 'AUTO'
	Form_Data['smartresult'] = 'dict'
	Form_Data['client'] = 'fanyideskweb'
	Form_Data['salt'] = '1526093689660'
	Form_Data['sign'] = 'be06628950f0ed07bb166f26fd71e0d2'
	Form_Data['doctype'] = 'json'
	Form_Data['version'] = '2.1'
	Form_Data['keyfrom'] = 'fanyi.web'
	Form_Data['action'] = 'FY_BY_REALTIME'
	Form_Data['typoResult'] = 'false'
	#使用urlencode方法转换为标准格式
	data = parse.urlencode(Form_Data).encode('utf-8')
	response = request.urlopen(Request_URL,data)
	html = response.read().decode('utf-8')		#根据网页的编码方式进行解码
	#使用json
	translate_results = json.loads(html)
	print(translate_results)
	translate_results = translate_results['translateResult'][0][0]['tgt']
	print("翻译的结果是:%s"%translate_results)


{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 0, 'translateResult': [[{'src': 'crush', 'tgt': '粉碎'}]]}

翻译的结果是:粉碎


产生报错:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

产生报错是因为用了原地址http://fanyi.youdao.com/,但是查询返回的地址变了,请求的地址也要跟着改

然后又出现...

translate_result的返回值为{'errorCode': 50}

查了一下说是因为参数salt和sign加密,每次输入同样的翻译文都会产生不一样的salt和sign的参数值。

有两个解决办法:

第一是简单粗暴的,把请求地址中的“_o”删掉

第二是破解加密方法,mark一个博客,之后再来看:http://www.tendcode.com/article/youdao-spider/


上述代码涉及urlopen的两个参数

url:可以为一个字符串,也可以为一个request对象

data:data参数可以向服务器发送数据

    我们可以使用data参数,向服务器发送数据。根据HTTP规范,GET用于信息获取,POST是向服务器提交数据的一种请求,再换句话说:

    从客户端向服务器提交数据使用POST;

    从服务器获得数据到客户端使用GET(GET也可以提交,暂不考虑)。

    如果没有设置urlopen()函数的data参数,HTTP请求采用GET方式,也就是我们从服务器获取信息,如果我们设置data参数,HTTP请求采用POST方式,也就是我们向服务器传递数据。

    data参数有自己的格式,它是一个基于application/x-www.form-urlencoded的格式,具体格式我们不用了解, 因为我们可以使用urllib.parse.urlencode()函数将字符串自动转换成上面所说的格式。

data数据在审查元素中获得

右键-检查,出现一个信息框框,点击Network,在左侧输入翻译内容,如crush,翻译,右侧就会出现具体信息,Name中出现了一些信息,点击第一个,找到Form Data和Request URL。


urlopen()返回的对象,可以使用read()进行读取,同样也可以使用geturl()方法、info()方法、getcode()方法。

  • geturl()返回的是一个url的字符串;

  • info()返回的是一些meta标记的元信息,包括一些服务器的信息;

  • getcode()返回的是HTTP的状态码,如果返回200表示请求成功。

JSON是一种轻量级的数据交换格式,我们需要从爬取到的内容中找到JSON格式的数据,这里面保存着我们想要的翻译结果,再将得到的JSON格式的翻译结果进行解析,得到我们最终想要的样子:粉碎

为了说明获取的结果的格式,我print了json翻译后的结果,也可以在检查网页的preview中看到。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值