前期准备

运行环境:jupyter notebook 或者 pycharm
python版本:python3.x
浏览器:chrome
需要用到的库:

requests
bs4
os
enchant
json
time

可能需要安装的库

pip install requests -i https://pypi.tsinghua.edu.cn/simple
pip install Beautifulsoup4 -i https://pypi.tsinghua.edu.cn/simple
pip install pyenchant -i https://pypi.tsinghua.edu.cn/simple

思路

先找到有考研单词的网站,爬取词汇。
将爬取的词汇放进单词搜索网站上检索,爬取其近反义词及其例句
最终保存到json格式的文件里。

爬取流程

爬取词汇

爬取网址:http://word.iciba.com/?action=courses&classid=13

导入相应的库
import requests
from bs4 import BeautifulSoup
import os
import enchant
import json
from time import sleep
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", "cookie": "UM_distinctid=1785a4cc9f7303-069f2552a41de7-5771031-144000-1785a4cc9f856b", "upgrade-insecure-requests": "1"}
获取网页源代码
# 获取网页源代码
def get_html(url):try:r = requests.get(url=url, headers=headers)r.raise_for_status()print("text状态:", r.raise_for_status)r.encoding = r.apparent_encodingreturn r.textexcept Exception as result:print("错误原因0:", result)return ''
获取单词和意思

这部分是爬取单词的核心部分,我们一步一步分析看看.
打开网址,可以看到这里有一个词汇列表。


按Ctrl+Shitf+i,打开开发者调试页面,按Ctrl+Shift+C,然后将鼠标悬空在列表页面上

可以快速定位到我们需要分析的内容
我们可以发现course_id是有规律的在变化。
我们点开第一个列表

可以看到url里也有一个course,将course=1改成course=2。

我们就跳转到第二页,这个规律就找到了。我们就可以通过遍历的方式爬取所有单词。

接下来就是爬取每一个单词和词汇。
按Ctrl+Shift+i,再定位到某个单词上

可以看到这里有个< li>列表,点开看看里面有什么。


可以看到我们想要的东西就在< span>里(音标在< strong>里, 这里就不爬音标了,想要的可以自行添加代码)。
通过以上分析我们可以得出分析结果:

我们可以通过修改course的值来进行翻页。每个单词和意思都在< li>里,而单词和意思在< li>里的< span>里

所以代码可以如下这样写

# 获取单词和意思
def get_words(text):word_dict = dict()soup = BeautifulSoup(text, 'lxml')for each in soup.find_all('li' ):span = each.select('span')word_dict[span[0].attrs['title']] = span[1].attrs['title']return word_dict

一个小细节
本来可以直接span.text.strip()来获取文本,为什么最终是用了span.arrts[‘title’]来获取文本呢?
看了这图就不言而喻了。

爬取词汇的核心部分解决了,那么就来分析后面该怎么做了。
方案一
先爬取所有的词汇,然后保存。然后将单词从本地取出来放入单词搜索网站上,一个一个爬下来,最后再保存。
方案二
爬一页词汇列表,然后将该页词汇列表里的单词放入搜索网站上搜索,爬取后保存。

这两个方法都有利有弊,因为我都试过了。第一次用的是方案一,因为忘记设置sleep,导致爬取速度过快,被封ip了。所以我这次就用第二种,交替爬取两个网站,再设置sleep,降低访问频率。

爬取单词的近反义词及其例句

网址:http://dict.cn/

随便输入一个单词

可以看到搜索后就是在网址后直接加入被搜索单词,那么这个也可以通过遍历搜索所有单词的近反义词和例句。

分析例句

通过定位可以找到在< div class=“layout sort”>容器里的< ol>下有< li>这< li>里就是例句

核心代码就可以这样写

div = soup.find('div', class_="layout sort")
for li in div.select('li'):print(li.text)
爬取近反义词

定位到近反义词部分

我们仔细分析一下可以发现,近反义词的词汇都在< div class=“layout nfo”>里,近反义词的词汇都存储在各自的< ul>里,如果通过< ul>的位置顺序来判断近反义词,也许会出错。例如data这个单词,只有近义词。

所以我们需要另外一种方法
比如在< div class=“layout nfo”> 里还有< div>,里面存放的就是**【近义词】和【反义词】**,那么我们可以通过这个来顺藤摸瓜,直到遇见< ul>节点。然后我们就可以爬到< ul> 节点下的所有< li>子节点

< li>里还有一个< a>,里面既有英文又有中文,但是good这个单词里的近反义词就没有中文。

所以就需要用列表来存储。

word_li = []
for i in soup.find_all('li'):if i.text.strip():word_li.append(i.text.strip().split())

