2021兰州疫情-新型冠状病毒疫情实时爬虫

2022-03-22 14:58:19 浏览数 (1)

前言

经过一系列的测试,技术的可行性,这里最终定稿,开始搞爬虫部分,用来爬取数据。

1.MongoDB数据库 这里数据库最终还是敲定了MongoDB,这里先讲一下选择该数据库的原因,随着人工智能和大数据发展,关系型数据库已然很难满足处理海量数据的要求,这里需要一种结构更加简单,并发量更简单并且支持分布式系统的数据库。 MongoDB是一个面向文档存储的非关系性数据库,基于C 开发,该数据库将数据存储为一个文档. 数据结构由“键/值”对(key=>value)组成,字段值可以包含其他文档,数组及文档数组,类似于Json对象,如保存一本书的信息,格式如下:

代码语言:javascript复制
{
    "name":"Scrapy网络爬虫",
    "description":"世荣是个爬虫爱好者",
    "author":["世荣","小李"],
    "price":59
}

这里对比一下SQL和MongoDB的术语不同之处:

安装好之后,把测试好的代码先跑一遍。

2.代码测试

代码语言:javascript复制
import re
import requests
import json
from pymongo import MongoClient
class crawler():
    def __init__(self):
        # 入口url
        self.start_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
        # 构造响应头
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
    (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
        }
        # 初始化MongoDB数据库连接
        self.client = MongoClient()
        self.collection = self.client['test']['covid_19']


    # 请求数据并解析
    def parse(self,url):
        rest = requests.get(url, headers=self.headers)
        return rest.content.decode()

    # 获取数据
    def get_content_list(self,str_html):
        json_html = json.loads(str_html)
        # 获取data对应的数据
        data = json_html['data']
        # 由于data对应的数据是字符串的json数据因此需要进步转换成json数据
        json_data = json.loads(data)

        # 按照省进行分组
        province_list = json_data['areaTree'][0]['children']
        # 遍历省 获取没个省下的区域数据
        for province in province_list:
            # 按照区域进行分组
            area_list = province['children']
            for area in area_list:
                item = {}
                item['省'] = province['name']
                item['市'] = area['name']
                item['现有确诊'] = area['total']['nowConfirm']
                item['累计确诊'] = area['total']['confirm']
                item['治愈人数'] = area['total']['heal']
                item['治愈率'] = area['total']['healRate']
                item['死亡人数'] = area['total']['dead']
                item['死亡率'] = area['total']['deadRate']
                print(item)
                self.save(item)

    # 保存数据
    def save(self,item):
        self.collection.insert(item)

    # 主函数
    def run(self):
        str_html = self.parse(self.start_url)
        self.get_content_list(str_html)

if __name__ == '__main__':
    covid = crawler()
    covid.run()

0 人点赞