Python抓取天气信息

news2024/11/17 16:24:47

 Python的详细学习还是需要些时间的。如果有其他语言经验的,可以暂时跟着我来写一个简单的例子。

2024年最新python教程全套,学完即可进大厂!(附全套视频 下载) (qq.com)

  我们计划抓取的数据:杭州的天气信息,杭州天气 可以先看一下这个网站。

  实现数据抓取的逻辑:使用python 请求 URL,会返回对应的 HTML 信息,我们解析 html,获得自己需要的数据。(很简单的逻辑)

 第一步:创建 Python 文件

  

  写第一段Python代码

if __name__ == '__main__':
    url = 'http://www.weather.com.cn/weather/101210101.shtml' 
    print('my frist python file')

  这段代码类似于 Java 中的 Main 方法。可以直接鼠标右键,选择 Run。

  

 第二步:请求RUL

  python 的强大之处就在于它有大量的模块(类似于Java 的 jar 包)可以直接拿来使用。

  我们需要安装一个 request 模块: File - Setting - Product - Product Interpreter

  

  

  点击如上图的 + 号,就可以安装 Python 模块了。搜索 requests 模块(有 s 噢),点击 Install。

  

  我们顺便再安装一个 beautifulSoup4 和 pymysql 模块,beautifulSoup4 模块是用来解析 html 的,可以对象化 HTML 字符串。pymysql 模块是用来连接 mysql 数据库使用的。

  

  

  相关的模块都安装之后,就可以开心的敲代码了。

  定义一个 getContent 方法:

# 导入相关联的包
import requests
import time
import random
import socket
import http.client
import pymysql
from bs4 import BeautifulSoup

def getContent(url , data = None):
    header={
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
    } # request 的请求头
    timeout = random.choice(range(80, 180))
    while True:
        try:
            rep = requests.get(url,headers = header,timeout = timeout) #请求url地址,获得返回 response 信息
            rep.encoding = 'utf-8'
            break
        except socket.timeout as e: # 以下都是异常处理
            print( '3:', e)
            time.sleep(random.choice(range(8,15)))

        except socket.error as e:
            print( '4:', e)
            time.sleep(random.choice(range(20, 60)))

        except http.client.BadStatusLine as e:
            print( '5:', e)
            time.sleep(random.choice(range(30, 80)))

        except http.client.IncompleteRead as e:
            print( '6:', e)
            time.sleep(random.choice(range(5, 15)))
    print('request success')
    return rep.text # 返回的 Html 全文

  在 main 方法中调用:

if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101210101.shtml'
    html = getContent(url) # 调用获取网页信息
    print('my frist python file')

 第三步:分析页面数据

  定义一个 getData 方法:

def getData(html_text):
    final = []
    bs = BeautifulSoup(html_text, "html.parser")  # 创建BeautifulSoup对象
    body = bs.body #获取body
    data = body.find('div',{'id': '7d'})
    ul = data.find('ul')
    li = ul.find_all('li')

    for day in li:
        temp = []
        date = day.find('h1').string
        temp.append(date) #添加日期
        inf = day.find_all('p')
        weather = inf[0].string #天气
        temp.append(weather)
        temperature_highest = inf[1].find('span').string #最高温度,夜间可能没有这个元素,需要注意
        temperature_low = inf[1].find('i').string  # 最低温度
        temp.append(temperature_low)
        temp.append(temperature_highest)
        final.append(temp)
    print('getDate success')
    return final

  上面的解析其实就是按照 HTML 的规则解析的。可以打开 杭州天气 在开发者模式中(F12),看一下页面的元素分布。

 

  在 main 方法中调用:

if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101210101.shtml'
    html = getContent(url)    # 获取网页信息
    result = getData(html)  # 解析网页信息,拿到需要的数据
    print('my frist python file')

数据写入excel

  现在我们已经在 Python 中拿到了想要的数据,对于这些数据我们可以先存放起来,比如把数据写入 csv 中。

  定义一个 writeDate 方法:

import csv #导入包

def writeData(data, name):
    with open(name, 'a', errors='ignore', newline='') as f:
            f_csv = csv.writer(f)
            f_csv.writerows(data)
    print('write_csv success')

  在 main 方法中调用:

