CSV&正则方式爬取天气

CSV
  • 含义:CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件。python自带了csv模块,专门用于处理csv文件的读取
  • 写入CSV文件:
    • 1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
    • 2 使用DictWriter 可以使用字典的方式把数据写入进去
# import  csv
# #定义表头,只要是能够遍历就可以,迭代器,可迭代对象。。。
# headers = ('name','age','height')
# #添加测试数据
# persons = [
#     ('小猪佩奇',18,175),
#     ('奥特曼',29,190),
#     ('猪猪侠',10,150),
# ]
#
# # with open('test.csv','w',encoding='utf-8') as f:
# #     write = csv.writer(f)
# #     write.writerow(headers)  #writerow是一行一行的写入
# #     for data in persons:
# #         write.writerow(data)
#
# with  open('rows.csv','w',encoding='utf-8') as f:
#     write = csv.writer(f)
#     write.writerow(headers)
#     write.writerows(persons)  #writerrows批量写入


##########################################
#通过DictWrite对象
import  csv
headers = ('name','age','height')
#添加测试数据
persons = [
   {'name':'佩奇',"age":18,'height':161},
   {'name':'猪猪侠',"age":22,'height':181},
   {'name':'奥特曼',"age":31,'height':172},
]

# with open('dict.csv','w',encoding='utf-8') as f:
#     Dwrite = csv.DictWriter(f,headers)  #通过字典的方式写入
#     Dwrite.writeheader()
#     Dwrite.writerows(persons)

#通过上面的方式写入我们发现保存的文件上下行之间会有空行,如果我们需要去掉空行可以添加newline='',如下:
with open('dict2.csv','w',encoding='utf-8',newline='') as f:
   Dwrite = csv.DictWriter(f,headers)
   Dwrite.writeheader()
   Dwrite.writerows(persons)

#csv保存方式思路总结:
#1.创建writed对象   write = csv.writer(f) 或者创建字典格式的  Dwrite = csv.DictWriter(f,headers)
#2.写入表头   write.writerow(headers)
#3.写入数据    write.writerow(data)   批量写入 write.write.writerows

  • CSV文件的读取:
    • 1 通过reader()读取到的每一条数据是一个列表。可以通过下标的方式获取具体某一个值
    • 2 通过DictReader()读取到的数据是一个字典。可以通过Key值(列名)的方式获取数据
import  csv

with open('dict2.csv','r',encoding='utf-8') as f:
    read = csv.reader(f)
    for  i  in read:
        print(i)
 #输出结果如下
 ['name', 'age', 'height']
['佩奇', '18', '161']
['猪猪侠', '22', '181']
['奥特曼', '31', '172']
import  csv

with open('dict2.csv','r',encoding='utf-8')  as  f:
    read = csv.DictReader(f)
    for i in  read:
        print(i)
#输出结果如下:
OrderedDict([('name', '佩奇'), ('age', '18'), ('height', '161')])
OrderedDict([('name', '猪猪侠'), ('age', '22'), ('height', '181')])
OrderedDict([('name', '奥特曼'), ('age', '31'), ('height', '172')])
通过re&正则的方式爬取天气网
  • 确定要爬取的url: http://www.weather.com.cn/weather/101040100.shtml

  • 确定要获取的数据: 重庆市七天的日期,天气,温度。风力

  • 分析网页结构:

  • 在这里插入图片描述

  • 通过分析发现,七天的天气信息都包含在ul的标签里,所以我可以先获取到ul的内容。

  • 下面的每个li标签对应的是一天的天气信息,所以在获取到ul后接着去获取li标签的内容
    -在这里插入图片描述

  • 我们发现我们所需要的信息都在下面可以找到,那么我们可以通过正则进一步的去匹配获取所需数据。

  • 将数据保存为CSV格式

  • 代码如下:

import re
import requests
import csv


class Weather:
    # 定义目标url以及headers信息
    def __init__(self):
        self.url = 'http://www.weather.com.cn/weather/101040100.shtml'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
        }

    # 获取网页源码
    def Get_Html(self):
        html = requests.get(url=self.url, headers=self.headers)
        return html.content.decode('utf-8')

    # 通过正则的方式解析数据
    def parse_html(self):
        resoult = self.Get_Html()
        uls = re.match(r'.*?(<ul class="t clearfix">.*?</ul>).*?', resoult, re.S).group(1)
        lis = re.findall(r'<li.*?>.*?</li>', uls, re.S)
        pattern = re.compile(r'<li.*?">.*?<h1>(.*?)</h1>.*?<p.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<i>(.*?)</i>.*?</li>', re.S)
        lists = []
        for i in lis:
            r = pattern.match(i)
            lit = [r.group(1), r.group(2), r.group(3), r.group(4)]
            lists.append(lit)
        return lists

    def save_data(self):
        data = self.parse_html()
        # print(data)
        title = ("日期", '天气', '温度', '风力')

        with open('天气.csv', 'w', encoding='utf-8', newline='') as f:
            write = csv.writer(f)
            write.writerow(title)
            write.writerows(data)


if __name__ == '__main__':
    res = Weather()
    res.save_data()

结果如下:
在这里插入图片描述
这样就能通过exec表格打开了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值