那么核心部分都分析完了,就要分析存储结构了。

word_all_dict[word] = {"translate":"", "homoionym":{[英文单词列表]}, "antonym":{[英文单词列表]},"sentence":[英文句子中文翻译]}

这是我的存储结构。

开始撸代码

import requests
from bs4 import BeautifulSoup
import os
import enchant
import json
from time import sleep
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", "cookie": "UM_distinctid=1785a4cc9f7303-069f2552a41de7-5771031-144000-1785a4cc9f856b", "upgrade-insecure-requests": "1"}# 获取网页源代码
def get_html(url):try:r = requests.get(url=url, headers=headers)r.raise_for_status()print("text状态:", r.raise_for_status)r.encoding = r.apparent_encodingreturn r.textexcept Exception as result:print("错误原因0:", result)return ''# 获取单词和意思
def get_words(text):word_dict = dict()soup = BeautifulSoup(text, 'lxml')for each in soup.find_all('li' ):span = each.select('span')word_dict[span[0].attrs['title']] = span[1].attrs['title']return word_dict# 获取近反义词的关键函数
def check_word(tag):soup = BeautifulSoup(str(tag), 'lxml')word_li = []for i in soup.find_all('li'):if i.text.strip():word_li.append(i.text.strip().split())return word_lidef get_word_all(word, translate, search_text):"""word: 关键词translate: word的中文意思search_text:word的爬虫文本"""# 创建一个字典word_all_dict = dict()
#     word_all_dict[word] = {"translate":"",
#                            "homoionym":{[英文单词列表]},
#                            "antonym":{[英文单词列表]},
#                            "sentence":[英文句子中文翻译]}word_all_dict[word] = {"translate":translate, "homoionym":list(), "antonym":list(), "sentence":list()}# 制作一碗毒鸡汤soup = BeautifulSoup(search_text, 'lxml')# 获取例句for each in soup.find('div', class_="layout sort").select('li'):word_all_dict[word]["sentence"].append(each.text)# 爬取近反义词soup = soup.find('div', class_="layout nfo")for tmp in soup.select('div'):print(tmp.text)if "近义词" in tmp.text:word_all_dict[word]["homoionym"] = check_word(tmp.next.next.next)if "反义词" in tmp.text:word_all_dict[word]["antonym"] = check_word(tmp.next.next.next)return word_all_dict# 保存成json格式
def save_word_json(word, word_dict):path = 'D:/English/'if not os.path.exists(path):os.makedirs(path)str_dict = json.dumps(word_dict)fp = open(path+'Words.json', 'a+')fp.write(str_dict)fp.write('\n')fp.close()print(f"{word}保存成功!")# 读取加载json文件
def load_json():path = 'D:/English/WordPhonetic.json'with open(path, 'r') as fp:data = fp.readlines()for each in data:word_dict = json.loads(each)print(word_dict)def main():count = 0for i in range(1, 275):print(f"正在爬取第{i}个单词网页")url = f'http://word.iciba.com/?action=words&class=13&course={i}'text = get_html(url)all_word_dict = get_words(text)for word in all_word_dict:print(f"正在爬取第{count+1}个单词:{word}")wurl = 'http://dict.cn/'+wordsearch_text = get_html(wurl)if not search_text:continuetry:word_all = get_word_all(word, all_word_dict[word], search_text)save_word_json(word, word_all)except Exception as result:print(f"{word}保存失败,错误为:", result)sleep(2)count += 1
main()

注意

  1. 需要读取的话就用load_json()函数读取。
  2. 最终爬取的结果会被保存到D:/English/目录下,没有此目录,代码也会自动创建。
  3. 写入模式是追加模式,切不可重复运行,不然内容只会追加,不会覆盖。
  4. 可以修改for i in range(1, 275)里的数字,进行分步爬取。
  5. 可以下载一个Visual Studio Code 软件,打开json文件。
  6. 要花大概两个小时才能运行完

