Python3爬虫全国地址信息

yipeiwu_com6年前Python爬虫

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爬取拉勾网职位数据的方法

python爬取拉勾网职位数据的方法

今天写的这篇文章是关于python爬虫简单的一个使用,选取的爬取对象是著名的招聘网站——拉钩网,由于和大家的职业息息相关,所以爬取拉钩的数据进行分析,对于职业规划和求职时的信息提供有很大...

Python 制作糗事百科爬虫实例

Python 制作糗事百科爬虫实例

早上起来闲来无事做,莫名其妙的就弹出了糗事百科的段子,转念一想既然你送上门来,那我就写个爬虫到你网站上爬一爬吧,一来当做练练手,二来也算找点乐子。 其实这两天也正在接触数据库的内容,可以...

使用python实现抓取腾讯视频所有电影的爬虫

用python实现的抓取腾讯视频所有电影的爬虫 # -*- coding: utf-8 -*- import re import urllib2 from bs4import Bea...

python抓取网页中图片并保存到本地

在上篇文章给大家分享PHP源码批量抓取远程网页图片并保存到本地的实现方法,感兴趣的朋友可以点击了解详情。 #-*-coding:utf-8-*- import os import...

python实现知乎高颜值图片爬取

导入相关包 import time import pydash import base64 import requests from lxml import etree from...