概念
应用场景
在python当中有一个内置模块re专门用来实现正则表达式
match()
在文本内查找,返回第一个匹配到的字符串
search()
在文本内查找,返回第一个匹配到的字符串
findall()
在文本内查找,返回所有匹配到的字符串
compile()
将字符串转化为Pattern
split()
分割字符串
sub()
指定替换次数
分组模式group()
普通字符
元字符
预定义匹配字符集
重复匹配
位置匹配和非贪婪匹配
贪婪与非贪婪模式
爬虫案例
保存一天的数据,用到compile相同的获取数据模式获取7天
import requests
import re
import csv
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
class WeatherSpider:
# 获取网页源代码
# 类对象 实例对象 实例方法 类方法
def getSource(self):
# 目标url
url = 'http://www.weather.com.cn/weather/101250101.shtml'
resp = requests.get(url,headers=headers)
# print(resp.content.decode('utf-8'))
return resp.content.decode('utf-8')
# 解析数据 保存数据
def parseSource(self):
content = self.getSource()
# 匹配ul 正则表达式比较灵活 .*?ul标签前面的数据
# 匹配并获取的 (.*?
) .*?ul标签后面的数据
result = re.match(r'.*?(.*?
).*?',content,re.S)
# print(result.group(1))
# 匹配li
ul = result.group(1)
lis = re.findall(r'.*?',ul,re.S)
lst_all = [] # 保存所有的天气数据
pattern = re.compile(r'.*?(.*?)
.*?(.*?).*?(.*?).*?(.*?).*?',re.S)
for li in lis:
r = pattern.match(li)
lst_one = [r.group(1),r.group(2),r.group(3),r.group(4)]
lst_all.append(lst_one)
return lst_all
# 保存数据
def saveData(self):
content = self.parseSource()
with open('weather7day.csv','w',encoding='utf-8',newline='') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(['日期','天气','温度','风力'])
writer.writerows(content)
def main():
WeatherSpider().saveData()
if __name__ == '__main__':
main()
获取7天各列的数据,在整合,主要用到findall
import re
import requests
import csv
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
}
class WeatherSpider:
def getsouce(self):
url = 'http://www.weather.com.cn/weather/101250101.shtml'
req = requests.get(url, headers = headers).content.decode('utf-8')
return req
def parseSource(self):
req = self.getsouce()
content = re.search(r'.*?
', req, re.S).group()
self.days = re.findall(r'(.*?)
', content, re.S)
self.weather = re.findall(r'.*?(.*?)/(.*?)', content, re.S)
self.wind = re.findall(r'
.*?(.*?)', content, re.S)
def saveData(self):
self.parseSource()
headers = ['日期', '天气', '最高温度', '最低温度', '风向', '风力']
with open('weather7s.csv', 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(headers)
for i in range(7):
list_one = [self.days[i], self.weather[i], self.tem[i][0], self.tem[i][1], self.wind[i][0], self.wind[i][1]]
writer.writerow(list_one)
def main():
WeatherSpider().saveData()
if __name__ == '__main__':
main()