【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)
笔记
例子一:从猫网站上下载一张猫的图片
要下载的猫图片:http://placekitten.com/g/500/800
实现代码:
import urllib.request
response = urllib.request.urlopen('http://placekitten.com/g/500/800')
cat_img = response.read()
with open('cat.jpg','wb') as f:
f.write(cat_img)
urlopen()中也可以以放入Request对象:
import urllib.request
url_request = urllib.request.Request('http://placekitten.com/g/500/800') #将字符串转成Request对象
response = urllib.request.urlopen(url_request)
cat_img = response.read()
with open('cat.jpg','wb') as f:
f.write(cat_img)
response是一个类文件对象,因此可以用read方法读入。除此之外,还可以用geturl(),info(),getcode()对其进行不同的读取。
geturl():
返回url
>>> response.geturl()
'http://placekitten.com/g/500/800'
info():
返回一个包含有“远程服务器返回的header信息”的对象,可用print对其打印进行查阅。
>>> response.info()
<http.client.HTTPMessage object at 0x000001BE9CC95160>
>>> print(response.info())
Date: Sun, 01 Mar 2020 00:39:29 GMT
Content-Type: image/jpeg
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d5181a09d261d05229c81afa19f5e7eaf1583023169; expires=Tue, 31-Mar-20 00:39:29 GMT; path=/; domain=.placekitten.com; HttpOnly; SameSite=Lax
Cache-Control: public, max-age=86400
Expires: Thu, 31 Dec 2020 20:00:00 GMT
Vary: User-Agent, Accept-Encoding
Access-Control-Allow-Origin: *
CF-Cache-Status: HIT
Age: 437
Server: cloudflare
CF-RAY: 56ced239aa1f93f4-SJC
getcode():
返回http的状态码,200表示正常。
>>> response.getcode()
200
例子二:访问有道翻译进行翻译
以谷歌浏览器为例子,按F12进入开发者模式。本人初次进入时,并没有找到method的标签,且也没有name,status,type栏。后来发现在右上角的齿轮处,将show overview的勾取消掉,就自动显示出name,status,type栏。后期再次勾选show overview,
name,status,type栏 依然存在。
接着,在name, status,type栏上方右键,勾选method,method就被添加到这一栏中。
接着,试着输入一个内容进行翻译,找到method为POST的记录。
双击进入查看,其中:
实现代码:
注意要把url中的_o去掉,否则最后运行结果会是
{"errorCode":50}
这应该是新版有道翻译的一个反爬机制,我没学过网页相关的知识,不知道。
import urllib.request
import urllib.parse
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {
'i': 'love',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15830270361564',
'sign': '722c486628af34b85df217c4fe6b111a',
'ts': '1583027036156',
'bv': '0ed2e07b89acaa1301d499442c9fdf79',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)
运行结果:
{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"love","tgt":"爱"}]]}
这是一个json结构,是一种轻量级的数据交换格式。以字符串的形式将Python的数据结构封装起来,就叫json。
>>> import json
>>> json.loads(html)
{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 2, 'translateResult': [[{'src': 'love', 'tgt': '爱'}]]}
>>> target = json.loads(html) #loads表示载入字符串
>>> type(target) #既然返回的target是字典,就可以用字典的方法访问翻译结果
<class 'dict'>
>>> target['translateResult'][0][0]['tgt']
'爱'
到此,我们对于有道翻译已经有了比较完整的了解(至少对于我们的目的已经够用了)。接下来修改代码,使用户可以自定义翻译内容,并可以多次翻译,直至检测到退出的命令。
import urllib.request
import urllib.parse
import json
while True:
target = input('请输入你需要翻译的内容(输入@以暂停):')
if target == '@':
break
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {
'i': target,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15830270361564',
'sign': '722c486628af34b85df217c4fe6b111a',
'ts': '1583027036156',
'bv': '0ed2e07b89acaa1301d499442c9fdf79',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
result = json.loads(html)
print('翻译结果:',result['translateResult'][0][0]['tgt'])
上一篇: CAD怎么设置材质贴图? CAD材质贴图的制作方法
下一篇: 液晶显示器典型对比度是什么及其参数介绍