正则表达式简介
在处理爬虫程序向服务器请求返回的页面信息时,正则表达式是一个非常适用的工具[18]。正则表达式是一种用于模式匹配和搜索文本的工具,可以用于从页面中提取所需的数据或进行特定模式的匹配和替换,它被应用于Python、Java、PHP等各种编程语言中。
正则表达式在Python中的使用
在Python中,re模块负责实现正则表达式的功能,该模块在特征信息提取、数据清洗、字符串格式化等方面具有广泛的应用。其中findall()函数是re模块中一个被用于在给定的字符串中匹配所有符合正则表达式模式,匹配的项,并以列表的形式返回,该函数接收两个参数,分别为需要匹配的正则表达式模式和待匹配字符串。
import time
import pandas as pd
import requests
import re
from datetime import datetime
# 开始请求时间
start_time = time.time()
# global requests_count, start_time
# # 请求完成结束时间
# current_time = time.time()
# elapsed_time_since_start = current_time - start_time
# minute_passed = int(elapsed_time_since_start/60)
# while requests_count >= minute_passed *max_reuqests_per:
#
# print("请求过于频繁")
# #
# #
# requests_count +=1
def getWeather(url):
weather_info = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Cookie': 'lianjia_uuid=9d3277d3-58e4-440e-bade-5069cb5203a4; UM_distinctid=16ba37f7160390-05f17711c11c3e-454c0b2b-100200-16ba37f716618b; _smt_uid=5d176c66.5119839a; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216ba37f7a942a6-0671dfdde0398a-454c0b2b-1049088-16ba37f7a95409%22%2C%22%24device_id%22%3A%2216ba37f7a942a6-0671dfdde0398a-454c0b2b-1049088-16ba37f7a95409%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; _ga=GA1.2.1772719071.1561816174; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1561822858; _jzqa=1.2532744094467475000.1561816167.1561822858.1561870561.3; CNZZDATA1253477573=987273979-1561811144-%7C1561865554; CNZZDATA1254525948=879163647-1561815364-%7C1561869382; CNZZDATA1255633284=1986996647-1561812900-%7C1561866923; CNZZDATA1255604082=891570058-1561813905-%7C1561866148; _qzja=1.1577983579.1561816168942.1561822857520.1561870561449.1561870561449.1561870847908.0.0.0.7.3; select_city=110000; lianjia_ssid=4e1fa281-1ebf-e1c1-ac56-32b3ec83f7ca; srcid=eyJ0Ijoie1wiZGF0YVwiOlwiMzQ2MDU5ZTQ0OWY4N2RiOTE4NjQ5YmQ0ZGRlMDAyZmFhODZmNjI1ZDQyNWU0OGQ3MjE3Yzk5NzFiYTY4ODM4ZThiZDNhZjliNGU4ODM4M2M3ODZhNDNiNjM1NzMzNjQ4ODY3MWVhMWFmNzFjMDVmMDY4NWMyMTM3MjIxYjBmYzhkYWE1MzIyNzFlOGMyOWFiYmQwZjBjYjcyNmIwOWEwYTNlMTY2MDI1NjkyOTBkNjQ1ZDkwNGM5ZDhkYTIyODU0ZmQzZjhjODhlNGQ1NGRkZTA0ZTBlZDFiNmIxOTE2YmU1NTIxNzhhMGQ3Yzk0ZjQ4NDBlZWI0YjlhYzFiYmJlZjJlNDQ5MDdlNzcxMzAwMmM1ODBlZDJkNmIwZmY0NDAwYmQxNjNjZDlhNmJkNDk3NGMzOTQxNTdkYjZlMjJkYjAxYjIzNjdmYzhiNzMxZDA1MGJlNjBmNzQxMTZjNDIzNFwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIzMGJlNDJiN1wifSIsInIiOiJodHRwczovL2JqLmxpYW5qaWEuY29tL3p1ZmFuZy9yY28zMS8iLCJvcyI6IndlYiIsInYiOiIwLjEifQ=='
}
reponse = requests.get(url=url, headers=headers)
if reponse.status_code == 200:
reponse.encoding = reponse.apparent_encoding
print( reponse.text)
# 正则表达式获取需要标题
pattern = r'<div class="th200">(.*?)</div>\s*<div class="th140">(.*?)</div>\s*<div class="th140">(.*?)</div>\s*<div class="th140">(.*?)</div>'
matches = re.findall(pattern, reponse.text)
# 将匹配的结果转换为字典列表
for match in matches[1:]:
# 这里有错误
date_str = match[0]
# 使用split分割字符串,取第一部分
date_str = date_str.split(' ')[0]
# 第一个 %Y-%m-%d 在 strptime 函数中起到解析的作用,将字符串 date_only 按照这种格式解释为一个 datetime 对象
# 第二个 %Y-%m-%d 在 strftime 方法中起到格式化的作用,将前面解析得到的 datetime 对象转换回字符串
# 转换回字符串 不会影响存入mysql吗 因为刚才在写入MySQL的Connect_MySQL.py 文件中Date
# 将日期字符串转换回 YYYY-MM-DD 格式的字符串并不会影响其存入MySQL数据库,只要数据库表结构中的对应列是日期类型(如 DATE 或 DATETIME)
formatted_date = datetime.strptime(date_str, '%Y-%m-%d').strftime('%Y-%m-%d')
highest_temp = float(match[1].replace('℃', ''))
lowest_temp = float(match[2].replace('℃', ''))
weather_data = {'日期': formatted_date, '最高温': highest_temp, '最低温': lowest_temp,
'天气状况': match[3]}
weather_info.append(weather_data)
return weather_info
def get_weather_data():
# 创建一个空的DataFrame 且给上columns 名称
weather_df = pd.DataFrame(columns=['日期', '最高温', '最低温', '天气状况'])
# 遍历2021年到2023年的每个月
for year in range(2021, 2024):
for month in range(1, 13):
# 构造月份字符串,如果月份小于10,前面补0
month_str = ('0' + str(month) if month < 10 else str(month))
weather_time = f'{year}{month_str}'
# 构造URL
url = 'https://lishi.tianqi.com/xianyang/' + weather_time + '.html'
print(url)
# 调用函数并将结果添加到DataFrame中
monthly_weather = getWeather(url) # 假设这个函数返回的是一个可迭代的数据结构(例如列表的字典)
if monthly_weather: # 检查数据是否有效,避免空数据或错误数据
monthly_weather_df = pd.DataFrame(monthly_weather)
weather_df = pd.concat([weather_df, monthly_weather_df], ignore_index=True) # 忽略索引,重置索引
# 每年结束后打印完成信息
print(f"{year}年的天气数据爬取完成。")
# 打印最终结果
print("所有年份天气数据爬取完毕。")
# print(weather_df)
weather_df.to_csv(r"D:\sql\three_weater.csv",encoding = 'utf-8-sig',)
return weather_df
get_weather_data()
作者单位:西安交通工程学院中兴通信学院大数据管理与应用专业2024毕业生
作者毕业论文题目:大数据下陕西咸阳地区蔬菜价格分析与可视化
作者姓名:马远远
指导老师:杨春霞