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中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
Python贪心算法实例小结
Apr 22 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
Python如何计算语句执行时间
Nov 22 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
Django数据统计功能count()的使用
Nov 30 Python
用Python提取PDF表格的方法
Apr 11 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
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
使用js实现数据格式化
2014/12/03 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
通过Python来使用七牛云存储的方法详解
2015/08/07 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python Flask-web表单使用详解
2017/11/18 Python
详解python算法之冒泡排序
2019/03/05 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
《尊严》教学反思
2014/02/11 职场文书
领导调研接待方案
2014/02/27 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
导游词欢迎词
2015/02/02 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers