最近一直在练习英语,感觉水平还是没多大提升,词汇量太少了。 找了好久,也没有让我满意的学单词的地方,终于在新东方上找到了词典。 各种单词都有https://www.koolearn.com/dict/tag_2697_1.html 但是只是列出了单词,单词的翻译要一个一个去查,太慢了。用有道词典去取词,有的时候要么取不到,要么只有一部分,也不是很方便。 于是我想用python爬虫来弄。 爬虫很简单。
可以用xpath来获取
#获取所有word标签
xpath_items = '//a[@class="word"]'
#对每个word标签再提取
xpath_link = './@href'
xpath_title = './text()'
爬虫代码如下:
import requests
from lxml import etree
#请求头和目标网址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
}
url = 'https://www.koolearn.com/dict/tag_2697_2.html'
#第二种写法的 xpath
#获取所有 li标签
xpath_items = '//a[@class="word"]'
#对每个 li标签再提取
xpath_link = './@href'
xpath_title = './text()'
#获取和解析网页
r = requests.get(url, headers=headers,verify=False)
r.encoding = r.apparent_encoding
dom = etree.HTML(r.text)
#获取所有的文章标签
items = dom.xpath(xpath_items)
#分别对每一个文章标签进行操作 将每篇文章的链接 标题 评论数 点赞数放到一个字典里
words = []
for article in items:
t = {}
t['title'] = article.xpath(xpath_title)[0]
if t['title']:
# t['translate']=translate(t['title'])
#t['translate'] = bing_translate(t['title'])
t['translate'] = youdao_translate(t['title'])
t['link'] = "https://www.koolearn.com"+article.xpath(xpath_link)[0]
words.append(t)
如果想将每个单词自动查出来的话,可以用有道翻译的API。我随便在网上找了一段代码,省得自己动手去写。
import urllib.request
import urllib.parse
import json
import re
def translate(content):
# 翻译地址
request_url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# data参数
data = {'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15944508027607',
'sign': '598c09b218f668874be4524f19e0be37',
'ts': '1594450802760',
'bv': '02a6ad4308a3443b3732d855273259bf',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
# headers参数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
# 将data规范化
data = urllib.parse.urlencode(data)
# 转为字节型
data = bytes(data, 'utf-8')
# 创建请求
request = urllib.request.Request(request_url, data, headers=headers)
# 发送请求并获取相应
response = urllib.request.urlopen(request)
# 返回内容,得到一个json字符串
html = response.read().decode('utf-8')
# 将json字符串转为字典
html = json.loads(html)
print(html['translateResult'][0][0]['tgt'])
return html['translateResult'][0][0]['tgt']
然后我存到excel里
import pandas as pd
df =pd.DataFrame(data=words)
# 读取所有Sheet
df1 = pd.read_excel("C:\\work\\english.xlsx", sheet_name=None)
index=len(list(df1))
sheetname="Sheet{}".format(index+1)
writer = pd.ExcelWriter('test_excel.xlsx')
df.to_excel(writer,sheet_name=sheetname)
writer.close()
效果是这样的。
这样学习的时候,一目了然,想看自己记没有的时候,可以将翻译那列隐藏起来。 检查了一下用有道API翻译的效果,只是有些单词翻译不太准,如果想查仔细一点,就可以打开后面的连接。 但是这样用有一个问题,这个接口是限制次数的。用过几次之后,发现怎么都不给我翻译了。然后找了百度翻译API也是如此。 看来白嫖不是那么容易的事情。
后面查了一下,有说可以用bing的接口。
def bing_translate(content):
url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=A4D660A48A6A97CCA791C34935E4C02BBB1BEC1C&from=&to=zh&text={}".format(content)
result = requests.get(url,verify=False)
print(content)
reg = ">(.*?)<"
word = re.search(reg, result.text)
print(word.group(1))
return word.group(1)
使用起来太慢,而且很多都不给翻译。 最后还是用了有道,没有注册的那种:
def youdao_translate(content):
url = "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i={}".format(
content)
result = requests.get(url, verify=False)
result=result.json()
print(result['translateResult'][0][0]['tgt'])
return result['translateResult'][0][0]['tgt']
终于白嫖成功。 这样每次只需要指定这个网站的单词页面的URL,就可以批量捞取单词了。 学一段时间看看,会不会有长进。 这里面还有一个问题,新页面存储的总是把原来的给覆盖掉,怎么写到excel新的sheet中,下回再讲。