python学习第九节:爬虫实战-抓取地址库

news2024/12/24 9:12:49

python学习第九节:爬虫实战-抓取地址库

在这里插入图片描述
话不多说,直接上代码;下面的代码是从统计局抓取地址库并保存为json格式和excel格式。大家拿到代码直接运行即可。

#coding=utf-8
#加入上面这行代码表示可以在下面代码中包含中文
import bs4  #网页解析,获取数据
import time #引入time模块
import re  #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt # 进行excel操作
import sqlite3 # 进行SQLite数据库操作import
#urllib.parse模块是一个用于解析URL的工具包,支持各种对URL的操作,包括拆分、拼接、编码、解码等。
import urllib.parse
# 解析网页
from bs4 import BeautifulSoup
#定义全局变量
durl="https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/"
file_path="E://地址库"+str(time.time())+".json"
excel_path="E://地址库"+str(time.time())+".xls"

# 爬取网页
def getHtml():
    # 定义全局变量
    response = None
    html = ""
    try:
        # 请求网页
        response = urllib.request.urlopen(durl+"index.html")
        # 获取网页响应内容
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):  # 打印错误状态码
            print(e.code)
        if hasattr(e, "reason"):  # 打印错误问题原因
            print(e.reason)
    # 如果返回状态不是200,说明访问失败
    if response.status != 200:
        print("---访问失败!")
    # 打印读取到的网页内容
    print(html)
    return html

# 解析网页
def paseHtml(html):
    print("*" * 20, "开始解析网页", "*" * 20)
    bs = BeautifulSoup(html, "html.parser")
    # 获取页面中所有tb下的a标签 得到所有省级的a标签
    provinces = bs.select("td > a")
    data = []
    # 循环省级标签
    for provinceTag in provinces:
        name = provinceTag.text
        url = provinceTag.attrs["href"]
        code = re.sub(".html", "", url) + "0000000000"
        print("省级名称:", name, "   url=", url, "   code=", code)
        child = getChild(durl,url)
        d = {
            "code": code,
            "name": name,
            "child": child
        }
        data.append(d)
    return data

#获取子级地址
def getChild(purl,url):
    child = []
    html = ""
    qurl=purl + "" + url
    print("开始获取", qurl, "的信息")
    try:
        # 请求网页
        response = urllib.request.urlopen(qurl)
        # 获取网页响应内容
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        return child
    # 如果返回状态不是200,说明访问失败
    if response.status != 200:
        print("---访问"+url+"失败!")
        return child
    bs = BeautifulSoup(html, "html.parser")
    # 获取页面中所有class=citytr的
    childtrs = bs.select(".citytr,.countytr,.towntr,.villagetr")
    #print("=====",childtrs)
    # 循环标签
    for childtr in childtrs:
        #print("childtr=", childtr)
        url=""
        code=""
        name=""
        #兼容 没得a标签情况 childtr= <tr class="countytr"><td>130101000000</td><td>市辖区</td></tr>
        if len(childtr.find_all("td")[0].find_all("a"))==0:
            if len(childtr.select(".villagetr"))==0: # 说明这不是最后一层
                code = childtr.find_all("td")[0].text
                name = childtr.find_all("td")[1].text
            else:
                code = childtr.find_all("td")[0].text
                name = childtr.find_all("td")[2].text
        else:
            if "href" in childtr.find_all("td")[0].a.attrs:
                url = childtr.find_all("td")[0].a.attrs["href"]
            code = childtr.find_all("td")[0].a.text
            name = childtr.find_all("td")[1].a.text
        #print("name=", name, "  code=", code, "   url=", url)
        child2=[]
        if url!="":
            qurl = qurl[0:qurl.rindex("/")+1]
            child2 = getChild(qurl,url)
        d = {
            "code": code,
            "name": name,
            "child": child2
        }
        child.append(d)
    return child


# 将将数据写入文件
def save_file(data):
    print("*"*20,"开始写入文件","*"*20)
    # 打开文件
    fo = open(file_path,"w",encoding="utf-8") # w表示打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
    # 写入内容
    fo.write(str(data))
    # 关闭文件
    fo.close()
    print("*" * 20, "写入文件完成", "*" * 20)


