013:实战爬取三个翻译网站掌握Ajax表单提交
本篇内容由易到难,涉及到ajax-form表单数据提交及md5解密 一共有三个翻译网络。我们要实现的是找到翻译的接口,打造我们自己的翻译软件。首先是
爬取百度翻译:
打开百度翻译,来获取我们的url
我们先确定我们的url: 经过尝试发现
数据跟随我们的输入同步更新
这个搜索框,是一个ajax请求的form表单
我们打开network 发现了如图几个(XHR)也就是Xml-HttpResponse 打开sug
发现sug最下面有一个formData。 里面的a就是我们在框中输入的a。为了确认我们再次更换搜索值。
这说明sug的url就是我们要找的url。
发现url为:https://fanyi.baidu.com/sug 确定好我们的url之后,开始构建我们的Request。 接口有了,我就直接发代码了。
from urllib import request,parse #导入urllib库
import json #导入json
def translateall(word): #定义一个名为翻译的函数
#模拟浏览器设置请求头
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64)"
" AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/63.0.3239.132 Safari/537.36"
}
#data里面的就是我们要传入的参数
data = {
'kw':word
}
data_str = parse.urlencode(data) #用parse把data转换拼接
url = 'https://fanyi.baidu.com/sug'
req = request.Request(url = url , headers= headers, data = bytes(data_str,encoding='utf-8')) #构造请求体
response = request.urlopen(req).read().decode('utf-8') #请求页面信息
# print(response)
obj = json.loads(response) #把json格式的解码出来
# print(obj)
# print(obj['data'])
for item in obj['data']: #然后截取我们所需的数据
item = item['k']+item['v']
print("------------------------------------------------------------------------------")
print(item)
if __name__ == '__main__':
while True:
word = input("请输入单词:")
translateall(word)
这个案例很简单。接下来我们来爬取下金山词霸。
爬取金山词霸:
首先还是来确定我们要获取信息页面的url。 打开金山词霸网页。金山词霸跟百度翻译很类似。我长话短说。重点放在第三个项目上。好,
观察页面信息
打开network
接口url已经找到。 直接发代码吧,这个跟第一个相似度太高了。 第三个案例才是重点。
from urllib import request,parse
import json
class Translateall():
def __init__(self,word):
self.word = word
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64)"
" AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/63.0.3239.132 Safari/537.36"
}
self.data = {
'f': 'auto',
'a': 'auto',
'w': word
}
def translateall(self):
data_str = parse.urlencode(self.data)
url = 'http://fy.iciba.com/ajax.php?a=fy'
req=request.Request(url =url,headers= self.headers,data= bytes(data_str,encoding='utf-8'))
response = request.urlopen(req).read().decode('utf-8')
obj = json.loads(response)
if obj['status']==0:
item = obj['content']['word_mean']
print(word,":",item)
elif obj['status'] ==1:
item = obj['content']['out']
print(word,":",item)
else:
return word
def run(self):
self.translateall()
if __name__ == '__main__':
while True:
print("----------------欢迎使用金山词霸------------------")
word = input("请输入单词:")
trans=Translateall(word).run()
爬取有道词典:
爬取有道词典的难度算得上是很高了。 下面我来一步一步解析,如何获取我们想要的数据。 打开官网。
来找我们的接口。
发现了url: 我们要通过这个url去获取数据。
Formdata中有一大堆的数据。 通过不断的输入关键词,我们来观察formdata中不同的数据
对比发现,其中有三条数据是一直在改变的。 我们想要构造data,就必须要知道这三条是什么信息。 不要慌,找规律的时候不能着急。 分别把信息提取出来。
通过观察,是不是发现每列的ts和他的salt都很像。就短了一位。
然后每列的salt最前面的数字都是一样的。 根据经验来看,这很有可能是一个时间戳。我们打印一下当前时间。
是不是很像啊
看来着就是一个更改过的时间戳了。
那我们的salt就是: salt = int(time.time() *10000)
而ts比salt少一位。
ts就是: ts= int(time.time() *1000)
还有一条数据需要我们解析。
首先来看这三个sign,除了长度一样外,看起来毫无任何关系。 我们lenth一下长度,发现都是32位的。 而这种类型的很像我们md5中的hash加密 so我们来试试。 构造一个hash函数。 下面编写我们的代码进行尝试:
from urllib import request,parse
import hashlib,time,json
def getMD5(value):
aa = hashlib.md5()
aa.update(bytes(value,encoding="utf-8"))
sign = aa.hexdigest()
return sign
def fanyi():
salt = int(time.time() *10000)
ts = int(time.time() * 1000)
value = "fanyideskweb" + word + str(salt) + "p09@Bn{h02_BIEe]$P^nG"
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
data= {
"i":word,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":salt,
"sign":getMD5(value),
"ts":ts,
"bv":"5933be86204903bb334bf023bf3eb5ed",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false"
}
data_str = parse.urlencode(data)
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
# "Accept - Encoding":"gzip, deflate, br",
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': len(data_str),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=42474381@10.168.1.241; JSESSIONID=aaawRmNTElH3Q4_wUlzKw; OUTFOX_SEARCH_USER_ID_NCOO=1959109122.590772; ___rl__test__cookies=1550905970008',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
req = request.Request(url=url,data=bytes(data_str,encoding='utf-8'),headers=headers)
content = request.urlopen(req).read().decode('utf-8')
content = json.loads(content)
try:
sss = content["translateResult"][0][0]
ddd = content["smartResult"]["entries"]
print(' ',sss["src"],":",sss["tgt"])
# print(' ',str(ddd).replace('\r\n','…').replace("''",''))
for i in ddd:
print(' ',i)
except Exception as e:
print(word)
print()
if __name__ == '__main__':
while True:
print("--------------------欢迎使用有道词典------------------")
word = input("请输入单词:")
fanyi()
ok了
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假