30min入手正则表达式

限定符

a* a出现任意次

a+ a出现次数不为0

a?a出现(1)或不出现

a{n}a出现n次

a{n,n+x}a出现在n——n+x次

a{2,}a至少出现2次

或运算符

(a|b)

a或者b中选一个

(ab)|(cd)

ab或者cd中选一个

字符类🤔

[abc]\

正则表达式到底是什么东西?

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索.doc。在这里,会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-123456780376-7654321*)。

https://blog.youkuaiyun.com/codercjw/article/details/128860012

30min快速入门(写的很详细很棒)

https://deerchao.cn/tutorials/regex/regex.htm#mission

例如

也有很多批注,很nice,大佬持续更新了将近十年,满满的干货和实际经验

import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt import re # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36' } def get_job_data(keyword, location, pages=1): """ 爬取智联招聘数据 Args: keyword: 关键词,例如 "金融科技" location: 城市,例如 "北京" pages: 爬取页数 Returns: DataFrame: 包含职位信息的 DataFrame """ base_url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' job_data = [] for page in range(1, pages + 1): params = { 'jl': location, 'kw': keyword, 'p': page, } response = requests.get(base_url, headers=headers, params=params) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') job_list = soup.find_all('table', class_='newlist') for job in job_list[1:]: # 跳过第一个表格,它包含了筛选条件 job_title = job.find('td', class_='zwmc').a.text.strip() company_name = job.find('td', class_='gsmc').a.text.strip() salary = job.find('td', class_='zwyx').text.strip() location = job.find('td', class_='gzdd').text.strip() job_data.append([job_title, company_name, salary, location]) df = pd.DataFrame(job_data, columns=['职位', '公司', '薪资', '地点']) return df def save_to_excel(df, filename="job_data.xlsx"): """保存数据到Excel""" df.to_excel(filename, index=False) def visualize_data(df): """数据可视化""" # 将薪资列转换为字符串类型 df['薪资'] = df['薪资'].astype(str) # 使用正则表达式提取最低薪资和最高薪资 # 初始化最低薪资和最高薪资列 df['最低薪资'] = None df['最高薪资'] = None # 遍历每一行,提取薪资范围 for i, row in df.iterrows(): salary = row['薪资'] # 使用正则表达式匹配薪资范围 match = re.match(r'(\d+)k?-(\d+)k?', salary) if match: min_salary = float(match.group(1)) * 1000 max_salary = float(match.group(2)) * 1000 df.at[i, '最低薪资'] = min_salary df.at[i, '最高薪资'] = max_salary # 过滤掉无法转换为数字的行 df = df.dropna(subset=['最低薪资', '最高薪资']) plt.figure(figsize=(10, 5)) plt.hist(df['最低薪资'], bins=10, edgecolor='black') plt.xlabel('最低薪资 (元)') plt.ylabel('职位数量') plt.title('金融科技岗位薪资分布') plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 plt.show() if __name__ == '__main__': keyword = "金融科技" location = "北京" pages = 3 # 爬取3页数据 df = get_job_data(keyword, location, pages) save_to_excel(df) visualize_data(df)帮我改进代码
06-25
为了优化 Python 爬虫代码以提高效率,并改进数据可视化部分的图表展示效果,可以从多个方面入手。以下是一些关键的优化方向和实现建议。 ### 优化爬虫性能 1. **使用高效的请求库** 推荐使用 `aiohttp` 或 `requests` 的会话对象(Session)来复用连接,减少每次请求建立连接的时间开销。对于大规模抓取任务,可以考虑异步请求方式,例如结合 `asyncio` 和 `aiohttp` 实现并发抓取,显著提升效率[^1]。 ```python import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(urls): async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in urls] return await asyncio.gather(*tasks) urls = ["https://example.com"] * 10 # 示例 URL 列表 loop = asyncio.get_event_loop() htmls = loop.run_until_complete(main(urls)) ``` 2. **合理设置请求间隔与超时机制** 避免因频繁请求导致目标网站封禁 IP,应设置合理的请求间隔时间(如 1-2 秒),同时为每个请求设置超时时间,防止程序长时间卡顿等待响应[^1]。 3. **使用代理池与 User-Agent 池** 通过维护一个代理 IP 地址池和随机 User-Agent 列表,可以有效降低被反爬虫机制识别的风险。可借助第三方服务获取可用代理地址,并在每次请求时随机选择不同的代理和 User-Agent。 4. **解析数据时选择高性能工具** 对于 HTML 解析,推荐使用 `lxml` 或 `BeautifulSoup`,它们具有较高的解析速度和灵活性。对于 JSON 数据,则直接使用内置的 `json` 模块进行处理即可。 5. **存储数据前进行去重与清洗** 在将数据存入数据库或文件之前,应对数据进行必要的去重、格式转换等操作,确保后续分析的数据质量。可借助 `pandas` 进行数据预处理,提高数据的一致性和可用性[^1]。 ### 改进数据可视化效果 1. **选择合适的图表类型** 根据数据特性和分析目的,选择最能表达信息的图表类型。例如: - 折线图适用于显示趋势变化; - 柱状图适合比较不同类别的数值大小; - 散点图用于观察两个变量之间的关系; - 热力图则可用于展示矩阵形式的数据分布情况。 2. **利用 Matplotlib 和 Seaborn 提升图表美观度** `matplotlib.pyplot` 是 Python 中最常用的绘图库之一,而 `seaborn` 建立在其之上,提供了更简洁美观的主题样式以及更多高级接口。通过调整颜色、字体大小、图例位置等参数,可以使图表更加清晰易懂[^2]。 ```python import seaborn as sns import matplotlib.pyplot as plt sns.set(style="whitegrid") # 设置全局风格 tips = sns.load_dataset("tips") ax = sns.barplot(x="day", y="total_bill", data=tips) ax.set_title('Average Total Bill by Day') plt.show() ``` 3. **交互式图表增强用户体验** 如果希望用户能够与图表进行互动,可以选择 `plotly` 或 `bokeh` 等支持交互功能的库。这些工具不仅允许用户放大缩小视图、查看具体数据点,还能轻松嵌入到 Web 页面中提供在线服务[^2]。 4. **动态更新图表内容** 对于需要实时反映最新数据变化的应用场景,可以采用 `matplotlib.animation.FuncAnimation` 来定期刷新图表内容,或者构建基于 Web 的仪表盘应用(如 Dash 框架),自动拉取新数据并重新渲染图表[^2]。 5. **添加注释说明提升可读性** 在图表上适当添加标题、轴标签、数据标记等元素,有助于读者快速理解图表所传达的信息。此外,还可以使用箭头、文本框等形式突出显示重要数据点或异常值。 6. **保存高质量图像输出** 当需要将图表导出为图片文件时,请务必指定适当的分辨率(DPI)、尺寸比例以及文件格式(如 PNG、SVG)。通常情况下,矢量图形格式(如 SVG)更适合打印出版用途,而位图格式(如 PNG)则便于网页展示[^2]。 综上所述,通过对爬虫逻辑进行精细化设计以及充分利用现代数据可视化技术,不仅可以大幅提升数据采集的速度和稳定性,还能够让最终呈现出来的分析结果更具说服力和吸引力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白村第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值