python爬虫 Day 7+

蔡阳
• 阅读 1152

第一次补课--第七节课后

csv写入与读取

1. 写入文件

(1)通过创建writer对象,使用列表的方式,主要用到两个方法:一个是writerow,每次写入一行;一个是writerows,每次写入多行,只需写入一次

import csv
import pandas as pd

# 第一种写入方式 writerow
person =[
    ('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),
]

# 表头
header = ('name', 'age', 'height')

# w-->写 如果office打开乱码了 需要改成utf-8-sig newline-->换行
with open('person.csv', 'w', encoding='utf-8', newline='') as file_obj:
    writer = csv.writer(file_obj)
    writer.writerow(header)  # 把表头写进去
    for i in person:
        writer.writerow(i)  # 把内容写进去
# 第二种写入方式 writerows
person =[
    ('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),
]
header = ('name', 'age', 'height')
with open('person2.csv', 'w', encoding='utf-8', newline='') as file_obj:
    writer = csv.writer(file_obj)
    writer.writerow(header)  # 把表头写进去
    writer.writerows(person)    # 把内容写进去

(2)通过创建DictWriter对象 即使用字典的方式写入数据

# 第三种写入方式--字典
person = [
    {'name': '你在', 'age': 18, 'height': 180},
    {'name': 'yyy', 'age': 20, 'height': 182},
    {'name': 'zzz', 'age': 22, 'height': 184}
]
header = ('name', 'age', 'height')
with open('dict_person.csv', 'w', encoding='utf-8', newline='') as f:
    DictWrite = csv.DictWriter(f, header)
    DictWrite.writeheader()  # 写入表头
    DictWrite.writerows(person)  # 写入内容

附注:

# 不用with就要手动关闭:close()
f_obj = open('dict_person2.csv', 'w', encoding='utf-8', newline='')
DictWrite = csv.DictWriter(f_obj, header)

# 写入表头
DictWrite.writeheader()
DictWrite.writerows(person)
f_obj.close()

2.读取文件

(1)通过reader()读取到的每一个数据是一个列表,即可以通过下标的方式获取具体某一个值

# 第一种读取方式 读取出来的元素是列表
with open('person.csv', 'r', encoding='utf-8') as g:
    r = csv.reader(g)
    # print(r, type(r))
    for i in r:
        print(i[0], i[1], i[2])

(2)通过DictReader()读取到的数据是一个字典,即可以通过key的方式获取数据

with open('person2.csv', 'r', encoding='utf-8') as h:
    r = csv.DictReader(h)
    # print(type(r), r)
    for i in r:
        print(i['name'], i['age'], i['height'])

面向对象

# 类属性 实例属性 类方法 实例方法

class A:
    # 类属性:直接在类中定义的属性
    # 特点: 1.可以通过类对象和实例对象访问
    # 2. 可以通过类对象修改 但不能通过实例对象修改(添加实例对象属性,而不是类属性)
    number = 99

    def __init__(self):
        # name 是实例属性 通过self.xxx的都是实例属性
        # self 是指对象本身
        # 实例对象可以访问和修改实例属性 类对象不能访问实例属性
        self.name = 'python'

    # 实例方法:是在类中定义的 第一个参数是self
    def test(self):
        print('实例方法')

    # 类方法:使用@classmethod修饰的方法是类方法 第一个参数是cls
    # 类方法可以通过类对象调用 也可以通过实例对象调用
    @classmethod
    def test2(cls):
        print('类方法')

print(A.number)  # 调用类属性
# a是一个实例对象
a = A()
# 通过实例对象添加的属性就是实例属性
a.number = 1314
print(a.number)  # 实例属性
print(A.number)     # 类属性

print(a.name)  # 实例属性可以通过实例对象调用
print(A.name)  # 报错
a.name = 'hello'
print(a.name)  # 实例属性可以通过实例对象修改

a.test()  # 调用test方法
A.test()  # 报错
A.test(a)   # 等价于a.test() 类对象 需要手动传递?

A.test2()
a.test2()

案例--爬取天气

目标:爬取某城市7天的天气状况(日期、天气、温度、风力)
完成步骤
1.向目标url发起请求 获取网页源代码(html文件)
2.页面分析
(1)在网页源代码种匹配ul标签(正则)
(2)继续解析ul标签中的li标签数据(正则)
3.通过csv保存数据

import requests
import re
import csv

# 目标url
url = 'http://www.weather.com.cn/weather/101110101.shtml'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# 1.向目标url发起请求 获取网页源代码
res = requests.get(url, headers=headers)
html = res.content.decode('utf-8')
# print(res.content.decode('utf-8'))  # 全部内容

# 2.解析数据

# 在网页源代码中匹配ul标签
# re.S 换行匹配
ul = re.match(r'.*?(<ul class="t clearfix">.*?</ul>).*', html, re.S)
# ul_data1 = ul.group()  # 全部内容
# print(ul_data1)
ul_data2 = ul.group(1)
# print(ul_data2)

# 在网页源代码中匹配li标签
lis = re.findall(r'.*?(<li class=".*?">.*?</li>).*?', ul_data2, re.S)
# print(lis)
# 最后有?问号的话 7天信息都会表示出来 ;没有?问号的话 只有一天的信息表示出来
# 储存所有数据的大列表
lst_data = []
for li in lis:
    # 储存某一天数据的字典
    li_dict = {}
    # print(li)
    # print('*' * 100)
    pat = re.compile(r'.*?<h1>(.*?)</h1>.*?<p.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<i>(.*?)</i>', re.S)
    li_data = pat.match(li)
    # print(li_data.group(1), end=' ')
    # print(li_data.group(2), end=' ')
    # print(li_data.group(3), end=' ')
    # print(li_data.group(4), end=' ')
    # print()
    li_dict = {'日期': li_data.group(1), '天气': li_data.group(2), '温度': li_data.group(3), '风力': li_data.group(4)}
    print(li_dict)
    lst_data.append(li_dict)

header = ['日期', '天气', '温度', '风力']
with open('weather.csv', 'w', encoding='utf-8', newline='') as f:
    w = csv.DictWriter(f, header)
    w.writeheader()
    w.writerows(lst_data)
点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础8——文件操作
16文件操作16.1文件操作的基本概念文件操作的步骤1.打开文件2.读、写文件3.关闭文件open函数,创建一个file对象,默认是以只读的方式打开read方法:一次性读取文件的所有内容write方法:将指定内容写入文件close方法:关闭文件file对象的属性flie.name文件的名称file.mode文件的访问模式file.closed
Wesley13 Wesley13
3年前
java nio读取和写入文件
读取!(https://oscimg.oschina.net/oscnet/6777ef75a4290d527a6a21d7fa2ee09c5b9.jpg)!(https://oscimg.oschina.net/oscnet/520b4191b358841956bf25a668b0f3eb0cb.jpg)packagecom.t
Wesley13 Wesley13
3年前
Java CopyOnWrite容器
   CopyOnWrite简称COW(写时复制),是一种程序设计中的优化策略,读取时,直接读取,写入时,copy一个副本,在这个副本上进行写入,写入完成,用副本替换原数据,这是一种延时懒惰策略。   从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,CopyOnWriteArrayList和CopyOnW
Wesley13 Wesley13
3年前
Java 对象流
对象流ObjectInputStreamObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Objectobj)方法,将一个对象obj写入到一个文件,使用readObject()读取一个对象。构造方法:ObjectInputStream(InputStre
Wesley13 Wesley13
3年前
JAVA读取矩阵文件,写入矩阵
_JAVA读取矩阵文件,矩阵数据的文件格式为.bak,或grd,矩阵数据交换_packagecom.gsafety.weixin.utils;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;
Stella981 Stella981
3年前
Guava File操作
Java的基本API对文件的操作很繁琐,为了向文件中写入一行文本,都需要写十几行的代码。guava对此作了很多改进,提供了很多方便的操作。一.Guava的文件写入Guava的Files类中提供了几个write方法来简化向文件中写入内容的操作,下面的例子演示 Files.write(byte\\,File)(https://www.o
Stella981 Stella981
3年前
Python之CSV模块
1\.CSV简介CSV(CommaSeparatedValues)是逗号分隔符文本格式,常用于Excel和数据库的导入和导出,Python标准库的CSV模块提供了读取和写入CSV格式文件的对象。1.1csv.reader对象和csv文件的读取
Wesley13 Wesley13
3年前
UTF
  最近工作中需要将一些数据写入CSV文件中,并要使用Excel打开进行查看。测试时发现,导出的CSV文件用Excel打开后,中文字符全部是乱码。写入CSV文件的是UTF8编码的数据,文件在Linux中查看是没有问题的,在Windows上用Excel打开却有乱码。在查阅资料后发现,windows系统中文本文档的编码格式用BOM来指定,在文件的开头要写入字符
Stella981 Stella981
3年前
Linux 重定向与管道符
重定向与管道符重定向作用:将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上0标准输入键盘stdin仅读取1标准输出终端stdout仅写入2标准错误终端stderr仅写入3filename其他文件读/写在Li
Wesley13 Wesley13
3年前
Java开发笔记(九十一)IO流处理简单的数据压缩
前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概。这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可能存在大量重复的信息,但依原样写到文件的话,无疑保留了不少冗余数据,造成空间浪费;其二,写入的数据多以明文方式保存,容易产生信息泄露,安全性不高。为此Java提
小万哥 小万哥
1年前
Java 文件处理完全指南:创建、读取、写入和删除文件详细解析
Java文件操作文件处理简介文件处理是任何应用程序的重要部分。Java提供了许多用于创建、读取、更新和删除文件的方法。Java文件处理Java中的文件处理主要通过java.io包中的File类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。创建
蔡阳
蔡阳
Lv1
如果有来世,我一定活出你喜欢的样子。
文章
3
粉丝
0
获赞
0