看完这篇文章,你会学到: 1、requests 库的 post 方法; 2、requests 对象的 status_code 属性、.json() 方法; 3、字典的 .get()方法
需求分析
我们要爬取的是 360翻译 。 右键单击网页,选择 ”检查“,或“审查元素”,调出开发者界面。点击选项卡中的“网络”或“Network"。 这里会记录下我们和网页所做的所有请求。
此时我们再点一次”翻译“按钮。 这时候,下面多了几条网络请求。 点击第一条,按下右侧选项卡中的“预览”,发现里面的内容正好是我们所需要的内容。 于是,我们点击右侧选项卡中的“标头”,查看获取这些内容的方式。 可以看到,请求的 url 为 https://fanyi.so.com/index/search 加参数。 请求方法为 post。
接着,我们滑到最下面,查看发送请求所需的参数。 图中的 query 参数即为我们要翻译的内容。
经验证,英→中时,eng 参数为 1,中→英时,eng 参数为 0。不传入参数时即自动判断语言。 而 validate 和 ignore_trans 也都是不必要的参数。
因此,我们只需要传入 query 参数就可以了。
接下来,我们看请求头,也就是 headers。 将请求头全部复制下来,转成字典类型就可以用了。
不过,这么多的请求头太过于冗杂。 经过试验,我发现只有 pro: fanyi 这一项是必须的,缺失会影响信息获取。因此我们只需要传入这一项就可以了。
开始爬取
第一步:导入 requests
import requests
第一步:完善请求信息
url = 'https://fanyi.so.com/index/search'
data = {'query': 'for'}
headers = {
'pro': 'fanyi',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
}
第二步:发出 post 请求
post 请求格式:
requests.post(url, data=None, json=None, **kwargs)
参数 | 说明 |
---|
url | 请求地址 | data | 传送的表单数据,字典类型 | json | 传送的表单数据,字典类型,会被自动编码 | headers | 请求标头 |
>>> response = requests.post(url=url,
data=data,
headers=headers)
>>> response
<Response [200]>
查看响应状态码,若为 200,即为响应成功。
>>> response.status_code
200
第三步:解析响应信息
因为返回的是 json 格式,因此我们要用返回对象的 json()方法解析 json 信息。
>>> response = response.json()
>>> response
{
'data': {
'explain': {
'english_explain': [],
'word': 'for',
'caiyun': {
'info': {
'lbsynonym': ['representing'],
'antonym': [],
'word_exchange': []
}
},
'related_words': ['representing'],
'word_level': ['TEM4', 'CET4'],
'exsentence': [],
'phonetic': None,
'web_translations': [
{
'translation': '补充',
'example': ' 『短语』to work for sb/sth 为…工作...以下省略99字'
}
],
'translation': [
'prep.(表示对象)为,给,对;受雇于;...以下省略288字',
'conj.因为;由于…的缘故;鉴于'
],
'speech': {
'美': '/audio?from=en&to=zh...省略',
'英': '/audio?from=en&to=zh...省略'
}
},
'fanyi': '为了',
'speak_url': {
'speak_url': '/audio?from=en&to=zh...省略',
'tSpeak_url': '/audio?from=en&to=zh...省略',
'word_speak_url': '/audio?from=en&to=zh...省略',
'word_type': 'en2zh'
},
'vendor': 'caiyun'
},
'error': 0,
'msg': 'succ'
}
我们发现,只有其中的一些信息是我们需要的,如翻译、释义和拓展。
翻译:返回字符串。
>>> fanyi = response['data']['fanyi']
>>> fanyi
为了
释义:返回一个列表,包含了不同词性和意思。
>>> means = response['data']['explain']['translation']
>>> means
['prep.(表示对象)为,给,对;受雇于;...以下省略290字', 'conj.因为;由于…的缘故;鉴于']
拓展:返回一个包含 概括:描述 形式字典的列表。
>>> more = response['data']['explain']['web_translations']
>>> more
[{'translation': '补充',
'example': ' 『短语』to work for sb/sth 为…工作 『短语』word for word 逐字地 ...以下省略90字'}]
但是,某些情况不一定以上信息都有,因此我们必须使用字典的 .get() 方法。 方法语法:
dict.get(key, default=None)
key – 字典中要查找的键。 default – 如果指定键的值不存在时,返回该默认值。
fanyi = response.get('data', {}).get('fanyi', '')
means = response.get('date', {}).get('explain', {}).get('translation', [])
more = response.get('date', {}).get('explain', {}).get('web_translation', {})
我们将它包装起来:
完整代码
import requests
datas = {
'query': 'for',
}
headers = {
'pro': 'fanyi',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64',
}
url = 'https://fanyi.so.com/index/search'
def fanyi(self, kw:str):
response = requests.post(url,data=datas,headers=headers)
if response.status_code != 200:
print('Error:', js.status_code)
return
response = response.json()
fanyi = response.get('data', {}).get('fanyi', '')
means = response.get('date', {}).get('explain', {}).get('translation', [])
more = response.get('date', {}).get('explain', {}).get('web_translation', {})
result = {
'fanyi': fanyi,
'means': means,
'more': more,
}
return result
试验:
>>> fanyi('at')
{'fanyi': '在',
'means': [
'prep.(表示位置、地点)在…(里),到…;(表示某人在参与某种活动时)在…...以下省略220字',
'n.阿特(老挝货币单位,100阿特=1基普)'
],
'more': [
{'translation': '形近词',
'example': 'at'},
{'translation': '补充',
'example': " 『短语』to be at it 又来了(表示某人又在做你不喜欢的事)...以下省略25字"}
]
}
>>> fanyi('到达')
{'fanyi': 'Arrive',
'means': {
'[dàodá]': {
'〈动〉': ['arrive (in/at); get to; reach']
}
},
'more': []
}
非常成功!
总结
以上就是这篇文章的全部内容了。
原创不易,如果你觉得这篇文章很有用的话 点赞评论收藏关注再走吧!
yeanky 2021/7/22
|