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 httplib,smtplib使用方法
Sep 06 Python
python构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
python3.3教程之模拟百度登陆代码分享
Jan 16 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
python多线程并发实例及其优化
Jun 27 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
Python存储读取HDF5文件代码解析
Nov 25 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 得到根目录的 __FILE__ 常量
2008/07/23 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php跨站攻击实例分析
2014/10/28 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
php实现登录页面的简单实例
2019/09/29 PHP
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
和孩子一起学习python之变量命名规则
2018/05/27 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
优秀学生党员先进事迹材料
2014/05/29 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
详解Redis复制原理
2021/06/04 Redis
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
Oracle 多表查询基本语法实例
2022/04/18 Oracle