鱼c笔记——Python爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果

下面将会出现两个例子:

例子一:爬取小猫图片(从http://placekitten.com这个网站下载猫的图片,不过网站好像黄了....,但是http://placekitten.com/g/400/300更改最后面的两个400,300还是能得到图片的,还可以更改http://placekitten.com/200/200?image=3 image的数目获取不同图片)

例子二:用Python模拟浏览器,利用在线的有道词典进行文本翻译


例子一

import urllib.request

response = urllib.request.urlopen("http://www.placekitten.com/g/500/600")  #首先urlopen的参数既可以是字符串也可以是一个request对象(文档里这样说的....),如果传入的是一个字符串地址的话,会把地址转化为一个request对象,然后再传给urlopen,这一切都是在函数里自动进行的


#所以我们也可以这样写
#req = urllib.request.Request("http://www.placekitten.com/g/500/600")
#response = urllib.request.urlopen(req)


#urlopen返回的是一个类文件对象,这个对象和文件对象很像,因此可以使用read()方法。在官方文档中还告诉了我们一些其他的可以使用的方法

cat_img = response.read()    #cat_img可以用文件保存

with open('cat_500_600.jpg', 'wb') as f:  #图片也是文件,也是二进制数据组成的,因此用wb方式把所收到的数据写入jpg格式的文件
    f.write(cat_img)

测试response其他可以使用的函数:

>>> response.geturl()          #得到的是我们访问的具体的地址
'http://placekitten.com/g/500/600'


>>> response.info()            #得到的是HTTPMessage对象


>>> print(response.info())
Date: Tue, 06 Feb 2018 14:53:33 GMT
Content-Type: image/jpeg
Content-Length: 26590
Connection: close
Set-Cookie: __cfduid=d6ea851ece87caf6cf1541488d9bc07a11517928813; expires=Wed, 06-Feb-19 14:53:33 GMT; path=/; domain=.placekitten.com; HttpOnly
Accept-Ranges: bytes
X-Powered-By: PleskLin
Access-Control-Allow-Origin: *
Cache-Control: public
Expires: Thu, 31 Dec 2020 20:00:00 GMT
Server: cloudflare
CF-RAY: 3e8ef08c83ec9699-SJC



>>> response.getcode()         #得到http的状态,200表示正常响应
200


例子二

我们遇到的第一个问题是:
怎么模拟将文本放到翻译框中再让它翻译呢?

首先,在网页中审查元素,我们要关注的是Network这一块.
点下网页中自动翻译的按钮时,框中出现了很多东西(现在好像不出了),Method栏下Post、Get等内容。这些文件都是浏览器和我们客户端的通信内容,在客户端和服务器之间进行请求响应时候的两种常用方法:一种是get,一种是post。从定义上来讲,get是指从服务器请求获得数据,而post是向指定服务器提交被处理的数据。但是在现实中,get也常常被用来提交数据。
Method怎么找到:http://bbs.fishc.com/thread-67587-1-1.html

点开一个Post,我们看到了Headers,Preview。在Preview下我们找到了得到的翻译的结果。

分析Headers的内容:
Remote Address是服务器的IP地址和它打开的端口号
Request URL实现翻译的机制的地址
Request Method请求的方法是POST的形式还是其他的形式
Status Code状态码  200是正常,404是页面不见了

Request Headers  客户端(这里是浏览器,在用Python代码时就是指代码)
这里常被服务端用来判断是否是人类访问
假设我们写了一段Python代码批量的访问网站数据,会让服务器压力大,所以一般服务器是不欢迎非人类的访问的

一般会通过Request Headers下的User Agent(UA)来判断是浏览器还是代码访问
如果用Python来访问的话,Python默认是Python-urllib+Python(如Python-urllib/3.5)的版本号,这个用防火墙一识别就知道访问来自于代码而不是浏览器,所以就有可能会被屏蔽掉。因此我们要自定义User Agent。

Form Data  表单数据,就是我们Post提交的主要内容
在其下的i中看到了我们要翻译的内容

用Python如何提交POST表单呢,查看文档,在data那两行有解释。

import urllib.request
import urllib.parse
import json

content = input('请输入需要翻译的内容:')

url =  'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com/'          #链接就是Request URL的那个
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'    #json是一种轻量级数据交换的格式,用字符串的形式把Python的数据结构封装起来
data['xmlVersion'] = '1.6'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')

response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')

target = json.loads(html)
print("翻译结果:%s" % target['translateResult'][0][0]['tgt'])

#但是这里的代码中User Agent来自于非人类,可能会被屏蔽。或者IP访问过于频繁,被拉黑。Python都有应对的解决方案的,在下一讲会提到
怎么找到翻译结果:

鱼c笔记——Python爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果_第1张图片


这只是一个初步的方案,事实上是不可行的,会被屏蔽。


你可能感兴趣的:(#,Python学习笔记)