欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

程序员文章站 2022-05-12 13:37:38
...

笔记

例子一:从猫网站上下载一张猫的图片

猫网站:http://placekitten.com

要下载的猫图片: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栏 依然存在。

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

接着,在name, status,type栏上方右键,勾选method,method就被添加到这一栏中。 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 


接着,试着输入一个内容进行翻译,找到method为POST的记录。

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

双击进入查看,其中:

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)

 

【小甲鱼Python】论一只爬虫的自我修养2:实战 (使用2020.3.1有道翻译的网页,解决找不到method等问题)


实现代码:

注意要把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'])