如何爬取考研单词
如何爬取考研词汇及其反义词例句
思路
1. 先找到有考研单词的⽹站,爬取词汇。爬取⽹址:/?action=cours&classid=13
2. 将爬取的词汇放进单词搜索⽹站上检索,爬取其近反义词及其例句。⽹址:dict/
3. 最终保存到json格式的⽂件⾥。
通⽤步骤
1. 导库和头⽂件设置
2. 获取⽹页源代码
3. 进⼊开发者模式寻找爬取数据的规律
4. 保存⽂件
具体步骤
导库和头⽂件设置
import requests # HTTP请求
from bs4 import BeautifulSoup # 解析库,从HTML中提取数据
import os # 系统库
import json # json库
from time import sleep #时间库
headers ={"Ur-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-incure-requests":"1"
}
刘苏曼获取⽹页源代码
# 获取⽹页源代码
def get_html(url):
try:
r = (url=url, headers=headers)
r.rai_for_status()
print("text状态:", r.rai_for_status)
自考法律本科科目except Exception as result:
print("错误原因0:", result)
return''
rai_for_status():
这个⽅法是专门与异常打交道的⽅法,该⽅法有这样⼀个有趣的功能,它能够判断返回的Respon类型状态是不是200。如果是200,他将表⽰返回的内容是正确的,如果不是200,他就会产⽣⼀个HttpError的异常。
我们⽤r.rai_for_status()⽅法,它就可以有效的判断⽹络连接的状态。如果⽹连接出现错误,那么它就会⽤try-except来获取⼀个异常。我们在访问或爬取⽹页过程中,它可能出现的⼀些错误,或者是⽹络不稳定造成的⼀些现象
encoding是从http中的header中的chart字段中提取的编码⽅式,若header中没有chart字段则默认为ISO-8859-1编码模式,则⽆法解析中⽂,这是乱码的原因
apparent_encoding会从⽹页的内容中分析⽹页编码的⽅式,所以apparent_encoding⽐encoding更加准确。当⽹页出现乱码时可以把apparent_encoding的编码格式赋值给encoding。
进⼊开发者模式寻找爬取数据的规律
规律寻找办法:
1. 通过url
2. 通过html结构中元素的相似性
汉语拼音辅导班3. 通过http请求返回数据的连接中找到json格式的响应报⽂(开发者模式中的network)
本例中是使⽤了第⼀第⼆种办法,第三种办法详见:
本例中,通过规律可以发现:
修改url中的cour值可以变换单词列表
所以我们可以通过循环修改cour值来查找不同天数的对应单词
for i in range(1,275):
print(f"正在爬取第{i}个单词⽹页")
url =f'/action=words&class=13&cour={i}'
text = get_html(url)
……
每个单词列表查询html结构会发现单词和翻译都有相似的结构。
我们可以发现,每个单词和意思都在< li>⾥,⽽单词和意思在< li>⾥的< span>⾥
所以我们可以写⼀个get_word函数去获取到span⾥的信息:
# 获取单词和意思
def get_words(text):# 传⼊的text是get_html返回的数据
word_dict =dict()# 创建⼀个字典
soup = BeautifulSoup(text,'lxml')# 解析库
for each in soup.find_all('li'):# 找到所有的li标签
span = each.lect('span')# 在each中寻找span标签
word_dict[span[0].attrs['title']]= span[1].attrs['title']# 产⽣⼀对键值对:键为单词,值为翻译,这两个数据都通过title属性可以找到,所以我们只需要获取不同索引span中的title属性值
return word_dict #返回包含这页所有单词和翻译的字典
爬取完之后我们要将字典中对应的单词放到查词⽹上去⼀个个查询它的近义词。
这⾥采⽤了两种⽅法:
⽅案⼀:先爬取所有的词汇,然后保存。然后将单词从本地取出来放⼊单词搜索⽹站上,⼀个⼀个爬下来,最后再保存。
polynia
⽅案⼆:爬⼀页词汇列表,然后将该页词汇列表⾥的单词放⼊搜索⽹站上搜索,爬取后保存。
这两个⽅法都有利有弊。第⼀次⽤的是⽅案⼀,因为忘记设置sleep,导致爬取速度过快,被封ip了。所以我这次就⽤第⼆种,交替爬取两个⽹站,再设置sleep,降低访问频率。
爬取单词的近义词及其例句
查找相关⽹页的规律:
查看url:发现查询的单词和url相关
查看html⽹页结构寻找例句
可以通过这样的代码寻找【例句】:
div = soup.find('div', class_="layout sort")
for li in div.lect('li'):
)
查看相关单词近反义词(get_word_all函数)(各个单词的近反义词的html结构可能不同):
所以我们需要另外⼀种⽅法
⽐如在< div class=“layout nfo” > ⾥还有< div >,⾥⾯存放的就是【近义词】和【反义词】,那么我们可以通过这个来顺藤摸⽠,直到遇见< ul >节点。然后我们就可以爬到< ul > 节点下的所有< li >⼦节点(check_word函数)
# 获取近反义词的关键函数
def check_word(tag):
soup = BeautifulSoup(str(tag),'lxml')#将tag⾥的数据转换为字符串类型
word_li =[]#因为近反义词不确定是否都有中⽂翻译,所以我们只⽤列表存储英⽂近反义词网上学英语
for i in soup.find_all('li'):#找到ul下的li
strip())#apart
strip():# 那么str.strip()就是把这个字符串头和尾的空格,以及位于头尾的\n \t之类给删掉。
word_li.strip())
return word_li
def get_word_all(word, translate, arch_text):
"""
word: 关键词
translate: word的中⽂意思virginiatech
arch_text:word的爬⾍⽂本
"""
# 创建⼀个字典
word_all_dict =dict()
# word_all_dict[word] = {"translate":"",
# "homoionym":{[英⽂近义单词列表]},
# "antonym":{[英⽂反义单词列表]},
# "ntence":[英⽂句⼦例句]}
word_all_dict[word]={"translate":translate,"homoionym":list(),"antonym":list(),"ntence":list()}
soup = BeautifulSoup(arch_text,'lxml')
# 获取例句
for each in soup.find('div', class_="layout sort").lect('li'):
word_all_dict[word]["ntence"].)
# 爬取近反义词
soup = soup.find('div', class_="layout nfo")
for tmp in soup.lect('div'):
)#【近义词】
if"近义词":
print(tmp)#<div>【近义词】</div>
)#【近义词】
print('______')
ext)#/n
print('---------')
)# 如下截图
雅思听力机经下载
word_all_dict[word]["homoionym"]= check_)
if"反义词":
word_all_dict[word]["antonym"]= check_)
royal什么意思
return word_all_dict
web rvices
保存爬取下来的json
# 保存成json格式
def save_word_json(word, word_dict):
path ='D:/PyCharm 2019.2.6/file/考研'
if not ists(path):#不存在路径就创建
os.makedirs(path)
print("word_dict",word_dict)#结果如下截图
str_dict = json.dumps(word_dict)#json.dumps将⼀个Python数据结构转换为JSON
print("str_dict",str_dict)#结果如下截图
fp =open(path+'Words.json','a+')
fp.write(str_dict)
fp.write('\n')
fp.clo()
print(f"{word}保存成功!")
# 读取加载json⽂件
def load_json():
path ='D:/PyCharm 2019.2.6/file/考研/WordPhonetic.json'
with open(path,'r')as fp:
data = fp.readlines()
for each in data:
word_dict = json.loads(each)#将Json字符串解码成python对象
print(word_dict)
截图:
完整代码
import requests
from bs4 import BeautifulSoup
import os
import enchant
import json
from time import sleep
headers ={"Ur-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-incure-requests":"1"
}
def get_html(url):
try:
r = (url=url,headers=headers)
r.rai_for_status()
print("text的状态:",r.rai_for_status())
return r.text
except Exception as result:
print("错误原因:",result)
return''
# 获取单词和意思
def get_words(text):
word_dict =dict()
soup = BeautifulSoup(text,'lxml')
for each in soup.find_all('li'):
span = each.lect('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'):
strip())
strip():
strip().split())
# word_li.strip().split())
word_li.strip())
return word_li
def get_word_all(word, translate, arch_text):
新概念英语第一册下载"""
word: 关键词
translate: word的中⽂意思
arch_text:word的爬⾍⽂本
"""
# 创建⼀个字典
word_all_dict =dict()
# word_all_dict[word] = {"translate":"",
# "homoionym":{[英⽂单词列表]},
# "antonym":{[英⽂单词列表]},
# "ntence":[英⽂句⼦中⽂翻译]}
word_all_dict[word]={"translate":translate,"homoionym":list(),"antonym":list(),"ntence":list()}