python爬虫第七讲-正则表达式下和csv模块的使用

正则下

请点击查看

split方法

import re

s = '1+2+3/4*5'
print(re.split(r'\D', s))
print(re.split(r'\D', s, maxsplit=2))

在这里插入图片描述

csv模块的读写

是python的一个内置模块 跨多种形式导入导出数据的模块
我们爬取了一些数据 txt json html xlsx … 也可以把数据保存到csv的这种格式当中 文件的后缀就是xxx.csv
可以通过excel来打开csv文件

写入数据
1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
2 使用DictWriter 可以使用字典的方式把数据写入进去

读取数据

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

写入方法

import csv

# 方法1 writer
persons = [('顾云', 18, 180), ('海兵局势', 25, 188), ('百味', 31, 175)]
headers = {'name', 'age', 'height'}
with open('person.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(headers)
    writer.writerows(persons)


# 方法2 Dictwriter
persons = [
    dict(name='顾云2', age=18, height=180),
    dict(name='海兵局势2', age=25, height=188),
    dict(name='百味2', age=31, height=175),
]
headers = {'name', 'age', 'height'}
with open('person.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.DictWriter(f, headers)
    writer.writeheader()
    writer.writerows(persons)

读取方法

with open('H:\pythonProject\爬虫\person.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f) #或 reader = csv.DictReader(f)
    for i in reader:
        print(i)

天气案例实现

需求:爬取长沙地区未来7天的天气状况 (日期 天气状况 温度 风力)并保存到csv文件里面
目标url
http://www.weather.com.cn/weather/101250101.shtml 7天的
http://www.weather.com.cn/weather15d/101250101.shtml 8-15天的
http://www.weather.com.cn/weather40d/101250101.shtml 40天
第一步 页面分析
通过分析页面的结构我们发现 7天的数据都是在 ul标签里面 ul标签内部的每一个li标签就是我们今天要爬取的数据
1.向目标url发起请求 获取网页源码(html文件)
2.从网页源码当中去匹配ul标签的数据
3.从ul标签里面去匹配li标签的数据
4.解析li标签的数据(要爬取的内容)
5.通过csv保存数据

第二步 实现步骤
见代码

import requests
import re
import csv


class Weather(object):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 '
    }

    def __init__(self):
        pass

    def html_get(self):
        url = 'http://www.weather.com.cn/weather/101250101.shtml'
        req = requests.get(url, headers=self.headers)
        return req.content.decode('utf-8')

    def sourse(self):
        content = self.html_get()
        s = re.match(r'.*?(<ul class="t clearfix">.*?</ul>).*?', content, flags=re.S).group(1)
        lst = re.findall(r'<li class=.*?>.*?</li>', s, flags=re.S)
        sourse_all = []
        for i in lst:
            pattern = re.compile(r'<li.*?>.*?<h1>(.*?)</h1>.*?<p.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<i><(.*?)</i>.*?</li>',
                                 re.S)
            r = pattern.match(i)
            day = [r.group(1), r.group(2), r.group(3), r.group(4)]
            sourse_all.append(day)
        return sourse_all

    def write_s(self):
        headers = ['日期', '天气', '温度', '风力']
        with open('天气预报.csv', 'w', encoding='utf-8', newline='') as f:
            w = csv.writer(f)
            w.writerow(headers)
            w.writerows(self.sourse())


Weather().write_s()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值