Python 爬虫笔记(2)

  我们如何使用Python而不是浏览器,利用有道翻译,来翻译文本?
  首先打开有道,右键,点击“检查”,或者“审查元素”,我们可以看到网页的源代码,如图1所示:
Python 爬虫笔记(2)_第1张图片
  我们点击network,如图2:
Python 爬虫笔记(2)_第2张图片
  找到translate?....如图3,然后点击:
Python 爬虫笔记(2)_第3张图片
  然后在点击preview,如图4 ,我们可以看到我们要翻译的语句,和翻译的结果。
Python 爬虫笔记(2)_第4张图片
  我们主要是看Headers,如图5;
Python 爬虫笔记(2)_第5张图片
我们要说明一下Headers的内容:
1,General,如图6
Python 爬虫笔记(2)_第6张图片
  Request URL:
http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link
  这个网址才是真正实现翻译机制的地址,也是我们最后需要的地址。
  请求方法为POST:
  在客户端和服务器之间进行请求和响应的时候,最常用的两个方法就是:GET和POST。
  GET是指从服务器请求获得数据,而POST是向指定服务器提交被处理的数据,在现实中Get也常常用来提交数据。
  状态200,就是正常响应,如果是404的话,客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应,且不知道原因所返回的页面。
  Remote Address:123.58.182.242:80,表示服务器的IP地址加上他的端口号。
2,Request Headers,如图7
Python 爬虫笔记(2)_第7张图片
  就是客户端,在这里就是指浏览器。这个常常被服务器用来判断当前是否非人类访问(比如我们用python代码,批量的访问数据,那么服务器会承受大压力的,因此可能会被服务器屏蔽掉)。
而服务器就是根据User-Agent:判断的。

3,Form Data  ,如图8
Python 爬虫笔记(2)_第8张图片
  其中i,就是我们要翻译的语句。
  由上一节我们知道:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  其中data,如果data被赋值,那么他就是以POST的方式提交数据,如果为None,那么它就以GET的方式提交。
  Python文档中说明data必须是x-www-form-urlencoded格式,而urllib.parse.urlencode()就可以把字符串转化为这种标准格式。

  那么我们到此就可以写代码了:
import urllib.request
import urllib.parse

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link'
data = {}
#以下data 的内容,就是根据上述Form Data来写的
data['type'] = 'AUTO'
data['i'] = 'I am a Spider'
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'

data = urllib.parse.urlencode(data).encode('utf-8')#解析data,Python默认Unicode形式,encode()是把Unicode编码形式转化为其他形式

response = urllib.request.urlopen(url, data)

html = response.read().decode('utf-8')#decode()是把其他形式转化为Unicode形式

print(html)
  运行结果:
{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":8,"translateResult":[[{"src":"I am a Spider !","tgt":"我是一只蜘蛛!"}]]}
  这是一个字符串 ,那么这种结果肯定不是我们想要的。这其实是一个json结构。
  json格式:轻量级的数据交换格式,即,用字符串的形式,把Python中的数据结构给封装起来,这就是Json.
  上述字符串里面实际上包含的是一个字典,Python可以正常识别结构,我们可以导入Json,用json.loads(),把字符串载入,我们实际上得到的就是一个字典,如下,一步一步的就可以得到我们想要的结果:
>>> import json
>>> json.loads(html)
{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 8, 'translateResult': [[{'src': 'I am a Spider !', 'tgt': '我是一只蜘蛛!'}]]}
>>> target = json.loads(html)
>>> type(target)

>>> target['translateResult']
[[{'src': 'I am a Spider !', 'tgt': '我是一只蜘蛛!'}]]
>>> target['translateResult'][0][0]
{'src': 'I am a Spider !', 'tgt': '我是一只蜘蛛!'}
>>> target['translateResult'][0][0]['tgt']
'我是一只蜘蛛!'
>>>
  有了这些想法,我们就可以直接把上述代码更改如下:
import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link'
data = {}

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

data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'

data = urllib.parse.urlencode(data).encode('utf-8')#解析data,Python默认Unicode形式,encode()是把Unicode编码形式转化为其他形式

response = urllib.request.urlopen(url, data)

html = response.read().decode('utf-8')#decode()是把其他形式转化为Unicode形式

target = json.loads(html)#转化为Python的数据结构
print("输出翻译结果:%s" % target['translateResult'][0][0]['tgt'])

结果为:
请输入你所需要翻译的内容:我在学习爬虫
输出翻译结果:I'm learning the crawler



你可能感兴趣的:(python笔记,爬虫)