在本文的代码中,python通过调用Windows系统下的COM组件,实现对Excel的自动化操作,并且操作是可视的!你可以清楚地看到python在Excel中所有操作。python+COM组件可以实现在VBA中所有能做的事情,包括调用Excel函数。在使用方式上,python和VBA大同小异,在一些细节上会有些差异。比如,代码调用了一个Excel函数来获取当前表格内的行数,可以看到其调用形式与VBA非常相似。有了COM组件,完全可以用python代替VBA。
本程序使用了requests库和BeautifulSoup库作为爬虫来实现网页信息的爬取,将数据爬取下来之后用正则表达式进行处理,然后填入表格中。爬取内容为全国各省市所有高校的信息,包括校名、主管部门、所在城市、办学层次以及学校官网链接,部门学校无官网网址,故略过。程序运行结束后会在桌面生成一个包含以上信息的表格。
由于COM组件属于Windows系统的API,因此程序只能在Windows环境下使用,否则会报错。
被爬取的网站:http://www.huaue.com/gxmd.htm
这个网站编码比较奇怪,而且在BeautifulSoup中用html.parser这个解析库并不能正确地获取信息,在查看官方文档之后,改用html5lib库来解析才能得到信息。
运行结果如下:
爬虫抓到的部分信息:
将信息存储到Excel表格中:
代码如下:
from win32com.client import Dispatch
import requests
from bs4 import BeautifulSoup
import re
import time
import random
xl=Dispatch("Excel.Application")
save=xl.Workbooks.Add()
xl.Visible=1
xl.Sheets(1).Name="本科"
xl.Worksheets.Add(After=xl.Sheets("本科"))
xl.Sheets(2).Name="专科"
xl.Worksheets.Add(After=xl.Sheets("专科"))
xl.Sheets(3).Name="独立学院"
xl.Worksheets.Add(After=xl.Sheets("独立学院"))
xl.Sheets(4).Name="民办"
xl.Worksheets.Add(After=xl.Sheets("民办"))
xl.Sheets(5).Name="港澳台"
dict_type={
"本科":"hn",
"专科":"zw",
"独立学院":"zg",
"民办":"zz"
}
def get(text,type):
time.sleep(1)
xl.Sheets(type).Cells(1, 1).Value = "所在地"
xl.Sheets(type).Cells(1, 2).Value = "学校名称"
xl.Sheets(type).Cells(1, 3).Value = "主管部门"
xl.Sheets(type).Cells(1, 4).Value = "层次"
xl.Sheets(type).Cells(1, 5).Value = "网址"
dict={}
soup=BeautifulSoup(text,"html5lib")
ress=soup.select("#Change_{} > tbody > tr:nth-of-type(2) > td".format(dict_type[type]))
for res in ress:
schools=[]
details=re.findall('',str(res))
for k in range(0,len(details),2):
try:
s=details[k+1]
if "学" in s:
details.pop(k)
except IndexError:
pass
for m in range(0,len(details)):
if m%2==0:
schools.append(details[m])
infoss=re.findall(' (.*?) http://(.*?)',str(res))
for school,infos,url in zip(schools,infoss,urls):
school=school.split()[-1]
school=school.split(">")[-1]
info=infos.split()
info.append("http://"+url)
print(school,info)
dict[school]=info
#将信息填入表中
i = xl.WorksheetFunction.CountA(xl.Sheets(type).Range("A:A")) + 1#python调用Excel中的函数
i = int(i)
xl.Sheets(type).Cells(i,1).Value=dict[school][1]
xl.Sheets(type).Cells(i,2).Value=school
xl.Sheets(type).Cells(i,3).Value=dict[school][0]
xl.Sheets(type).Cells(i,4).Value=dict[school][2]
xl.Sheets(type).Cells(i,5).Value=dict[school][3]
if __name__=="__main__":
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
#内地
urls = ["http://www.huaue.com/gx{}.htm".format(str(i).zfill(2)) for i in range(1, 32)]
for url in urls:
res = requests.get(url, headers=headers)
res.encoding = "gb2312"
rad = random.randint(5, 10)
time.sleep(rad)
for d in dict_type:
get(res.text,d)
#港澳台
urls = ["http://www.huaue.com/gx{}.htm".format(str(i)) for i in range(32, 35)]
xl.Sheets("港澳台").Cells(1, 1).Value = "学校"
xl.Sheets("港澳台").Cells(1, 2).Value = "网址"
for url in urls:
time.sleep(1)
res = requests.get(url, headers=headers)
res.encoding = "gb2312"
soup=BeautifulSoup(res.text,"html5lib")
res=soup.select('#table7 > tbody > tr > td > table:nth-of-type(1) > tbody > tr:nth-of-type(2) > td > a')
rad = random.randint(5, 10)
time.sleep(rad)
dict={}
details = re.findall('target="_blank">(.*?)', str(res))
for i in range(0,len(details),2):
school=details[i]
url=details[i+1]
dict[school]=url
j = xl.WorksheetFunction.CountA(xl.Sheets("港澳台").Range("A:A")) + 1
j = int(j)
xl.Sheets("港澳台").Cells(j, 1).Value = school
xl.Sheets("港澳台").Cells(j, 2).Value = dict[school]
print(school,url)
save.SaveAs(r'D:\Desktop\全国各省市普通高校名单.xlsx')
xl.Quit()