python爬取国家统计局2019年行政区划分数据mssql
时间:2020-05-30
本文章向大家介绍python爬取国家统计局2019年行政区划分数据mssql,主要包括python爬取国家统计局2019年行政区划分数据mssql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
请安装python3.7版本,更高版本无法使用pymssql包
#!/usr/bin/python # -*- coding: UTF-8 -*- # 功能: 获取省市县数据 # 版本:v1.1 import importlib import sys import pymssql importlib.reload(sys) import requests import lxml.etree as etree import os class chinese_city(): # 初始化函数 def __init__(self): self.trdic = { 1: '//tr[@class="provincetr"]', 2: '//tr[@class="citytr"]', 3: '//tr[@class="countytr"]', 4: '//tr[@class="towntr"]', 5: '//tr[@class="villagetr"]' } def crawl_page(self,url): try: headers = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } html = requests.get(url, headers=headers, timeout=1000) html.encoding = 'gbk' print(str(html.status_code)+url) text = html.text return text except requests.exceptions.RequestException: print('超时'+url) #根据trid 解析子页 def parse(self, trid, pid, url): if url.strip() == '': return None else: html = self.crawl_page(url) tree = etree.HTML(html, parser=etree.HTMLParser(encoding='gbk')) if trid==3: nodes = tree.xpath(self.trdic.get(trid)) if len(nodes)==0: nodes = tree.xpath(self.trdic.get(4)) print('有镇的市:'+url) else: nodes = tree.xpath(self.trdic.get(trid)) path = os.path.basename(url) base_url = url.replace(path, '') values = [] for node in nodes: nexturl = node.xpath('./td[1]/a/@href') if(len(nexturl)>0): code = node.xpath('./td[1]/a/text()') if len(code) == 0: code = node.xpath('./td[1]/text()') name = node.xpath('./td[2]/a/text()') if len(name) == 0: name = node.xpath('./td[2]/text()') value = {} value['url'] = base_url + "".join(nexturl) value['code'] = "".join(code) value['name'] = "".join(name) value['pcode'] = pid value['grade'] = trid value['cat'] = 0 values.append(value) return values #解析社区页 def parseVillager(self, trid, pid, url): if url.strip() == '': return None else: html = self.crawl_page(url) tree = etree.HTML(html, parser=etree.HTMLParser(encoding='gbk')) nodes = tree.xpath(self.trdic.get(trid)) values = [] for node in nodes: code = node.xpath('./td[1]/text()') cate = node.xpath('./td[2]/text()') name = node.xpath('./td[3]/text()') value = {} value['code'] = "".join(code) value['name'] = "".join(name) value['pcode'] = pid value['grade'] = trid value['cat'] = cate values.append(value) return values #插入数据库 def insert_to_db(self, taobao): conn = pymssql.connect( host=r'127.0.0.1', user=r'sa', password='123', database='areadb' ) cursor = conn.cursor() try: param = [] for p in taobao: param.append((p.get("code"), p.get("grade"), p.get("pcode"), p.get("name").strip(),p.get("cat"))) sql = 'INSERT INTO fetch_area VALUES(%s,%d,%s,%s,%d)' cursor.executemany(sql, param) conn.commit() except Exception as e: conn.rollback() print(e) finally: if cursor: cursor.close() if conn: conn.close() #从头执行解析 def parseChineseCity(self): citys = self.parse(2, '520000000000', 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/52.html') if not citys is None: self.insert_to_db(citys) for city in citys: countys = self.parse(3, city['code'], city['url']) if not countys is None: self.insert_to_db(countys) for county in countys: towns = self.parse(4, county['code'], county['url']) if not towns is None: self.insert_to_db(towns) for town in towns: villagers = self.parseVillager(5, town['code'], town['url']) if not villagers is None: self.insert_to_db(villagers) if __name__ == '__main__': chinese_city = chinese_city() chinese_city.parseChineseCity()
创建数据库表
CREATE TABLE [dbo].[fetch_area]( [code] [varchar](16) NULL, [grade] [int] NULL, [pcode] [varchar](16) NULL, [name] [nvarchar](64) NULL, [cat] [int] NULL )
原文地址:https://www.cnblogs.com/hllive/p/12992858.html
- 查找算法的实现(C/C++实现)
- HDU 1495 非常可乐(数论,BFS)
- Selenium2+python自动化74-jquery定位
- 用php实现简单的自制计算器
- Selenium2+python自动化75-Chrome配置加载
- Selenium2+python自动化75-非input文件上传(SendKeys)
- python接口自动化11-post传data参数案例
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
- python接口自动化12-案例分析(csrfToken)
- Python基础学习笔记
- POJ 3278 Catch That Cow(BFS,板子题)
- 【请您听我说】PHP语法特点的一些看法
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
- 查找第k小的元素(O(n)递归解法)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringMVC传递参数乱码解决,web.xml中配置编码过滤器
- SpringMVC中传值有些值为null使用@RequestParam(“name“)解决
- 9.30面试:AOP+事务+JDK动态代理与cglib区别+Spring的aop如何切换底层创建代理对象的方式
- R语言实现基因组的可视化
- Linux实用命令大全(附思维导图)
- 二叉搜索树与python中self参数理解
- 需要了解的Python编码解码知识
- 程序员必备技能之markdown写作
- Python列表操作最全面总结
- Python 0基础开发游戏:打地鼠(详细教程)VS code版本
- Python经典编程题:字符串替换
- Python字典操作总结
- 纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)
- Python正则表达式快速学习
- 如何上传项目到GitHub