Python爬虫 获取政府网站公示数据并保存到MongoDB数据库

前言

在上一篇文章 https://blog.csdn.net/xHibiki/article/details/84134554 中,我们介绍了Mongo数据库以及管理工具Studio3T和adminMongo的下载安装,这次,我们结合Python爬虫和第三方模块Pymongo,爬取政府网站:深圳市规划和国土资源委员会(市海洋局),来学习MongoDB数据库和管理工具的的使用方法.

文档型数据库

文档型数据库是一类非关系型数据库(NoSQL),MongoDB是其中的一种.区别于传统的数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。

在使用前,除了安装MongoDB和管理工具,另外还需要Pymongo模块.
只要在命令行中输入:pip3 install pymongo即可安装Pymongo库.
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第1张图片
或者在File–Setting–Project–Project Interpreter中获取

爬取页面

深圳市规划和国土资源委员会(市海洋局)的公告公示:
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第2张图片
随便点开一个公告公示的详细页面,
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第3张图片
包含了以下部分:
1.标题 2.来源 3.日期 4.正文 5.附件链接(0个或1个)
因为公告公示都是由同一个模板生成的,所以比较好爬取.

完整爬虫代码

爬虫部分比较简单不再赘述.这里使用requestslxml爬取,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可以看到抓取的页面信息已经成功地保存到数据库中
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第4张图片
Studio3T
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第5张图片
查看MongoDB数据库:
看到共爬取到了1055条数据,一页15条应该是1485条才对,可能出不知道哪里出了错…有空修正一下…
至于在MongoDB对数据的CRUD,下一次有空的时候再来讲吧~
在这里插入图片描述
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第6张图片
导出数据
也很方便,在adminMongo中,找到数据库右侧的Export即可导出json格式的数据
在这里插入图片描述
Studio3T中,选择上方的Export按钮即可
在这里插入图片描述
Python爬虫 获取政府网站公示数据并保存到MongoDB数据库_第7张图片
软件提供了更多的导出选择.

你可能感兴趣的:(爬虫)