# 将将数据写入excel
def save_excel(data):
    print("*" * 20, "开始写入excel", "*" * 20)
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象 新建一个工作簿对象
    sheet = book.add_sheet("2024地址库", cell_overwrite_ok=True)  # 创建工作表 cell_overwrite_ok=True 重新写入会自动覆盖之前的内容不会报错
    # 创建表格表头
    col = ("地区代码", "地区名称", "等级", "父级代码")
    for i in range(len(col)):
        sheet.write(0, i, col[i])
    # 插入数据
    i=0
    # 解析省级
    for p in data:
        pcode=p["code"]
        pname=p["name"]
        plevel=1
        pf_code="0"
        pchild=p["child"]
        sheet.write(i + 1, 0, pcode)
        sheet.write(i + 1, 1, pname)
        sheet.write(i + 1, 2, plevel)
        sheet.write(i + 1, 3, pf_code)
        i+=1
        if len(pchild)==0:
            continue
        #解析市级
        for c in pchild:
            ccode = c["code"]
            cname = c["name"]
            clevel = 2
            cf_code = pcode
            cchild = c["child"]
            sheet.write(i + 1, 0, ccode)
            sheet.write(i + 1, 1, cname)
            sheet.write(i + 1, 2, clevel)
            sheet.write(i + 1, 3, cf_code)
            i += 1
            if len(cchild) == 0:
                continue
            # 解析区级
            for d in cchild:
                dcode = d["code"]
                dname = d["name"]
                dlevel = 3
                df_code = ccode
                dchild = d["child"]
                sheet.write(i + 1, 0, dcode)
                sheet.write(i + 1, 1, dname)
                sheet.write(i + 1, 2, dlevel)
                sheet.write(i + 1, 3, df_code)
                i += 1
                if len(cchild) == 0:
                    continue
                # 解析镇级
                for a in dchild:
                    acode = a["code"]
                    aname = a["name"]
                    alevel = 4
                    af_code = dcode
                    sheet.write(i + 1, 0, acode)
                    sheet.write(i + 1, 1, aname)
                    sheet.write(i + 1, 2, alevel)
                    sheet.write(i + 1, 3, af_code)
                    i += 1
    book.save(excel_path)
    print("*" * 20, "写入excel完成", "*" * 20)


def run():
    html = getHtml()# 爬取网页
    data=paseHtml(html) # 解析网页
    save_file(data) #将数据存入文件
    save_excel(data) # 将数据写入excel


if __name__ == '__main__':
    run()
    print("爬虫结束")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wopop靶场漏洞挖掘练习

一、sql注入漏洞 1.在搜索框输入-1 union select 1,2,3# 可以看到页面有回显 2.查询数据库名 -1 union select 1,2,database()# 3.通过查询admin表的数据可以进行登录后台 -1 union select 1,2,group_concat(user_name,user_pass) from admin# 二、文件上传漏洞 1.登录后台…

李龙受邀参加济南高新区“质量月”能力提升活动,并做专题培训

9月11日&#xff0c;济南高新区在山东省知识产权公共服务平台举行2024年“质量月”启动仪式暨质量管理能力提升系列活动。安畅检测首席技术专家李龙先生出席了“质量月”启动仪式 &#xff0c;并为到场企业代表就信创产业相关知识做了专题培训。 济南市市场监督管理局党组成员王…

101.游戏安全项目-创建人物对象结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;100.游戏安全项目-不可见数据的搜索 以 98.游戏的启动与多开-分析与实现多开器 它的代码…

7.sklearn-逻辑回归、精确率和召回率、ROC曲线和AUC指标

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.逻辑回归1.1 API介绍1.2 代码实现1.3 运行结果 2.分类评估方法2.1 精确率(Precision)2.2 召回率(Recall)2.3 F1-score2.4 分类评估报告api2.5 代码工程2.6 运行结果 3.ROC曲线与AUC指标3.1 TPR和FPR3.2 ROC曲线3.3 A…

2024年宠物空气净化器选购攻略?哪款最值得买

表妹在去年刚上大学就养了一只爱掉毛的银渐层&#xff0c;宿舍矛盾不断激化&#xff0c;甚至一度产生了退学的念头。 究其原因&#xff0c;主要是她觉得刚进大学太孤独和身边的人都不太熟&#xff0c;所以就不想聊天&#xff0c;为了缓解这种孤独养了一只银渐层&#xff0c;有…

用 nextjs 创建 Node+React Demo

1、环境准备 1、安装Node 访问Node官网下载对应Node版本&#xff1a;Node官网&#xff0c;安装成功后通过命令查看当前node版本 node -v2、安装Node版本管理工具nvm 如果nvm install 安装node失败&#xff0c;一般是网络问题&#xff0c;可以用手机热点或者翻墙 # 安装nvm c…

ssm“健康早知道”微信小程序 LW PPT源码调试讲解

第二章开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个“健康早知道”微信小程序。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2…

