前言:
网络爬虫的学习源于2017年4月份,是为了参加广东省第五届《泰迪杯》数据挖掘的比赛。虽然比赛成绩不怎么样,但是网络爬虫却成为了我课余研究的小课题。这篇利用正则表达式匹配爬取糗事百科,并将指定数据导入MongoDB数据库的代码是很久前完成的。今天无意又见,就留心为它们记录下,也与大家相互指导。
–-----------------------------------------------------------------------------—----------------------------------------
–-----------------------------------------------------------------------------—----------------------------------------
一、配置环境要求
1、MongoDB数据库的开启
要根据每位伙伴MongoDB数据库安装位置的不同,开启时候导入的位置也有不同。我是将MongoDB数据库安装于D盘,就第二步输入的根目录不同。开启步骤如下:
- 打开命令行程序(win+R),输入cmd
- 依次输入: d: (根据MongoDB数据库安装的根目录)
- cd mongodb\bin
- 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()函数的具体解析
- 传入一个网页的URL;
- 尝试用requests库中的get方法打开URL,得到返回值,存放在response中
- 判断返回值中的网页状态码是否等于200。(等于200说明访问成功)
- 如果访问成功,返回这个网页所有的页面信息
- 如果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框架简单介绍
–-----------------------------------------------------------------------------—----------------------------------------