当前位置:   article > 正文

爬取有道翻译练习

爬取有道翻译练习

方法一


	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)#延时提交时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

方法二

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

说明:

两种方法,分别设置这个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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/855726
推荐阅读
相关标签
  

闽ICP备14008679号