python3爬虫全国地址信息

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(‘执行完成‘)

来源:https://blog.csdn.net/qq_27974479/article/details/85634360

原文地址:https://www.cnblogs.com/qixidi/p/10229236.html

时间: 2024-08-30 14:04:19

python3爬虫全国地址信息的相关文章

python3爬虫-通过requests获取安居客房屋信息

import requests from fake_useragent import UserAgent from lxml import etree from http import cookiejar import re, time import pymysql import random from requests.exceptions import Timeout ua = UserAgent() session = requests.Session() class MyExceptio

python3爬虫中文乱码之请求头‘Accept-Encoding’:br 的问题

当用python3做爬虫的时候,一些网站为了防爬虫会设置一些检查机制,这时我们就需要添加请求头,伪装成浏览器正常访问. header的内容在浏览器的开发者工具中便可看到,将这些信息添加到我们的爬虫代码中即可. 'Accept-Encoding':是浏览器发给服务器,声明浏览器支持的编码类型.一般有gzip,deflate,br 等等. python3中的 requests包中response.text 和 response.content response.content #字节方式的响应体,会

Python3爬虫实战:实战源码+博客讲解

Python Spider 贵有恒,何必三更起五更睡:最无益,只怕一日暴十寒. Python3爬虫实战:实战源码+博客讲解 个人网站 CSDN博客 CSDN爬虫专栏 学习交流群[328127489] 声明 代码.教程仅限于学习交流,请勿用于任何商业用途! 文章首发声明 文章在自己的个人网站首发,其他平台文章均属转发,如想获得最新更新进展,欢迎关注我的个人网站:http://cuijiahua.com/ 目录 爬虫小工具 文件下载小助手 爬虫实战 笔趣看小说下载 百度文库免费文章下载助手_rev1

python3爬虫(4)各种网站视频下载方法

python3爬虫(4)各种网站视频下载方法原创H-KING 最后发布于2019-01-09 11:06:23 阅读数 13608 收藏展开理论上来讲只要是网上(浏览器)能看到图片,音频,视频,都能够下载下来,然而实际操作的时候也是有一定难度和技术的,这篇文章主要讲述各个网站视频资源如何下载. B站视频页面链接: https://www.bilibili.com/bangumi/play/ep118490?from=search&seid=7943855106424547918 首先我们用万能下

【Python3 爬虫】U11_BeautifulSoup4之select和CCS选择器提取元素

目录 1.常用CSS选择器介绍 1.1 标签选择器 1.2 类名选择器 1.3 id选择器 1.4 查找子孙元素 1.5 查找直接子元素 1.6 根据属性查找 2.实战演练:select和css选择器提取元素 2.1 获取所有的p标签 2.2 获取第2个p标签 2.3 获取所有class等于t3的span标签 2.4 获取class为t1的p标签下的所有a标签的href属性 2.5 获取所有的职位信息(文本) 1.常用CSS选择器介绍 以下是一个包含常用类选择器的案例,在案例后有具体的选择器使用

php爬虫抓取信息及反爬虫相关

58爬虫了百姓,赶集和58互爬,最后各种信息相同,都是爬虫后的数据库调用,潜规则啊,几家独大还暗中各种攻击,赶驴网的幽默事例我不想多评价.这个时代是砸.钱*养.钱的时代,各种姚晨杨幂葛优,各种地铁公车广告,各种卫视广告,铺天盖地~~~ 来谈php爬虫抓取信息~~ php爬虫首推Curl函数了,先来认识下它. 0x01.curl扩展的安装: 1.确保php子文件夹ext里面有php_curl.dll(一般都有的,一般配置时候会设置环境变量的) 2.将php.ini里面的;extension=php

Python3 爬虫(八) -- BeautifulSoup之再次爬取CSDN博文

序 我的Python3爬虫(五)博文使用utllib基本函数以及正则表达式技术实现了爬取csdn全部博文信息的任务. 链接:Python3 爬虫(五) -- 单线程爬取我的CSDN全部博文 上一篇,我们学习了BeautifulSoup这样一个优秀的Python库,必须有效利用起来.那么我们就利用BeautifulSoup4重新实现一次爬取csdn博文的任务. 由于我修改了博客配置,首页主题换了一下,我们基于新的主题查看网页,如下图所示: 同样的,确认要提取的信息,以及博文总页数. 分析网页源码

【Python3 爬虫】06_robots.txt查看网站爬取限制情况

大多数网站都会定义robots.txt文件来限制爬虫爬去信息,我们在爬去网站之前可以使用robots.txt来查看的相关限制信息 例如: 我们以[CSDN博客]的限制信息为例子 在浏览器输入:https://blog.csdn.net/robots.txt 获取到信息如下: 从上图我们可以看出: ①该网站无论用户使用哪种代理都允许爬取 ②但是当爬取/css,/images-等链接的时候是禁止的 ③我们可以看到还存在一个网址Sitemap,j具体解析如下: 网站提供的Sitemap文件(即网站地图

python3爬虫--反爬虫应对机制

python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需要考虑以下方面: ①访问终端限制:这种可通过伪造动态的UA实现: ②访问次数限制:网站一般通过cookie/IP定位,可通过禁用cookie,或使用cookie池/IP池来反制: ③访问时间限制:延迟请求应对: ④盗链问题:通俗讲就是,某个网页的请求是有迹可循的,比如知乎的问题回答详情页,正常用户行