用python爬取考研词汇及其近反义词与例句相关推荐

  1. python爬取考研成绩什么时候出来_Python 爬取揭秘,你的考研调剂对手就有谁?...

    原标题:Python 爬取揭秘,你的考研调剂对手就有谁? [CSDN编者按]考研成绩揭晓后,不少考生都要面临调剂的问题.而宁夏大学曝出的新闻,也让考生对考研额外增加了一份焦虑.那么,在考研调剂中,你的 ...

  2. python爬取考研成绩什么时候出来_用Python爬取了考研吧1000条帖子,原来他们都在讨论这些...

    原标题:用Python爬取了考研吧1000条帖子,原来他们都在讨论这些 写在前面 考研在即,想多了解考研er的想法,就是去找学长学姐或者去网上搜索,贴吧就是一个好地方.而借助强大的工具可以快速从网络鱼 ...

  3. Python爬取考研必备单词

    参考链接:(https://blog.csdn.net/OnlyloveCuracao/art0icle/details/80768334) 原博主的代码可能因为单词发音的音频爬取有问题,导致无法将单 ...

  4. python 爬取英语词汇

    前言:由于写一个小demol需要一些英语四级词汇作为数据,自己动手一个个找太费事所以用python搞了一个小工具用来爬取一些四级词汇,毕竟是第一个爬虫小工具,所以记录下. 首页去找了一下各个网站的词汇 ...

  5. python爬取考研成绩什么时候出来_用Python爬取了考研吧1000条帖子,原来他们都在讨论这些!...

    写在前面 考研在即,想多了解考研er的想法,就是去找学长学姐或者去网上搜索,贴吧就是一个好地方.而借助强大的工具可以快速从网络鱼龙混杂的信息中得到有价值的信息.虽然网上有很多爬取百度贴吧的教程和例子, ...

  6. 用python爬取考研信息网_用Python爬取了考研吧1000条帖子,原来他们都在讨论这些!...

    写在前面 考研在即,想多了解考研er的想法,就是去找学长学姐或者去网上搜索,贴吧就是一个好地方.而借助强大的工具可以快速从网络鱼龙混杂的信息中得到有价值的信息.虽然网上有很多爬取百度贴吧的教程和例子, ...

  7. 用python爬取考研信息网_【高考、考研党的福利】使用Python爬取全国高校及GIS/RS专业信息【附代码和Excel】...

    题外话:前一段时间翻译了一部关于GIS的纪录片,然后发了一篇文章,没想到有这么多人感兴趣,为了让广大GISER知道有这部神片,遂想投稿至GIS相关的专栏,不曾想居然还没人开设,真是"绕树三匝 ...

  8. Python爬取考研数据:所有985高校、六成211高校均可调剂

    又到了一年一度的考研出分时间啦,近期有不少朋友让笔者帮他们分析如何提前做好调剂.复试与调剂总是密不可分.今天,给大家分享一些调剂的重要知识点,希望你在调剂的时候,能明白调剂的趋势与规则. 也许,大家对 ...

  9. Python 爬取考研数据:所有 985 高校、六成 211 高校均可调剂!

    又到了一年一度的考研出分时间啦,近期有不少朋友让笔者帮他们分析如何提前做好调剂.复试与调剂总是密不可分.今天,给大家分享一些调剂的重要知识点,希望你在调剂的时候,能明白调剂的趋势与规则. 也许,大家对 ...

最新文章

  1. DataCleaner 3.1.1 发布,数据质量分析管理
  2. MFC窗体控件随窗体变化
  3. M-point moving-average(M点滑动平均)Matlab 实现
  4. 无线网络拓扑结构简析
  5. 【算法学习】整体二分
  6. 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
  7. 一文理解设计模式之--策略模式(Strategy)
  8. sql取得某日期内的数据
  9. 【Python-2.7】换行符和制表符
  10. JMeter之压力测试
  11. gis怎么提取水系_ArcGIS提取水系并进行生态敏感性分析
  12. Windows xp 驱动EPSON MT532打印小票始末
  13. Unity实现音频播放器[QQ音乐,网易云等效果]
  14. 【Linux】nasm/yasm not found
  15. python神经网络识别验证码_基于卷积神经网络实现验证码识别(一)
  16. mvp关联activity生命周期_极简SaaS创业手册一文读懂SaaS全生命周期阶段
  17. 【Vulkan学习记录-基础篇-1】用Vulkan画一个三角形
  18. TCP 协议(序号和确认号)
  19. java代理模式实现
  20. MYSQL分区表如何保证数据唯一性

热门文章

  1. Juniper SRX NAT46/NAT64配置
  2. 斯坦福大学开源用于网络神经百万量级OGB基准测试的数据集
  3. 计算机书籍推荐 活着,信息朗读者 |《活着》——19级计算机实验班蔺子健
  4. 【旧文回顾】中国太阳能因制造业创新而繁荣
  5. linux脚本编写图形,shell图形化界面脚本实现
  6. Python-在线网页导出为图片或pdf
  7. Codeforces 1379B.Dubious Cyrpto
  8. Python-qqbot实现QQ群翻译机器人
  9. python如何打开npy文件_python实现npy格式文件转换为txt文件操作
  10. 教你如何有效防止DDos攻击?