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 相关文章推荐
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
Python selenium如何设置等待时间
Sep 15 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
基于python实现简单日历
Jul 28 Python
python实现简易数码时钟
Feb 19 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
Python 单例设计模式用法实例分析
Sep 23 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
深入解析NumPy中的Broadcasting广播机制
May 30 Python
浅析Django接口版本控制
Jun 26 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中Session可能会引起并发问题
2015/07/23 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python3调用R的示例代码
2018/02/23 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
复核员上岗演讲稿
2014/01/05 职场文书
风险评估实施方案
2014/03/09 职场文书
个人存款证明书
2014/10/18 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL