刚开始学习爬虫,学了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数据库相关推荐

  1. 免费python课程排行榜-用python爬取2017年中国最好大学排名

    爬取2017年中国最好大学排名 在学习中国大学慕课网的python网络爬虫与信息提取时,有这么一道题,要求我们爬取2016年的中国最好大学排名链接在这,按照题目要求很快便可以爬取到我需要的排名顺序.代 ...

  2. 爬取电影天堂最新电影的名称和下载链接

    此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下: """爬 ...

  3. 爬取电影天堂最新电影(xpath结合lxml)

    完整代码 import requests from lxml import etree from openpyxl import WorkbookBASEURL='https://www.dytt8. ...

  4. 2022年最新全国各省五级行政区划代码及名称数据(省-市-区县-乡镇-村)

    1.数据来源:国家统计局 2.官方更新时间:2021年10月31日 3.数据样例: 包括字段:省份名称.城市代码.城市名称.区县代码.区县名称.乡镇街道代码.乡镇街道名称.居委会村代码.城乡分类代码. ...

  5. python爬虫网页中的图片_Python爬虫爬取一个网页上的图片地址实例代码

    本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request. ...

  6. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  7. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  8. python爬取歌曲_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  9. python爬取音乐排行_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

最新文章

  1. IDEA自定义快捷指令,快捷生成代码、注释
  2. 详解微信域名防封的方法以及检测等工具的技术原理
  3. 用正则表达式替换示例
  4. LeetCode 319. Bulb Switcher--C++,java,python 1行解法--数学题
  5. 工业机器人电柜布线_沙湾附近回收工业锅炉“本信息长期有效”
  6. boost::multi_array模块index_base 修改工具的测试
  7. 进程、线程和协程之间的区别和联系
  8. python算闰年和平年的天数_Python自定义函数计算给定日期是该年第几天的方法示例...
  9. Day5---D4:合规和审计管理
  10. IIS下配置php运行环境
  11. js中自己实现bind函数的方式
  12. 三次握手的第三个ACK包丢了,会发生什么?
  13. Zookeeper的选举机制详解
  14. [Luogu] 模板题-最近公共祖先
  15. Apache MiNa 实现多人聊天室
  16. 大数据技术对企业的影响有哪些
  17. 错误:created a ThreadLocal with key of type ……but failed to remove it when the web application was sto
  18. C++ 标准模板库STL
  19. idea保存快捷键_idea 快捷键
  20. TRUNK 的介绍和配置

热门文章

  1. BULK INSERT如何将大量数据高效地导入SQL Server
  2. SPOJ 10628 Count on a tree 主席树 附数据生成器
  3. RTSP/RTP/RTCP协议流程及分析
  4. 南京信息工程大学python期末考试_考研想考南京信息工程大学怎么样?
  5. Linux下安装和使用杀毒软件AntiVir
  6. 敏捷.敏捷项目管理V2.Jim Highsmith
  7. V神赞许的Aztec,如何让以太坊更隐私?
  8. cpu和gpu已过时,npu和apu的时代开始
  9. AMD意外泄漏下一代APU信息
  10. python12306源码_春运了,Python大神分享爬取12306车票信息的例子,附抢票源码