爬虫+COM组件实现Excel操作自动化(python3.6)

在本文的代码中,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库来解析才能得到信息。

运行结果如下:
爬虫抓到的部分信息:
爬虫+COM组件实现Excel操作自动化(python3.6)_第1张图片
将信息存储到Excel表格中:
爬虫+COM组件实现Excel操作自动化(python3.6)_第2张图片
代码如下:

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()

你可能感兴趣的:(爬虫+COM组件实现Excel操作自动化(python3.6))