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("爬取完毕!")