实战之用 Python 写一个简易爬虫
爬虫简介
网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
通俗解释:
互联网存在大量网页,这些网页作为信息的载体包含大量的数据,通过一定技术,我们可以设计一种程序来自动访问网页,并提取网页中的数据,这便是狭义的网络爬虫。
设计一个简易的爬虫爬取严选 Chat 基本信息
首先来看一下,我们要爬取的网页长什么样子。
从页面中可以看出,每场 Chat 都包含四种信息:Chat 标题、Chat 简介、作者简介及订阅人数。本节将设计一个简易的爬虫程序,爬取这些信息,并将爬取到的信息写入 Excel 文件。
根据设计目标,我们可以列出以下基本步骤:
- 获取网页;
- 解析网页,提取我们需要的信息;
- 将提取出来的信息写入 Excel 文件。
准备工作
Python 工具模块安装
根据上述步骤,我们需要安装必要的工具模块:Requests(获取目标网页)、BeautifulSoup(提取网页信息)、xlwt(将信息写入 Excel 文件)。模块的安装比较简单,建议采用 Python pip 工具,使用简单的命令便可以完成安装,如:
pip install requests
pip install beautifulsoup4
pip install xlwt
网页元素分析
严选 Chat 网页中有大量的元素,而我们需要提取的信息只是其中一部分,因此,我们需要找到筛选特征,将有效信息筛选出来。采用 Chrome 浏览器,右键要查看的元素,选择检查,如下所示:
很明显,通过特定标签和属性就可以筛选出本页的最热 Chat。其中,可作为筛选条件的标签有:div 和 span;可作为筛选条件的属性有:class=“col-md-12”
(筛选Chat)、class="chat_info_title"
(Chat标题)、class="chat_info_desc"
(Chat简介)、class="chat_info_author"
(作者简介)、class="chat_count"
(订阅人数)。
编写代码
第一部分,获取网页,代码如下:
#url='http://gitbook.cn/gitchat/hot'
#获取严选Chat网页文本信息
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except Exception as err:
print(err)
第二部分,从网页中提取需要的信息,代码如下:
#通过BeautifulSoup解析网页,提取我们需要的数据
def getData(html):
soup = BeautifulSoup(html, "html.parser")
ChatList=soup.find('div',attrs={'class':'mazi-activity-container item-container chat_view'})
datalist=[]#用于存放提取到全部Chat信息
#遍历每一条Chat
for Chat in ChatList.find_all('div',attrs={'class':'col-md-12'}):
#Chat = Chat1.find('div',attrs={'class':'chat_item'}).gettext()
data = []
#提取Chat标题
chatTile=Chat.find('div',attrs={'class':'chat_info_title'}).getText()
data.append(chatTile)
#提取Chat简介
chatDesc=Chat.find('div',attrs={'class':'chat_info_desc'}).getText()
data.append(chatDesc)
#提取作者简介
authorDesc=Chat.find('span',attrs={'class':'chat_info_author'}).getText()
data.append(authorDesc)
#提取订阅人数
bookingNum=Chat.find('div',attrs={'class':'chat_count'}).getText()
data.append(bookingNum)
datalist.append(data)
print(datalist)
return datalist
第三部分,将信息写入 Excel 文件,代码如下:
#保存数据到Excel中
def saveData(datalist,path):
#标题栏背景色
styleBlueBkg = xlwt.easyxf('pattern: pattern solid, fore_colour pale_blue; font: bold on;'); # 80% like
#创建一个工作簿
book=xlwt.Workbook(encoding='utf-8',style_compression=0)
#创建一张表
sheet=book.add_sheet('严选ChatTop20',cell_overwrite_ok=True)
#标题栏
titleList=('Chat标题','Chat简介','作者简介','订阅人数')
#设置尺寸
for i in range(0,4):
sheet.col(i).width=180*100
#写入标题栏
for i in range(0,4):
sheet.write(0,i,titleList[i], styleBlueBkg)
#写入Chat信息
for i in range(0,len(datalist)):
data=datalist[i]
for j in range(0,4):
sheet.write(i+1,j,data[j])
#保存文件到指定路径
book.save(path)
完整代码及运行结果
# -*- coding: UTF-8 -*
import requests
from bs4 import BeautifulSoup
import xlwt
#获取网页文本信息
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except Exception as err:
print(err)
#通过BeautifulSoup解析网页,提取我们需要的数据
def getData(html):
soup = BeautifulSoup(html, "html.parser")
ChatList=soup.find('div',attrs={'class':'mazi-activity-container item-container chat_view'})
datalist=[]#用于存放提取到全部Chat信息
#遍历每一条Chat
for Chat in ChatList.find_all('div',attrs={'class':'col-md-12'}):
#Chat = Chat1.find('div',attrs={'class':'chat_item'}).gettext()
data = []
#提取Chat标题
chatTile=Chat.find('div',attrs={'class':'chat_info_title'}).getText()
data.append(chatTile)
#提取Chat简介
chatDesc=Chat.find('div',attrs={'class':'chat_info_desc'}).getText()
data.append(chatDesc)
#提取作者简介
authorDesc=Chat.find('span',attrs={'class':'chat_info_author'}).getText()
data.append(authorDesc)
#提取订阅人数
bookingNum=Chat.find('div',attrs={'class':'chat_count'}).getText()
data.append(bookingNum)
datalist.append(data)
print(datalist)
return datalist
#保存数据到Excel中
def saveData(datalist,path):
#标题栏背景色
styleBlueBkg = xlwt.easyxf('pattern: pattern solid, fore_colour pale_blue; font: bold on;'); # 80% like
#创建一个工作簿
book=xlwt.Workbook(encoding='utf-8',style_compression=0)
#创建一张表
sheet=book.add_sheet('严选ChatTop20',cell_overwrite_ok=True)
#标题栏
titleList=('Chat标题','Chat简介','作者简介','订阅人数')
#设置尺寸
for i in range(0,4):
sheet.col(i).width=180*100
#写入标题栏
for i in range(0,4):
sheet.write(0,i,titleList[i], styleBlueBkg)
#写入Chat信息
for i in range(0,len(datalist)):
data=datalist[i]
for j in range(0,4):
sheet.write(i+1,j,data[j])
#保存文件到指定路径
book.save(path)
#网页地址
chatUrl='http://gitbook.cn/gitchat/hot'
html=getHTMLText(chatUrl)
datalist=getData(html)
saveData(datalist,str("D:/Python/topChat/topChat.xls"))
运行结果: