python爬虫 Day 7+
Posted 国民好姐姐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫 Day 7+相关的知识,希望对你有一定的参考价值。
第一次补课--第七节课后
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)
以上是关于python爬虫 Day 7+的主要内容,如果未能解决你的问题,请参考以下文章