在上一篇文章 https://blog.csdn.net/xHibiki/article/details/84134554 中,我们介绍了Mongo数据库以及管理工具Studio3T和adminMongo的下载安装,这次,我们结合
Python爬虫
和第三方模块Pymongo
,爬取政府网站:深圳市规划和国土资源委员会(市海洋局),来学习MongoDB数据库和管理工具的的使用方法.
文档型数据库是一类非关系型数据库(NoSQL),MongoDB是其中的一种.区别于传统的数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
在使用前,除了安装MongoDB
和管理工具,另外还需要Pymongo
模块.
只要在命令行中输入:pip3 install pymongo
即可安装Pymongo库.
或者在File–Setting–Project–Project Interpreter中获取
深圳市规划和国土资源委员会(市海洋局)的公告公示:
随便点开一个公告公示的详细页面,
包含了以下部分:
1.标题 2.来源 3.日期 4.正文 5.附件链接(0个或1个)
因为公告公示都是由同一个模板生成的,所以比较好爬取.
爬虫部分比较简单不再赘述.这里使用requests
和lxml
爬取,re
清洗数据,multiprocessing
实现多进程爬虫,共爬取了99页的数据,通过Pymongo
存放到MongoDB
中.
import requests
import re
from lxml import etree
import pymongo
import time
from multiprocessing import Pool
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/67.0.3396.79 Safari/537.36'
}
# MongoDB的连接
client = pymongo.MongoClient('localhost', 27017)
mydb = client['mydb']
publicity = mydb['cn.gov.szpl.publicity']
def get_link(url): # 获取每一页公示的所有链接
res = requests.get(url, headers)
selector = etree.HTML(res.text)
href = selector.xpath('//ul[@class="list-group"]/li/a/@href')
links = []
for i in href:
links.append(re.sub('^.', 'http://www.szpl.gov.cn/xxgk/gggs', str(i)))
return links
def page_scratch(link): # 抓取公示详细页面信息
res = requests.get(link, headers)
res.encoding = res.apparent_encoding # 更改可能的编码方式也可以直接用"GB2312"
selector = etree.HTML(res.text)
# 公示标题
title = selector.xpath('//div[@class="xxym"]/h4/text()')[0]
# 公示来源
source = re.findall('来源:(.*)\n', selector.xpath('//div[@class="xxym"]/h5/text()')[0])[0]
# 公示日期
date = re.findall(' (.*?)\t', selector.xpath('//div[@class="xxym"]/h5/text()')[1])[0]
# 公示内容
article = '\n'.join(selector.xpath('//div[@class="TRS_Editor"]/p/text()'))
# 附件的下载连接
download_link = selector.xpath('//i[@class="fa fa-caret-right"]/a/@href')
if len(download_link) == 0:
appendix = '无'
else:
appendix = re.search('^http(.*)/', res.url)[0] + download_link[0].replace('./', '')
# 保存到MongoDB中
publicity.insert_one({'标题': title, '来源': source, '日期': date, '公示内容': article, '附件链接': appendix})
time.sleep(0.1) # 缓冲
if __name__ == '__main__':
try:
urls = ['http://www.szpl.gov.cn/xxgk/gggs/index.html']
urls.extend(['http://www.szpl.gov.cn/xxgk/gggs/index_{}.html'.format(i) for i in range(1, 99)]) # 所有的网页
links = []
for url in urls:
links.extend(get_link(url))
pool = Pool(processes=4)
pool.map(page_scratch, links)
except:
pass
在管理工具adminMango
可以看到抓取的页面信息已经成功地保存到数据库中
Studio3T
查看MongoDB数据库:
看到共爬取到了1055条数据,一页15条应该是1485条才对,可能出不知道哪里出了错…有空修正一下…
至于在MongoDB对数据的CRUD,下一次有空的时候再来讲吧~
导出数据
也很方便,在adminMongo
中,找到数据库右侧的Export即可导出json
格式的数据
在Studio3T
中,选择上方的Export按钮即可
软件提供了更多的导出选择.