1、爬取网页

本地一共5个页面,故此循环五次获取页面信息,使用BeautifulSoup获取web页面,使用正则表达式获取页面所需信息,通过查看web标签获取数据位置,在爬取数据。把获取的一个页面的所以数据保存至data数组中。当一个页面数据获取完成,在把数据放至datalist中。返回datalist


for i in range(0, 5):  # 调用获取页面信息的函数,5次
    num = i + 1
    file = open("G:/爬虫/网页内容爬取/start=" + str(num) + ".html", "rb")

    html = file.read().decode("utf-8")  # file为str格式故此str(num)
    bs = BeautifulSoup(html, "html.parser")
    data = []  # 保存一个页面的所有信息
    # 分类
    for item in bs.find_all('span', id="catenavi"):
    item = str(item)
    catenavi = re.compile(r'<a .*?>(.*?)</a>')
    cate = re.findall(catenavi, item)[0]
    data.append(cate)
    # 名称
    for item in bs.find_all('div', class_="title_thema"):
    item = str(item)
    doctitle = re.compile(r'<h1 id="doctitle">(.*)</h1>')
    title = re.findall(doctitle, item)[0]
    data.append(title)
    # 编辑者,浏览次数,编辑次数,更新时间
    for item in bs.find_all('div', class_="columns ctxx"):
    item = str(item)
    # print(item)
    # 编辑者
    name = re.compile(r'<dt><a .*? target="_blank">(.*)</a> <em class="f12"><img .*? .*?/> .*?</em></dt>')
    n = re.findall(name, item)
    data.append(n)
    # 浏览次数
    view = re.compile((r'<li><span class="gray">浏览次数:</span>(\d*) 次</li>'))
    v = re.findall(view, item)[0]
    data.append(v)
    # 编辑次数
    editor = re.compile(
    (r'<li><span class="gray">编辑次数:</span>(\d*)次 <a class="clink" .*? target="_blank">历史版本</a></li>'))
    e = re.findall(editor, item)[0]
    data.append(e)
    # 更新时间
    time = re.compile((r'<li><span class="gray">更新时间:</span>(.*)</li>'))
    t = re.findall(time, item)[0]
    data.append(t)
    datalist.append(data)


2、存储数据

数据存储至爬虫,xls表中,先创建workbook对象,在创建工作表, 如果对一个单元格重复操作,会引发error。所以在打开时加cell_overwrite_ok=True解决 ,输入列名col = ("分类", "名称", "编辑者", "浏览次数", "编辑次数", "更新日期")在通过循环把数据写入xls表格中,因为同一个名称的信息可能有多个编辑者信息,故此在编辑者写入表格中先判断编辑者人数大于等于2,就在前面的名字后面加“,”。数据保存至savepath中


book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook,对象style_compression:表示是否压缩
    sheet = book.add_sheet('爬虫', cell_overwrite_ok=True)  # 创建工作表
    col = ("分类", "名称", "编辑者", "浏览次数", "编辑次数", "更新日期")
    for i in range(6):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, 5):
        print("第%d条" % (i + 1))
        data = datalist[i]
        # 编辑者不只一个人,使每个人分开
        l = len(data[2])
        while l >= 2:
            l = l - 2
            data[2][l] = data[2][l-2] + ','
        for j in range(6):
            sheet.write(i + 1, j, data[j])  # 数据
    book.save(savepath)  # 保存


3、全部代码


# -*- coding:utf-8 -*- 

from bs4 import BeautifulSoup
import re    #正则表达式
import xlwt   #进行excel操作

def main():
    file = open("G:/爬虫/网页内容爬取/start=1.html", "rb")
    datalist = getData(file)
    savepath = "爬虫.xls"
    saveData(datalist, savepath)

# 爬取网页
def getData(file):
    datalist = []

    for i in range(0, 5):  # 调用获取页面信息的函数,5次
        num = i + 1
        file = open("G:/爬虫/网页内容爬取/start=" + str(num) + ".html", "rb")

        html = file.read().decode("utf-8")  # file为str格式故此str(num)
        bs = BeautifulSoup(html, "html.parser")
        data = []  # 保存一个页面的所有信息
        # 分类
        for item in bs.find_all('span', id="catenavi"):
            item = str(item)
            catenavi = re.compile(r'<a .*?>(.*?)</a>')
            cate = re.findall(catenavi, item)[0]
            data.append(cate)
        # 名称
        for item in bs.find_all('div', class_="title_thema"):
            item = str(item)
            doctitle = re.compile(r'<h1 id="doctitle">(.*)</h1>')
            title = re.findall(doctitle, item)[0]
            data.append(title)
        # 编辑者,浏览次数,编辑次数,更新时间
        for item in bs.find_all('div', class_="columns ctxx"):
            item = str(item)
            # print(item)
            # 编辑者
            name = re.compile(r'<dt><a .*? target="_blank">(.*)</a> <em class="f12"><img .*? .*?/> .*?</em></dt>')
            n = re.findall(name, item)
            data.append(n)
            # 浏览次数
            view = re.compile((r'<li><span class="gray">浏览次数:</span>(\d*) 次</li>'))
            v = re.findall(view, item)[0]
            data.append(v)
            # 编辑次数
            editor = re.compile(
                (r'<li><span class="gray">编辑次数:</span>(\d*)次 <a class="clink" .*? target="_blank">历史版本</a></li>'))
            e = re.findall(editor, item)[0]
            data.append(e)
            # 更新时间
            time = re.compile((r'<li><span class="gray">更新时间:</span>(.*)</li>'))
            t = re.findall(time, item)[0]
            data.append(t)
            datalist.append(data)

    return datalist

# 存储数据
def saveData(datalist, savepath):
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook,对象style_compression:表示是否压缩
    sheet = book.add_sheet('爬虫', cell_overwrite_ok=True)  # 创建工作表
    col = ("分类", "名称", "编辑者", "浏览次数", "编辑次数", "更新日期")
    for i in range(6):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, 5):
        print("第%d条" % (i + 1))
        data = datalist[i]
        # 编辑者不只一个人,使每个人分开
        l = len(data[2])
        while l >= 2:
            l = l - 2
            data[2][l] = data[2][l-2] + ','
        for j in range(6):
            sheet.write(i + 1, j, data[j])  # 数据
    book.save(savepath)  # 保存

if __name__ == '__main__':
    # 调用函数
    main()
    print("爬取完毕!")