通义灵码获得国产 AI 编码工具最高成绩丨阿里云云原生 8 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; Gartner 首次发布 AI 代码助手魔力象限&#xff0…

数据链路层/ARP协议

当一个报文需要从一个主机转发到另一个主机的时候&#xff0c;表面上是 IP 报文的跨网络转发&#xff0c;但也并不是直接就将数据报转发到对应的主机了&#xff0c;而是从网络层更下面的数据链路层一跳一跳的转发到下一个链路层&#xff0c;数据链路层实现的是到达短距离目的地…

2024年让你的营销机构省时的18款AI工具

提高效率是经营一家盈利的营销机构的关键。利用AI工具不仅可以提升效率&#xff0c;还能够保持甚至增加团队的工作量和工作质量。 这些都是非常理想的结果。然而&#xff0c;随着越来越多的AI工具问世&#xff0c;从哪里入手呢&#xff1f; 在这里&#xff0c;你会找到一份简…

公司小、资源少?别慌!5招让你有效开展测试工作

在经济环境下行的当下&#xff0c;很多测试人员被迫去一些小公司先渡过难关&#xff0c;但是去小公司做测试往往都会遇到很多问题&#xff0c;除了要给一些开发人员普及测试的概念和流程&#xff0c;而且还要从0-1准备测试资源&#xff0c;因为我就是这么过来的&#xff0c;所以…

【6大设计原则】解锁代码的灵活性:深入解析开闭原则的代码实例与应用

1.引言 在软件开发中&#xff0c;设计模式是解决常见问题的经过验证的解决方案。设计模式不仅提供了一种可复用的设计思路&#xff0c;还有助于提高软件的质量和可维护性。设计模式的六大原则是指导我们进行软件设计的基石&#xff0c;其中开闭原则&#xff08;Open/Closed Pr…

携手科大讯飞丨云衔科技为企业提供全栈AI技术解决方案

作为智能时代的核心驱动力&#xff0c;人工智能不仅重塑了传统行业的面貌&#xff0c;更开辟了全新的经济增长点。科大讯飞以其深厚的技术底蕴和创新能力&#xff0c;持续引领着人工智能领域的发展潮流。云衔科技作为科大讯飞开放平台的AI技术产品线合作伙伴代理商&#xff0c;…

Windows桌面整理软件哪个最好?值得一试的Top10桌面管理软件汇总(全新)

Windows桌面整理软件哪个最好&#xff1f;有时候&#xff0c;桌面上的图标会杂乱无章&#xff0c;让您不知该从何处寻找文件、文件夹或应用程序。通过使用这些桌面图标整理工具&#xff0c;您可以轻松清理多余的图标&#xff0c;并将其分类整理&#xff0c;以便于后续查找。这些…

HTML/CSS/JS学习笔记 Day4(CSS--C1 选择器声明)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day4 内容梳理&#xff1a;…

Arduino IDE离线配置第三方库文件-ESP32开发板

简洁版可以使用uget等&#xff0c;将文件下载到对应文件夹下&#xff0c;然后安装。 esp32之arduino配置下载提速 录屏 Arduino IDE离线配置第三方库文件ESP32 资源 Linux https://download.csdn.net/download/ZhangRelay/89749063 第三方开发板 非默认支持的开发板 linu…

科技前沿:Web3与物联网的智能连接

随着科技的迅速发展&#xff0c;Web3 和 物联网&#xff08;IoT&#xff09; 正在成为推动未来技术创新的两大关键领域。Web3是去中心化互联网的愿景&#xff0c;而物联网通过智能设备的相互连接&#xff0c;构建了一个无缝交互的物理世界。当这两项技术相结合时&#xff0c;它…

C++:const成员函数,初始化列表,static成员,友元

一.const成员函数 概念&#xff1a;将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数放到成员函数参数列表的后面。 在使用成员函数的过程中&#xff0c;我们在函数参数位置是无法显示调用this指针的&#xff0c;但很多函数的使用又不会改变this指针指…

华为大咖说 | 智能时代,为什么“流动性”是生态产业的核心?

本文作者&#xff1a;任旭东&#xff08;华为首席开源联络官&#xff09;全文约4205字&#xff0c;阅读约需9分钟 经济全球化主要表现为全球性或区域性的商品、资本、技术和劳动力等的高度流动性与市场一体化进程&#xff0c;以及由此而导致的商品和要素的价格趋同、交易成本的…

大模型从失败中学习 —— 微调大模型以提升Agent性能

人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时&#xff0c;通常只使用成功的交互轨迹&#xff0c;而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费&#xff0c;也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…