正则表达式简介
在处理爬虫程序向服务器请求返回的页面信息时,正则表达式是一个非常适用的工具[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毕业生
作者毕业论文题目:大数据下陕西咸阳地区蔬菜价格分析与可视化
作者姓名:马远远
指导老师:杨春霞