一个偶然的契机心血来潮想爬爬虫🤧 经过视频学习打下Python和爬虫基础🤥 爬虫主要有三大部分:爬取网页—逐一解析数据—保存数据 废话不多说,说一下我的具体操作流程吧🙊 1、导入需要的模块库
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
2、需要一个主程序入口,且该入口需放置在最后,即定义函数的后面
if __name__=="__main__": #当程序执行时 程序执行入口
#调用函数
main()
3、定义主函数
def main():
url = "https://job.zcmu.edu.cn/news/view/aid/25515/tag/tzgg"
#1、爬取网页 2、解析数据
datalist = getData(url)
savepath = ".\\毕业生提取.xls" # .表示当前文件夹
# 3.保存数据
saveData(datalist[0],datalist[1],datalist[2],savepath)
其中,getData和saveData为自定义的函数。 4、爬取网页信息
#得到指定一个URL的网页内容
def askURL(url):
head={ #模拟浏览器头部信息,向服务器发送消息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53"
} #用户代理,表示告诉该学校网站服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接受什么水平的文件内容) request=urllib.request.Request(url,headers=head)
html=""
try:
response=urllib.request.urlopen(request)
html=response.read().decode("utf-8")
#print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
5、逐一解析数据
#爬取网页
def getData(url):
html=askURL(url) #保存获取到的网页源码
# 2.逐一解析数据 soup=BeautifulSoup(html,"html.parser")
data = [] # 保存所有学院信息
major=[] #保存所有专业信息
stu=[] #保存所有学生人数信息
ss = 1
for item in soup.find_all('td'): #查找符合要求的字符串形成列表
#print(item) #测试:查看item全部信息
item=str(item)
#print(item)
# break
#找到学院
college=re.findall(find1,item) #re库用来通过正则表达式查找指定的字符串
# 找到专业
major1 = re.findall(find21, item)
major2 = re.findall(find22, item)
major3 = re.findall(find23, item)
major4 = re.findall(find24, item)
stus1 = re.findall(find31, item) # 毕业人数
stus2 = re.findall(find32, item)
if (len(college) != 0):
#college=college[0]
if(college[0]=='' or college[0]=='学院'):
continue
data.append(college)
if (len(major1) != 0 and ('老师' not in major1[0])):
major.append(major1) #and ('老师' not in major1[0])
if (len(major2) != 0 and ('老师' not in major2[0])):
major.append(major2)
if (len(major3) != 0):
major.append(major3)
if (len(major4) != 0):
major.append(major4)
if(len(stus1)!=0):
# if (stus1[0]== 58):
# stu.append(stus1)
if(ss==stus1[0]):
continue
ss = stus1[0]
stu.append(stus1)
if (len(stus2) != 0):
if (ss == stus2):
continue
ss = stus2
stu.append(stus2)
return data,major,stu
其中,find1、find21—find24、find31—find32都是定义的全局变量。
#学院
find1=re.compile(r'<td class=.*height=.*style=.*>(.*)</td>',re.S) #创建正则表达式对象,表示规则(字符串的模式)
#专业
find21=re.compile(r'<td class="et5" x:str="">(.*)</td>',re.S) #re.S让换行符包括在字符种
find22=re.compile(r'<td class="et9" x:str="">(.*)</td>',re.S)
find23=re.compile(r'<td class="et6" x:str="">(.*)</td>',re.S)
find24=re.compile(r'<td class="et10" x:str="">(.*)</td>',re.S)
#毕业生人数
find31=re.compile(r'<td class="et5" x:num=.*>(.*)</td>')
find32=re.compile(r'<td class="et6" x:num=.*>(.*)</td>')
我认为解析数据是爬虫中困难的部分,不是说多难,就是很麻烦,还需要足够的细心和找不同的能力以及总结能力。 在解析的过程中,首先需要右键来捕获网页信息,相关代码都在这里,接下来的工作就是分析总结需要的信息部分的代码,再进行网页爬虫编程。 首先,人为的尽可能准确的锁定你要爬取信息所在的位置,观察总结这些代码的规律,提取主要规律,编程代码使接下来数据提取工作只在这一块进行。其次,提取数据时需要用到正则表达式,这里用到的只有(.*),其中.表示匹配任何一个字符,*表示.匹配零次或多次,构建正则表达式模板时,也是需要找到需要提取目标对象在网页代码中的公共部分来构建正则表达式,使re库能找到所有的目标对象。最后,把目标对象存到数组里面,方便之后存到excel表格里。 6、保存数据
#3.保存数据
def saveData(data,major,stu,savepath):
book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建wookbook对象
sheet = book.add_sheet('毕业生提取',cell_overwrite_ok=True) # 创建工作表
col=("学院","专业","人数")
for i in range(0,3):
sheet.write(0,i,col[i]) #列名
for i in range(0,20):
sheet.write(i + 1, 0, data[i])
for i in range(0,46):
sheet.write(i + 1, 1, major[i])
for i in range(0, 45):
sheet.write(i + 1, 2, stu[i])
book.save(savepath) #保存
7、Excel表格结果 可以看到,这个结果不是我想要的
|