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轻松实现代码编码格式转换
Mar 26 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python中reduce()函数的使用方法示例
Sep 29 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
在Python中给Nan值更改为0的方法
Oct 30 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python tornado使用流生成图片的例子
Nov 18 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
用python解压分析jar包实例
Jan 16 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 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
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
python的turtle库使用详解
2019/05/10 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
危货运输企业安全生产责任书
2014/07/28 职场文书
悬空寺导游词
2015/02/05 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
城南旧事观后感
2015/06/11 职场文书
五一放假通知怎么写
2015/08/18 职场文书
市级三好生竞选稿
2015/11/21 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
医生行业员工的辞职信
2019/06/24 职场文书