python
第二个python爬虫-爬词典有点坑
25分钟的视频本喵看了好久,主要是对着看了会纯英文Python docs!满心欢喜地开始爬有道词典,结果呵呵了。喵了个咪的,先把代码摆上再解释。
源码:
import urllib.request
import urllib.parse
import json
#定义url
url = 'http://fy.iciba.com/ajax.php?a=fy'
#构造data
string = input('请输入您要翻译的中文:')
data = {}
data['f'] = 'auto'
data['t'] = 'auto'
data['w'] = string
data = urllib.parse.urlencode(data).encode('utf-8') #修改编码方式,否则会产生错误
#爬虫
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8') #解码utf-8,返回的是序列的字符串形式
#读取字符串,载入字典,利用索引找到翻译结果
target = json.loads(html)
print(target['content']['out'])
运行结果:
>>>
请输入您要翻译的中文:我喜欢你
I like you
>>>
学习:
思路:
这次爬虫本质上还是利用url打开网页,但是在爬虫的时候携带了data:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)
,我们看过关于urllib.request
文档后注意到:
- url 可以是 string 或一个 Request 对象。 Request 对象可以通过
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
得到。
>>> req = urllib.request.Request('https://www.baidu.com')
>>> response = urllib.request.urlopen(req)
- 大多数情况下request会返回一个response对象,他的method包括geturl(),info(),getcode(),可以用来获取http相关信息
- 当HTTP携带data时,使用的是post而不是get方法
- data 是由格式要求的:application/x-www-form-urlencoded ,
urllib.parse.urlencode
可以帮我们将key-value的数据转化成该格式字符串
伪造请求报文(我是这样理解的):
首先我们需要找到url和data的格式,这里使用的是金山词典,报文简单。有道词典的data部分有点复杂,有些值我找不到方法去伪造。
打开金山词典网页,翻译一句话,利用开发者选项找到post报文:
找到标头中的请求url
找到请求正文即data部分
然而有道词典的data部分是这样的,呵呵,还有时间戳、随机数一堆一堆的
我们利用字典记录data的数据:
data = {}
data['f'] = 'auto'
data['t'] = 'auto'
data['w'] = ’我爱你‘
格式化data为standard format:
data = urllib.parse.urlencode(data).encode('utf-8')
parse解析
parse用法链接
没学,不好解释,下次用的时候补上!
爬虫:
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
爬虫结果实际上是一个字符串:
>>>
>>> response = urllib.request.urlopen(url,data)
>>> html = response.read().decode('utf-8')
>>> print(html)
{"status":1,"content":{"from":"zh-CN","to":"en-US","out":"I love you","vendor":"ciba","err_no":0}}
>>> type(html)
<class 'str'>
>>>
将爬虫结果转为字典,便于我们想要的数据即翻译结果:
target = json.loads(html)
json
JSON本身是一种轻量级的数据交换格式,这里我们利用python中内置的module实现对字符串中的内容进行读取。
没学,不好解释,下次用的时候补上
>>>
>>> target = json.loads(html)
>>> print(target)
{'status': 1, 'content': {'err_no': 0, 'out': 'I love you', 'from': 'zh-CN', 'to': 'en-US', 'vendor': 'ciba'}}
>>> type(target)
<class 'dict'>
>>>
输出翻译结果
print(target['content']['out'])
当然,你也可以用字符串查找之类的,不过太麻烦了
备注_学习来源:
-哔哩哔哩:[小甲鱼]零基础入门学习Python