1.需要爬取的信息:全部的省份,全部的学校以及其全部专业的院系所和研究方向,以及招生人数和考试科目。
2.使用的库:from bs4 import BeautifulSoup
import requests
import re
from openpyxl import Workbook
3.期望结果:
简介:
该代码是逐步选择所在省市和学科类别,爬取到了招生单位中每个学校的链接。再通过该学校链接获得其考试范围的链接,最后爬取考试范围的链接中包含的我们所需要的信息,信息包括:院系所、专业、研究方向、拟招人数以及考试范围
查找方法:正则表达式
findSchool = re.compile(r'<td class="zsml-summary">(.*)</td>') # 通过正则表达式查找学校和专业信息 findLink1 = re.compile(r'<a href="(.*?)" target="_blank">') #寻找指定学科类别的学校链接 findLink2 = re.compile(r'<a href="(.*?)" target="_blank">') # 通过正则表达式查找该学校全部的考试范围链接 findsubject = re.compile(r'<td>(.*?)<span class="sub-msg">', re.S) #通过正则表达式查找考试科目信息
第一步:先得到招生单位中每个学校的链接
各个省市编号由for进行循环
def Firstlink(furl,yjxkdm):
data = []
SSMD = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43',
'44', '45', '46', '50', '51', '52', '53', '54', '61', '62', '63', '64','65']
for ssdm in SSMD:
form_data = {'ssdm': ssdm, 'dwmc': '', 'mldm': '', 'mlmc': '', 'yjxkdm': yjxkdm, 'zymc': '', 'xxfs': ''}
head = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
"Accept - Language": "zh - CN, zh;q = 0.9",
"Cache - Control": "max - age = 0",
"Connection": "keep - alive",
"Content - Length": "72"
}
html = requests.post(furl, headers=head, data=form_data,verify=False)
soup = BeautifulSoup(html.text, 'lxml')
for item in soup.find_all('table', class_="ch-table"):
item = str(item)
link = re.findall(findLink1, item) #寻找指定学科类别的学校链接
link = [item.replace("&", "&") for item in link]
data.extend(link)
print("正在爬取第%d个学科类别%d市%d专业" % (int(itt)+1,int(ssdm), int(yjxkdm)))
return data
第二步:获得其考试范围的链接
将全部的考试链接用data.extend的存放再link中
def Secondlink(data):
data2 = [];num = 0
for item in data:
surl = baseurl+item
shtml = askURL(surl)
soup = BeautifulSoup(shtml.text, 'lxml')
for item in soup.find_all('table', class_="ch-table more-content"):
item = str(item)
link = re.findall(findLink2, item) # 通过正则表达式查找该学校全部的考试范围链接
num=num+1
print("正在储存第%d个学科类别的第%d个学校全部的考试范围链接" % (itt+1,num))
data2.extend(link)
return data2
第三步:爬取考试范围的链接中包含的我们所需要的信息
将全部的考试范围用data.extend的存放再plist中
def Finddata(data2):
data3 = [];subject1 = [];plist = [];num = 0
for item in data2:
turl = baseurl + item
thtml = askURL(turl)
soup = BeautifulSoup(thtml.text, 'lxml')
for item in soup.find_all('table', class_="zsml-condition"):
item = str(item)
title = re.findall(findSchool, item) #通过正则表达式查找学校和专业信息
data3.append(title)
for item in soup.find_all('tbody', class_="zsml-res-items"):
item = str(item)
subject = re.findall(findsubject, item) # 通过正则表达式查找考试科目信息
for i in subject:
str(i)
subject1.append(i.strip())
plist.extend(subject1)
subject1=[]
num=num+1
print("正在储存第%d个学科类别的第%d个考试范围" % (itt+1,num))
data3.append(plist)
plist = []
return data3
最后一步:保存我们的得到的全部信息
将全部的信息用from openpyxl import Workbook方式再不同的地址中逐个保存,使程序中途被迫停止也可以将前面储存的以xlsx的文件格式保存在当前文件夹
def savedata(data3,savepath):
k = 0
wb = Workbook()
ws = wb.create_sheet('研究生')
ws.append(['学校和专业信息', '考试科目信息'])
lendata4 = len(data3)/2 + 1
for i in range(1, int(lendata4)):
for j in range(1, 3):
data4 = str(data3[k])
ws.cell(i + 1, j).value=data4
k = k + 1
print("正在保存第%d个学科类别的第%d个数据" % (itt+1,k))
wb.save(savepath) # 保存