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