if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101210101.shtml'
    html = getContent(url)    # 获取网页信息
    result = getData(html)  # 解析网页信息,拿到需要的数据
    writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中
    print('my frist python file')

  执行之后呢,再指定路径下就会多出一个 weather.csv 文件,可以打开看一下内容。

  

  

  到这里最简单的数据抓取--储存就完成了。

 数据写入数据库

   因为一般情况下都会把数据存储在数据库中,所以我们以 mysql 数据库为例,尝试着把数据写入到我们的数据库中。

 第一步创建WEATHER 表:

  创建表可以在直接在 mysql 客户端进行操作,也可能用 python 创建表。在这里 我们使用 python 来创建一张 WEATHER 表。

  定义一个 createTable 方法:(之前已经导入了 import pymysql 如果没有的话需要导入包)

def createTable():
    # 打开数据库连接
    db = pymysql.connect("localhost", "zww", "960128", "test")
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute("SELECT VERSION()")
    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone()
    print("Database version : %s " % data) # 显示数据库版本(可忽略,作为个栗子)

    # 使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS WEATHER")
    # 使用预处理语句创建表
    sql = """CREATE TABLE WEATHER (
             w_id int(8) not null primary key auto_increment, 
             w_date  varchar(20) NOT NULL ,
             w_detail  varchar(30),
             w_temperature_low varchar(10),
             w_temperature_high varchar(10)) DEFAULT CHARSET=utf8"""  # 这里需要注意设置编码格式,不然中文数据无法插入
    cursor.execute(sql)
    # 关闭数据库连接
    db.close()
  print('create table success')

  在 main 方法中调用:

if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101210101.shtml'
    html = getContent(url)    # 获取网页信息
    result = getData(html)  # 解析网页信息,拿到需要的数据
    writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中
    createTable() #表创建一次就好了,注意
    print('my frist python file')

  执行之后去检查一下数据库,看一下 weather 表是否创建成功了。

  

 第二步批量写入数据至 WEATHER 表:

   定义一个 insertData 方法:

def insert_data(datas):
    # 打开数据库连接
    db = pymysql.connect("localhost", "zww", "960128", "test")
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()

    try:
        # 批量插入数据
        cursor.executemany('insert into WEATHER(w_id, w_date, w_detail, w_temperature_low, w_temperature_high) value(null, %s,%s,%s,%s)', datas)

        # sql = "INSERT INTO WEATHER(w_id, \
        #                w_date, w_detail, w_temperature) \
        #                VALUES (null, '%s','%s','%s')" % \
        #       (data[0], data[1], data[2])
        # cursor.execute(sql)    #单条数据写入

        # 提交到数据库执行
        db.commit()
    except Exception as e:
        print('插入时发生异常' + e)
        # 如果发生错误则回滚
        db.rollback()
    # 关闭数据库连接
    db.close()

  在 main 方法中调用:

if __name__ == '__main__':
    url ='http://www.weather.com.cn/weather/101210101.shtml'
    html = getContent(url)    # 获取网页信息
    result = getData(html)  # 解析网页信息,拿到需要的数据
    writeData(result, 'D:/py_work/venv/Include/weather.csv') #数据写入到 csv文档中
    # createTable() #表创建一次就好了,注意
    insertData(result) #批量写入数据
    print('my frist python file')

  检查:执行这段 Python 语句后,看一下数据库是否有写入数据。有的话就大功告成了。

  

Python学习籽料直接戳:2024年最新python教程全套,学完即可进大厂!(附全套视频 下载) (qq.com)

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

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

相关文章

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…

破除“数据孤岛”新策略:Data Fabric(数据编织)和逻辑数据平台

今天,我们已经进入到一个数据爆发的时代,仅 2022 年,我国数据产量就高达 8.1ZB,同比增长 22.7%,数据产量位居世界第二。数据作为新型生产资料,是企业数智化运营的基础,已快速融入到生产、分配、…

什么是数仓调度?推荐使用这款数据仓库ETL工具

随着企业数据规模的不断增大,如何高效地管理和利用数据成为了企业数字化转型过程中的重要问题。数据仓库作为一种专门用于存储和处理企业数据的技术,已经成为了企业数字化转型过程中不可或缺的一部分。而数仓调度则是数据仓库建设过程中至关重要的一环。…

搭建个人官网时如何配置SMTP邮件自动发送

什么是 SMTP? SMTP( Simple Mail Transfer Protocol ) 是一种简单邮件传输协议,可以在互联网上通过SMTP来发送电子邮件,是建模在 FTP 文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。SMTP 服…

如何准备大模型面试:迈向成功职业道路的关键一步

前言 在当今日新月异的科技领域中,大模型技术正以其卓越的智能和无限的可能性,吸引着越来越多的企业和求职者。面对大模型领域的职位面试,如何充分准备,展现自己的专业能力和潜力,成为了每位求职者关注的焦点。本文将…

