正则表达式使用方法

正则表达式简介

在处理爬虫程序向服务器请求返回的页面信息时,正则表达式是一个非常适用的工具[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毕业生

作者毕业论文题目:大数据下陕西咸阳地区蔬菜价格分析与可视化

作者姓名:马远远

指导老师:杨春霞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值