爬取2017年底最新中国全国五级行政区划代码省市区县乡镇村MySQL数据库
刚开始学习爬虫,学了pyspider,就想练练手。想到不久前需要一些云南地区的行政数据,还是在网络百度半天才下载的。现在既然会爬虫了,那就自己动手,随时可以用相对新的数据了(因为统计局最新的才更新到2016年)。
行政划分的总体结构是:
省->市(州)->县(区)->乡镇(办事处)->村委会(社区)
- 1
国家统计局的网站基本没有反爬虫,也适合我们新手操作哦!
正式开始编写爬虫的时候还是百度了半天的,中间也走过一点弯路的,其中在把结果写入mysql的过程中有地方会报错:
1、Mysql中文乱码问题:
解决办法就是修改my.ini里的内容(my.ini还是在安装路径下搜索吧),具体添加部分如下:
[client]
default-character-set=utf8
# pipe=# socket=MYSQLport=3306[mysql]
no-beep
default-character-set=utf8
# default-character-set=# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
#
# server_type=3
[mysqld]
character-set-server=utf8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
2、pyspider的config设置问题
按照如下代码新建的config.json文件,同时把文件放在了pyspider(安装好的库文件包)的文件夹下,但是运行pyspider -c config.json all 还是报错找不到路径。
解决办法:在cmd语句切换到pyspider的路径后,再用pyspider -c config.json all。
备注:pyspider的路径…\Lib\site-packages\pyspider
如果嫌麻烦,也可以直接把代码放在crawl_config = {}里边了。
{"taskdb": "mysql+taskdb://root:mysql_2018@127.0.0.1:3306/taskdb","projectdb": "mysql+projectdb://root:mysql_2018@127.0.0.1:3306/projectdb","resultdb": "mysql+resultdb://root:mysql_2018@127.0.0.1:3306/resultdb","message_queue": "redis://127.0.0.1:6379/db","phantomjs-proxy": "127.0.0.1:25555","scheduler" : {"xmlrpc-host": "0.0.0.0","delete-time": 3600},"webui": {"port": 5000,"username": "hawk","password": "mima","need-auth": "true"}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
简述完了,开始我们的爬虫之旅吧!
一、准备工作
1、安装pyspider、pymysql;(不会的请百度python安装模块)
2、新建3个mysql的库,为了防止新建的库不是utf编码的,我们还是用如下语句创建吧。
CREATE DATABASE `taskdb`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci'CREATE DATABASE `projectdb`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci'CREATE DATABASE `resultdb`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci'CREATE TABLE `zones` (
`CodeNo` varchar(20) NOT NULL default '',
`ZoneName` varchar(40) NOT NULL default '',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3、百度学习一下CSS选择器的基本用法(# . : a nth-child),这是解析网页的基本功哦。
4、由于下钻后的网页是使用的相对网址,故需要拼接成一个绝对网址:
from urllib.parse import urljoin
urljoin(self.base_url, 遍历的相对url)
- 1
- 2
二、开始爬虫
pyspider的用法,百度一下就很多,这里不再详述,可以参考这个博客:
https://www.jianshu.com/p/1f166f320c66 。
在新建好的project后,系统会自动生成一个简单的爬虫结构(起始页->index页->detail页)。一开始我就被这个结构框住了,限定了思维。其实,我们完全可以不用管这个结构,主要利用这个调用结果来遍历网址。其他就当一般的python语句来编写了。
for each in response.doc('.citytr').items():self.crawl()
- 1
- 2
注意:行政区域的网页不像一般例子,不存在detail页,因为每一次下钻网页返回的都是table格式的数据,不是返回的明细网页。我一开始就是这样去套这结构,结果就是浪费一些时间。
三、直接上代码
cursor.close()
self.db.close()
注意:这两个地方的语句是我运行完结果后加上去的,为了结束后关闭连接。但是我没有运行测试,如果报错,请删除后运行或者自行修改。
如果还要爬取到最末一级村委会,可以在下边的语句增加一个页面方法即可,具体怎么加?只能劳烦您举一反三了。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-06-01 09:28:18
# Project: zones_yunnanfrom pyspider.libs.base_handler import *
from urllib.parse import urljoin
import pymysqlclass Handler(BaseHandler):#headers\cookies亦可以放入起始设置中crawl_config = {"taskdb": "mysql+taskdb://root:mysql_2018@127.0.0.1:3306/taskdb","projectdb": "mysql+projectdb://root:mysql_2018@127.0.0.1:3306/projectdb","resultdb": "mysql+resultdb://root:mysql_2018@127.0.0.1:3306/resultdb","message_queue": "redis://127.0.0.1:6379/db","phantomjs-proxy": "127.0.0.1:25555","scheduler" : {"xmlrpc-host": "0.0.0.0","delete-time": 3600},"webui": {"port": 5000,"username": "hawk","password": "mima","need-auth": "true"}}#初始化基础页urldef __init__(self):self.base_url = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/53.html'self.db = pymysql.connect(host="localhost",user="root", password="mysql_2018",db="resultdb",port=3306,charset='utf8') #定义一个mysql的insert方法,方便后边写码def insert_zone(self, code, zone_name):try:cursor = self.db.cursor()sql_insert = 'insert into zones(CodeNo,ZoneName) values ("%s","%s")' % (code, zone_name);cursor.execute(sql_insert)self.db.commit()except Exception as e:print(e)self.db.rollback() cursor.close()self.db.close()#crawl的参数:priority值越大越优先;fetch_type='js'即可以js渲染;还有use_agent\headers\cookies\load_images.@every(minutes=24 * 60)def on_start(self):self.crawl(self.base_url, callback=self.city_page)@config(age=10 * 24 * 60 * 60)def city_page(self, response):for each in response.doc('.citytr').items():self.crawl(urljoin(self.base_url, each.find('td a:last-child').attr('href')), callback=self.county_page)code=each.find('td:first-child').text()city=each.find('td:last-child').text()self.insert_zone(code,city)@config(age=10 * 24 * 60 * 60)def county_page(self, response):for each in response.doc('.countytr').items():self.crawl(urljoin(self.base_url, each.find('td a:last-child').attr('href')), callback=self.town_page)code=each.find('td:first-child').text()county=each.find('td:last-child').text()self.insert_zone(code,county)@config(age=10 * 24 * 60 * 60,priority=2)def town_page(self, response):baseurl = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/'for each in response.doc('.towntr').items():#self.crawl(urljoin(baseurl ,each.find('td a:last-child').attr('href')), #callback=self.town_page)code=each.find('td:first-child').text()town=each.find('td:last-child').text()self.insert_zone(code,town)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
四、查看结果
Mysql的查询结果是不会自动返回行号的,得手工添加一个变量:
SELECT @rowno:=@rowno+1 as rowno,r.* from zones r,(select @rowno:=0) t
- 1
爬取2017年底最新中国全国五级行政区划代码省市区县乡镇村MySQL数据库相关推荐
- 免费python课程排行榜-用python爬取2017年中国最好大学排名
爬取2017年中国最好大学排名 在学习中国大学慕课网的python网络爬虫与信息提取时,有这么一道题,要求我们爬取2016年的中国最好大学排名链接在这,按照题目要求很快便可以爬取到我需要的排名顺序.代 ...
- 爬取电影天堂最新电影的名称和下载链接
此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下: """爬 ...
- 爬取电影天堂最新电影(xpath结合lxml)
完整代码 import requests from lxml import etree from openpyxl import WorkbookBASEURL='https://www.dytt8. ...
- 2022年最新全国各省五级行政区划代码及名称数据(省-市-区县-乡镇-村)
1.数据来源:国家统计局 2.官方更新时间:2021年10月31日 3.数据样例: 包括字段:省份名称.城市代码.城市名称.区县代码.区县名称.乡镇街道代码.乡镇街道名称.居委会村代码.城乡分类代码. ...
- python爬虫网页中的图片_Python爬虫爬取一个网页上的图片地址实例代码
本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request. ...
- python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...
想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...
- python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码
首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...
- python爬取歌曲_python爬取网易云音乐热歌榜实例代码
首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...
- python爬取音乐排行_python爬取网易云音乐热歌榜实例代码
首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...
最新文章
- IDEA自定义快捷指令,快捷生成代码、注释
- 详解微信域名防封的方法以及检测等工具的技术原理
- 用正则表达式替换示例
- LeetCode 319. Bulb Switcher--C++,java,python 1行解法--数学题
- 工业机器人电柜布线_沙湾附近回收工业锅炉“本信息长期有效”
- boost::multi_array模块index_base 修改工具的测试
- 进程、线程和协程之间的区别和联系
- python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...
- Day5---D4:合规和审计管理
- IIS下配置php运行环境
- js中自己实现bind函数的方式
- 三次握手的第三个ACK包丢了,会发生什么?
- Zookeeper的选举机制详解
- [Luogu] 模板题-最近公共祖先
- Apache MiNa 实现多人聊天室
- 大数据技术对企业的影响有哪些
- 错误:created a ThreadLocal with key of type ……but failed to remove it when the web application was sto
- C++ 标准模板库STL
- idea保存快捷键_idea 快捷键
- TRUNK 的介绍和配置
热门文章
- BULK INSERT如何将大量数据高效地导入SQL Server
- SPOJ 10628 Count on a tree 主席树 附数据生成器
- RTSP/RTP/RTCP协议流程及分析
- 南京信息工程大学python期末考试_考研想考南京信息工程大学怎么样?
- Linux下安装和使用杀毒软件AntiVir
- 敏捷.敏捷项目管理V2.Jim Highsmith
- V神赞许的Aztec,如何让以太坊更隐私?
- cpu和gpu已过时,npu和apu的时代开始
- AMD意外泄漏下一代APU信息
- python12306源码_春运了,Python大神分享爬取12306车票信息的例子,附抢票源码