Python3爬虫全国地址信息


Posted in Python onJanuary 05, 2019

PHP方式写的一团糟所以就用python3重写了一遍,所以因为第二次写了,思路也更清晰了些。

提醒:可能会有502的错误,所以做了异常以及数据库事务处理,暂时没有想到更好的优化方法,所以就先这样吧。待更懂python再进一步优化哈

欢迎留言赐教~

#!C:\Users\12550\AppData\Local\Programs\Python\Python37\python.exe
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pymysql
import urllib.request
import re
from urllib.error import URLError, HTTPError
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='root', db='test', charset='utf8')
db = conn.cursor()
curr_url = ''
# 请求网页
def get_html(url):
  global curr_url
  user_agent = 'Mozilla/6.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.6796.99 Safari/537.36'
  response = urllib.request.Request(url)
  response.add_header('User-Agent', user_agent)
  response = urllib.request.urlopen(response)
  html = BeautifulSoup(response.read(), "html.parser", from_encoding='gbk')
  return html
def get_list(url, level=1, pid=0, get_level=2):
  data = [];
  level_arr = {'1': 'provincetr', '2': 'citytr', '3': 'countytr', '4': 'towntr', '5': 'villagetr'}
  try:
    print(url)
    html = get_html(url)
    c_url = url
    tr_list = html.findAll('tr', {'class': level_arr[str(level)]})
    for tr in tr_list:
      region_name, href, page = '', '', ''
      td_list = tr.findAll('td')
      for td in td_list:
        region_name = td.get_text();
        # 判断是否存在该省份
        if (level == 1):
          sql = "select * from region where region_name='" + region_name + "'"
          db.execute(sql)
          exist = db.fetchone()
          if(exist):
            continue
        # 判断是否全数字-非法则跳过
        if (region_name.isdigit()):
          continue
        if (region_name):
          sql = "insert into region(region_name,pid,level,url) value('" + region_name + "','" + str(
            pid) + "','" + str(level) + "','" + url + "')"
          db.execute(sql)
          db.execute('SELECT LAST_INSERT_ID();')
          last_id = db.fetchone()[0]
        if (td.a):
          page = td.a.attrs['href']
          pattern = re.compile(r'\w*.html')
          url = re.sub(pattern, page, c_url)
          if (level <= get_level):
            get_list(url, level + 1, last_id)
      # 每个省份执行完成,则提交
      if (level == 1):
        conn.commit()
    return data;
  except HTTPError as e:
    # 如果有出错,则回滚
    conn.rollback()
    print(e) # HTTP Error 502: Proxy Error
url = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2017/index.html'
get_list(url)
print('执行完成')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python中update的基本使用方法详解
Jul 17 Python
Python中的 sort 和 sorted的用法与区别
Aug 10 Python
基于python调用psutil模块过程解析
Dec 20 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 #Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 #Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 #Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 #Python
django主动抛出403异常的方法详解
Jan 04 #Python
pyspark操作MongoDB的方法步骤
Jan 04 #Python
详解Appium+Python之生成html测试报告
Jan 04 #Python
You might like
PHP中的float类型使用说明
2010/07/27 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
js取得url地址参数实例
2013/02/22 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
工作中常用js功能汇总
2020/11/07 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python Grid使用和布局详解
2018/06/30 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
Android笔试题总结
2014/11/29 面试题
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
小学一年级评语大全
2014/04/22 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
MYSQL 表的全面总结
2021/11/11 MySQL