方法一
import urllib.request
import urllib.parse
import json
import time
# url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'#去掉url中的_o
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
while True:
content = input('请输入需要翻译的内容(输入"q!"退出程序):')
if content == "q!":
break
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15458876971100',
'sign': '08de3448974468c00f2a578e2cab7cf8',
'ts': '1545887697110',
'bv': '363eb5a1de8cfbadd0cd78bd6bd43bee',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'false',
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Referer': 'http://fanyi.youdao.com/',
}
data = urllib.parse.urlencode(data).encode('utf-8')
# print(data)
# print(type(data))#(1)<class 'bytes'>
req = urllib.request.Request(url,data=data,headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
# print(html)
# print(type(html))#(2)<class 'str'>
req = urllib.request.Request(url,data)
req.add_header('Referer','http://fanyi.youdao.com/')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
# print(html)
# print(type(html))#(2)<class 'str'>
target = json.loads(html)
# print(target)
# print(type(target))#<class 'dict'>
# a = target['translateResult'][0][0]['tgt']
# print(a)
print('翻译结果:%s' %(target['translateResult'][0][0]['tgt']))
# print(req.headers)
time.sleep(5)#延时提交时间
方法二
import urllib.request
import urllib.parse
import json
# url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'#去掉url中的_o
content = input('请输入需要翻译的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15458876971100',
'sign': '08de3448974468c00f2a578e2cab7cf8',
'ts': '1545887697110',
'bv': '363eb5a1de8cfbadd0cd78bd6bd43bee',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'false',
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Referer': 'http://fanyi.youdao.com/',
}
data = urllib.parse.urlencode(data).encode('utf-8')
# print(data)
# print(type(data))#(1)<class 'bytes'>
req = urllib.request.Request(url,data=data,headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
# print(html)
# print(type(html))#(2)<class 'str'>
target = json.loads(html)
# print(target)
# print(type(target))#<class 'dict'>
# a = target['translateResult'][0][0]['tgt']
# print(a)
print('翻译结果:%s' %(target['translateResult'][0][0]['tgt']))
print(req.headers)
说明:
两种方法,分别设置这个headers参数有两种途径,实例化Request对象的时候将headers参数传进去和通过add_header()方法往Request对象添加headers
知识点:
-
1.由客户端和服务端之间进行请求-响应时,两种最常用到的方法就是 POST和GET
-
2.通常,GET是从指定的服务器请求数据,而POST是向指定的服务器提交要被处理的数据(这不是绝对的,因为在现实情况中,GET也用来提交数据给服务器)
-
3.HTTP是基于请求-相应的模式,{客户端发出的请求叫Request,服务端的相应叫Response}
-
4.Request Headers是客户端发送请求的Headers,这个常常被服务器用来判断是否来自‘非人类’的访问,一般是通过User-Agent来识别,普通浏览器会通过该内容向访问网站提供你所使用的浏览器类型,操作系统,浏览器内核等信息的标识,而使用python访问的话,User-Agent会被
定义为python-urllib/3.4 -
5.如何用python提交POST表单?
urlopen函数有一个data参数,如果给这个参数赋值,那么HTTP的请求就是使用POST方式
如果data的值NULL,也就是默认值,那么HTTP的请求就是使用GET方式 -
6.data参数的值必须符合这个application/x-www-form-urlencoded的格式,还要用urllib.parse.urlencode()
将字符串转换为这个格式 -
7.Request有个headers参数,通过设置这个参数,可以伪造成浏览器访问,
设置这个headers参数有两种途径,实例化Request对象的时候将headers参数传进去和通过add_header()方法
往Request对象添加headers
第一种方法要求headers必须是一个字典的形式: -
8.通过修改User-Agent实现隐藏,不过如果这是一个用于抓取网页的爬虫(例如说批量下载某些图片)那么一个ip在短时间内连续访问,很明显不符合普通人的行为标准的,同时也给服务器造成不小的压力
因此,服务器只需要记录每个ip的访问频率,在单位时间内,如果访问频率超过一个阈值,便可以认为该ip地址可能是爬虫,于是可以返回一个验证码页面,要求用户填写验证码,如果是爬虫,则不能填写验证码,便可拒绝掉这里提到两个反反爬虫策略:第一种就是延时提交时间,还有一种就是使用代理
爬取中遇到的问题:
- 将在审查元素中获得的url中translate后面的_o去掉,错误就消失了,可以正常爬取。不知道为什么
- data除了doctype键和i键不能去掉,其余的即使删除了也能正常运行翻译
- {‘i’:‘content’ 这里的字典第一个元素的值是你翻译的值 不是字符串content
本文介绍使用Python调用有道翻译API的两种方法,详细展示了如何设置请求头、提交POST表单以及解析JSON响应,同时讨论了反爬虫策略。
2548

被折叠的 条评论
为什么被折叠?



