【网络爬虫】1:正则表达式匹配爬取糗事百科,并导入MongoDB

前言:

网络爬虫的学习源于2017年4月份,是为了参加广东省第五届《泰迪杯》数据挖掘的比赛。虽然比赛成绩不怎么样,但是网络爬虫却成为了我课余研究的小课题。这篇利用正则表达式匹配爬取糗事百科,并将指定数据导入MongoDB数据库的代码是很久前完成的。今天无意又见,就留心为它们记录下,也与大家相互指导。

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

一、配置环境要求

1、MongoDB数据库的开启

要根据每位伙伴MongoDB数据库安装位置的不同,开启时候导入的位置也有不同。我是将MongoDB数据库安装于D盘,就第二步输入的根目录不同。开启步骤如下:

  1. 打开命令行程序(win+R),输入cmd
  2. 依次输入: d: (根据MongoDB数据库安装的根目录)
  3. cd mongodb\bin
  4. mongod --dbpath=D:\mongodb\db

当最后显示“27017”表示开启成功,如下图:
这里写图片描述

---------------------------------------------------------------------------------------------------------------------

2、运行需要的模块

import re                      #正则表达式模块
import json                    #json格式输出
import requests                #网络爬虫requests库
from requests.exceptions import RequestException

from QSBK import *         #自创模块
import pymongo             #连接MongoDB的模块
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

说明:

  • QSBK自创模块要与连接MongoDB的模块连接使用
  • QSBK自创模块是自己创建的模块,运行时,不与爬取程序写在一起,需要另创建新的Python文件,命名QSBK,写入的代码如下:
MONGO_URL = 'localhost'
MONGO_DB = '糗事百科'
MONGO_TABLE = 'content'

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

二、爬取程序主要说明

1、获取网页源代码

def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

get_one_page()函数的具体解析

  1. 传入一个网页的URL;
  2. 尝试用requests库中的get方法打开URL,得到返回值,存放在response中
  3. 判断返回值中的网页状态码是否等于200。(等于200说明访问成功)
  4. 如果访问成功,返回这个网页所有的页面信息
  5. 如果requests库中的get方法不能打开这个URL,返回报错信息

---------------------------------------------------------------------------------------------------------------------

2、正则表达式匹配指定内容

说明:正则表达式在网络爬虫中运用较为方便,当然也可以用BeautifulSoup方法进行匹配爬取,这里不推荐,因为匹配效果没有正则表达式好。

def parse_one_page(html):
    pattern = re.compile('<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?'
                         + '"stats-vote".*?"number">(\d+)</i>'
                         +'.*?"stats-comments".*?"number">(\d+)</i>',re.S)
    items = re.findall(pattern,html)
    for item in items:
        content = {
            '作者':item[0],
            '内容':item[1],
            '好笑':item[2],
            '评论':item[3]
        }
        print(content)
        save_to_mongo(content)

简单说一下正则表达式怎么做到标准匹配:

重要重要:首先着重说明的是“.*?”(点星问号)可以代表匹配任何字符
重要重要:用括号()括起来的,是我们爬取需要得到的目标项

这里写图片描述

我们为了匹配出上图中的“作者”——“侯志成”,可以看到,这个作者是放在两个标签中间(< h2 >、< /h2 >)。我们要通过必要的标签找到爬取目标项的准确位置,所以“< h2>(.*?)< /h2>”就可以把作者匹配查找出来。“内容”“好笑”“评论”也是这样匹配到的。但要注意,不需要匹配的中间代码,要用"点星问号"过渡。

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

三、源代码与效果展示

1、爬取源代码

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- python3.5

import re             #正则表达式模块
import json           #json格式输出
import requests       #网络爬虫requests库
from requests.exceptions import RequestException

from QSBK import *    #自创模块
import pymongo        #连接MongoDB的模块
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    pattern = re.compile('<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?'
                         + '"stats-vote".*?"number">(\d+)</i>'
                         +'.*?"stats-comments".*?"number">(\d+)</i>',re.S)
    items = re.findall(pattern,html)
    for item in items:
        content = {
            '作者':item[0],
            '内容':item[1],
            '好笑':item[2],
            '评论':item[3]
        }
        print(content)
        save_to_mongo(content)

def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储到mongodb成功',result)
    except Exception:
            print('存储到MongoDB失败',result)

def main():
    url = "https://www.qiushibaike.com/8hr/page/2/"
    html = get_one_page(url)
    parse_one_page(html)
    print ('\n>>>>Well done-------------!')
    
if __name__ == "__main__":
    main()

---------------------------------------------------------------------------------------------------------------------

2、QSBK自建模块代码

MONGO_URL = 'localhost'
MONGO_DB = '糗事百科'
MONGO_TABLE = 'content'

两个代码分开写入两个Python文件(第二个文件名必须是:QSBK),运行爬取代码,就可以爬取到信息:

这里写图片描述

并导入MongoDB数据库中:

这里写图片描述

系列推荐:

【监督学习】1:KNN算法实现手写数字识别的三种方法
---------------------------------------------------------------------------------------------------------------------
【无监督学习】1:K-means算法原理介绍,以及代码实现
【无监督学习】2:DBSCAN算法原理介绍,以及代码实现
【无监督学习】3:Density Peaks聚类算法(局部密度聚类)
---------------------------------------------------------------------------------------------------------------------
【深度学习】1:感知器原理,以及多层感知器解决异或问题
【深度学习】2:BP神经网络的原理,以及异或问题的解决
【深度学习】3:BP神经网络识别MNIST数据集
【深度学习】4:BP神经网络+sklearn实现数字识别
【深度学习】5:CNN卷积神经网络原理、MNIST数据集识别
【深度学习】8:CNN卷积神经网络识别sklearn数据集(附源码)
【深度学习】6:RNN递归神经网络原理、MNIST数据集识别
【深度学习】7:Hopfield神经网络(DHNN)原理介绍
---------------------------------------------------------------------------------------------------------------------
TensorFlow框架简单介绍
---------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值