实战之用 Python 写一个简易爬虫

爬虫简介

网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

通俗解释:

互联网存在大量网页,这些网页作为信息的载体包含大量的数据,通过一定技术,我们可以设计一种程序来自动访问网页,并提取网页中的数据,这便是狭义的网络爬虫。

设计一个简易的爬虫爬取严选 Chat 基本信息

首先来看一下,我们要爬取的网页长什么样子。

python爬虫写入文件 python 写爬虫_Excel

 

从页面中可以看出,每场 Chat 都包含四种信息:Chat 标题、Chat 简介、作者简介及订阅人数。本节将设计一个简易的爬虫程序,爬取这些信息,并将爬取到的信息写入 Excel 文件。

根据设计目标,我们可以列出以下基本步骤:

  • 获取网页;
  • 解析网页,提取我们需要的信息;
  • 将提取出来的信息写入 Excel 文件。

准备工作

Python 工具模块安装

根据上述步骤,我们需要安装必要的工具模块:Requests(获取目标网页)、BeautifulSoup(提取网页信息)、xlwt(将信息写入 Excel 文件)。模块的安装比较简单,建议采用 Python pip 工具,使用简单的命令便可以完成安装,如:

pip install requests

pip install beautifulsoup4

pip install xlwt

网页元素分析

严选 Chat 网页中有大量的元素,而我们需要提取的信息只是其中一部分,因此,我们需要找到筛选特征,将有效信息筛选出来。采用 Chrome 浏览器,右键要查看的元素,选择检查,如下所示:

python爬虫写入文件 python 写爬虫_Excel_02

很明显,通过特定标签和属性就可以筛选出本页的最热 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"))

运行结果:

 

python爬虫写入文件 python 写爬虫_Excel_03