抓取国家统计局区划、城乡划分代码的简易python爬虫实现
免责声明
本篇文章仅用于学习交流,并不针对任何网站、软件、个人。
概要说明
本篇文章介绍一个简易python爬虫的开发,对国家统计局区划、城乡规划代码进行抓取。
所谓简易,一方面是因为是单线程爬虫,不涉及python的多进程、多线程编程,另一方面是因为不包括“URL管理器”的模块(负责存储已爬取、未爬取的url序列,控制爬虫不多爬、不漏爬),而是用了循环体的结构,依次爬取省、市、区、街道的页面。
爬虫主要分为4个模块:
1. 主控制器(spider_main.py),负责对其他模块进行调用,控制整个爬取过程
2. 下载器(html_downloader.py),负责请求指定的url,将响应结果返回主控制器
3. 解析器(html_parser.py),负责调用beautifulsoup4对请求到的html代码进行解析,拼装需要的数据集合
4. 数据库控制器(mysql_handler.py),负责执行数据库操作
前置条件
- python3.5.2
- mysql
- beautifulsoup4
- pymysql
主控制器(spider_main.py)
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from mysql_handler import MysqlHandler
from html_downloader import HtmlDownloader
from html_parser import HtmlParser
import traceback
class CodeSpider(object):
def __init__(self):
# 实例化其他模块类
self.mysql_handler = MysqlHandler()
self.html_downloader = HtmlDownloader()
self.html_parser = HtmlParser()
# 爬取起点url
self.root_url = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/index.html'
# 用于后续url的拼接
self.split_url = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/'
# 省页面列表
self.province_url_list = []
# 市页面列表
self.city_url_list = []
# 区页面列表
self.county_url_list = []
# 乡镇、街道页面列表
self.town_url_list = []
def craw(self):
try:
# 记录正在下载、解析的url,便于分析错误
downloading_url = self.root_url
html_content = self.html_downloader.download(downloading_url)
# 第一个参数:需要解析的html代码
# 第二个参数:用于url拼接的url
self.province_url_list = self.html_parser.province_parser(html_content, self.split_url)
for province_name, province_url, province_code in self.province_url_list:
# 第一个参数:1-插入一个省数据;2-市数据;3-区数据;4-乡镇街道数据
# 第二个参数:省市区街道名称
# 第三个参数:上级的id,注意省没有上级id
# 第四个参数:市区街道的行政区划编码
province_id = self.mysql_handler.insert(1, province_name, None, None)
# 记录正在下载、解析的url,便于分析错误
downloading_url = province_url
html_content = self.html_downloader.download(downloading_url)
self.city_url_list = self.html_parser.city_parser(html_content, self.split_url)
for city_name, city_url, city_code in self.city_url_list:
city_id = self.mysql_handler.insert(2, city_name, province_id, city_code)
# 例如直辖市没有下级页面
if city_url is None:
continue
# 记录正在下载、解析的url,便于分析错误
downloading_url = city_url
html_content = self.html_downloader.download(downloading_url)
self.county_url_list = self.html_parser.county_parser(html_content, self.split_url + province_code +