对有道翻译进行爬取

先放上代码

#模块导入
import urllib.request
import urllib.parse
import json
#用户输入
sentence=input("请输入要翻译的句子:")
#实现翻译的网址
url="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
#构建表单字典
data={}
data['i']= str(sentence)
data['from'] = 'AUTO'
data['to']= 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = '1534614649372'
data['sign'] = '96714dfadac2ced54a30097038d2cfd1'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CLICKBUTTION'
data['typoResult']= 'false'
data=urllib.parse.urlencode(data).encode('utf-8')
#构建Request实例
req=urllib.request.Request(url,data)
req.add_header('User-Agent',' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36')
#获取请求
response = urllib.request.urlopen(req)
#请求处理
html=response.read().decode("utf-8")
target=json.loads(html)
#输出显示
display="翻译结果为:"+target['translateResult'][0][0]['tgt']
print(display)

**urllib.request.urlopen()中的data参数:** 浏览器和服务器请求的方式有两种:GET和POST GET用于从服务器获得数据(有时也会用于传递) POST用于向服务器传递数据 data 参数是可选的,默认为None,如果你没有传递这个 data 参数,那么你的请求方式默认为GET,如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。

import urllib.parse
import urllib.request
data = urllib.parse.urlencode({'word': 'hello'}).encode('utf-8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

urllib.parse.urlencode(dict).encode(‘utf-8’)
这一句是将data字典转化为特殊字符串并以’utf-8’的形式编码
这样做是由于urlopen()方法中对data参数的格式有特殊的要求

urllib.request.Request的使用
由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。

import urllib.request
 
request =urllib.request.Request("https://www.baidu.com")
response = urllib.request.urlopen(request)
print(response.read().decode("utf-8"))

可以发现,我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。

下面我们看一下 Request 都可以通过怎样的参数来构造,它的构造方法如下。

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。

headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header(key,value) 方法来添加请求头。如:

#通过改变headers中的'User-Agent'来达到伪装的目的
req=urllib.request.Request(url,data)
req.add_header('User-Agent',' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36')

你可能感兴趣的:(spider)