【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别

目录 写在开头 一、CNN的原理 1. 概述 2. 卷积层 内参数(卷积核本身) 外参数(填充和步幅) 输入与输出的尺寸关系 3. 多通道问题 多通道输入 多通道输出 4. 池化层 平均汇聚 最大值汇聚 二、手写数字识别 1. 任务…

原生js制作svg 图标生成动态 tab栏切换效果(结尾附代码)

svg 图标生成动态 tab 栏 先看效果: 我想做一个 tab 栏比较美观的效果,当然切换的数据可以自己做一下,这里不演示,说一下特效如何制作。 当我点击时要将空心变为实心的这么一个效果,所以准备两个五角星样式一个是空…

【索引】数据库索引之顺序索引概述

目录 1、索引的基本概念 2、顺序索引 3、稠密索引和稀疏索引 3.1 什么是稠密索引? 3.2 什么是稀疏索引? 4、索引的更新 4.1 索引的插入操作 4.1 索引的删除操作 5、辅助索引 1、索引的基本概念 数据库中的索引与图书馆中书的索引作用相同&#xf…

解锁TikTok内容趋势——高效获取TikTok标签信息接口

一、引言 在TikTok这个全球热门的短视频平台上,标签(Hashtags)是用户和内容创作者连接、发现新内容的重要工具。为了帮助品牌、市场分析师、内容创作者等更好地理解和利用TikTok上的内容趋势,我们推出了一款全新的接口服务&#…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 1.功能描述 当你从摄像头读取实时视频时,如果想在视频的画面中画一个方框,或者是画一个圆,是很简单的事情,可是…

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决

在计算机世界中,文件系统是数据管理的基石,而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势,并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1)socket----创建socket对象。 2)bind----绑定本机ipport。 3)listen----监听来电,若在监听到来电,则建…

如何做好媒体邀约宣发

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 如何做好媒体邀约:7个步骤,3个注意点,1个提醒。 一,媒体邀约七步走 明确活动的目的:首先,明确媒体邀约宣发的目标…

深度 | OpenAI COO闭门访谈:大模型已至,企业如何落地?

图片来源:OpenAI Z Highlights: 仅仅允许公司单一部门使用互联网非常可笑。类似地,给所有员工开放AI权限将会是最大的催化剂。当前阶段的AI企业级部署,要让员工熟悉AI工具的使用方式,让他们将工作流程与模型的功能紧密…

每天写java到期末考试(6.19)--1.百元买百鸡

好久没有写了,现在赶快先复习复习,哈哈,加油! 收获:写了好久,才写好这一个问题,提示自己不要好高骛远,前期先踏踏实实写好每一个代码; 被困住原因 取余%与整除/区别 pa…

GaussDB技术解读——GaussDB架构介绍(五)

GaussDB架构介绍(四)从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构进行了解读,本篇将从关键技术方案的事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续介绍GaussDB云原生架构。 目录 事务存储组件 1、本地…

openh264 Pskip 模式决策原理:WelsMdPSkipEnc 函数

WelsMdPSkipEnc函数介绍 函数功能:它尝试对当前宏块(MB)进行P-skip模式的编码,并返回一个布尔值表示是否成功。函数参数: 函数接受编码上下文 pEncCtxMD结构体 pWelsMd当前宏块 pCurMb宏块缓存 pMbCache 函数调用关系…

人生的乐趣,在于对真知的追求

子曰:朝闻道,夕死可矣! 孔子说:早上听到关于世界的真理,哪怕晚上就die了都可以。 这句话很有力量而经常被人引用,表达出我们如何看待沉重的肉身和精神世界。 我们的生活目的:道。 —— 要了解…

五种HTTP数据传输方式

在前端开发过程中,后端主要提供 http 接口来传输数据,而这种数据传输方式主要有五种: url paramqueryform-urlencodedform-datajson 下面就让我们一起来了解一下在Nest.js中如何使用这五种HTTP数据传输方式: 一,创建项目 使用nest new 创建一个nest的项目 nest new 项目名称 …

【送模板】5张图,帮你轻松搞懂OKR工作法

OKR是目标与关键结果法的缩写,OKR运用在工作中就是强调对业务进行逻辑思考,找到目标与关键结果之间的因果关系。这种因果关系的是否准确决定我们努力的价值。 OKR是一种高效的目标管理方法。“O”就是object,目标的意思,“kr”就…