选择有道翻译是因为相对好爬。
方案一
在词典网页中直接抓取词义。
参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
特点:比较简单易行,不需要涉及与网页的交互。
程序:
# 有道词典 英译汉
# 参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
# 关于re.compile(): https://www.cnblogs.com/nomorewzx/p/4203829.html
import requests # 抓取网页的第三方库
import re # 正则表达式的库
print("来自有道词典,请输入需要查询的英语单词\n")
while (True):
word = input(">>")
url = "http://dict.youdao.com/w/"+word+"/#keyfrom=dict2.top"
html = requests.get(url).content.decode('utf-8') # 访问网址
try:
partlist = re.findall('class="trans-container"(.*?)class="additional"', html, re.S) # 初步筛选
except:
print("没找到\n")
else:
reg1 = '<li>(.*?)</li>' # 模糊匹配,找<li>与</li>中间的部分
reg2 = re.compile(reg1) # 使得匹配更加高效
try:
wordlist = re.findall(reg2, str(partlist[0])) # 那串列表中的第一页是有效的
except:
print("没找到\n")
else:
for x in wordlist:
print(" "+x)
print("\n")
结果图:
另一个程序:
用了爱词霸网。
# 爱词霸词典 英译汉
# 参考资料: https://www.cnblogs.com/nkqlhqc/p/7627581.html
# 关于re.compile(): https://www.cnblogs.com/nomorewzx/p/4203829.html
import requests # 抓取网页的第三方库
import re # 正则表达式的库
print("来自有道词典,请输入需要查询的英语单词\n")
while (True):
word = input(">>")
url = "http://www.iciba.com/"+word
html = requests.get(url).content.decode('utf-8') # 访问网址
try:
partlist = re.findall('<ul class="base-list switch_part" class="">(.*?)</ul>', html, re.S) # 初步筛选
except:
print("没找到\n")
else:
reg1 = '<span>(.*?)</span>' # 模糊匹配,找<li>与</li>中间的部分
reg2 = re.compile(reg1) # 使得匹配更加高效
try:
wordlist = re.findall(reg2, str(partlist))
except:
print("没找到\n")
else:
for x in wordlist:
print(" "+x)
print("\n")
结果图:
PS:程序中缩进太多,不好,python应多使用子函数。
方案二
使用POST向网页发送请求,避开反爬虫使用老版接口,即去掉url中的“_o”。
参考资料:
https://www.cnblogs.com/90zeng/p/python_translation.html(关于在哪里看POST的格式的)
http://blog.csdn.net/nunchakushuang/article/details/75294947(关于反爬虫)
http://blog.csdn.net/snszwh/article/details/78168660(关于老版接口)
特点:使用了POST进行网页交互,但放弃了反爬虫处理。
程序:
# 有道字典 英译汉
# 参考资料1: https://www.cnblogs.com/90zeng/p/python_translation.html
# 参考资料2:http://blog.csdn.net/nunchakushuang/article/details/75294947
# 参考资料3:http://blog.csdn.net/snszwh/article/details/78168660
import urllib.request
import urllib.parse
import json
import time
import random
import hashlib
import re
def get_html(word):
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" # 重点是去掉这里的_o
data = {}
data['i'] = word
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client'] = 'fanyideskweb'
data['salt'] = '1519801903001'
data['sign'] = 'ea1617dd1a4772cd6f47b45bab7c2a0f'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_CLICKBUTTION'
data['typoResult'] = 'false'
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, method='POST')
response = urllib.request.urlopen(request)
result_str = response.read().decode('utf-8')
return result_str
def main():
word = input('>>')
result_str = get_html(word)
target = json.loads(result_str)
trans = re.findall('tgt\': \'(.*?)\'', str(target))
print(" "+ str(trans[0])+"\n")
if __name__ == "__main__":
print("来源:有道词典\n输入需要查询的词\n\n")
while(True):
main()
结果图:
方案三
这是涉及到反爬虫处理的一篇博客:http://blog.csdn.net/shadkit/article/details/79174948