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

笔记

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

猫网站: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栏 依然存在。

 

 

 

接着,在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'])

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值