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功能键的读取方法
May 28 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
python多线程实现TCP服务端
Sep 03 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
关于tf.reverse_sequence()简述
Jan 20 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
python3中确保枚举值代码分析
Dec 02 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
改造一台复古桌面收音机
2021/03/02 无线电
php adodb介绍
2009/03/19 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
Javascript调用C#代码
2011/01/17 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
金融管理毕业生求职信
2014/03/03 职场文书
党员一句话承诺大全
2014/03/28 职场文书
竞聘书模板
2014/03/31 职场文书
财产保全担保书范文
2014/04/01 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
司法助理专业自荐书
2014/06/13 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
学校运动会报道稿
2014/09/23 职场文书