Python如何爬取深圳小汽车摇号每期个人竞价数据

  • 背景

坐标深圳,摇号 24 个月了,感觉仍遥遥无期,准备转竞价。
正好最近学习 python,学习写个爬虫把历史每期竞价数据爬出来,作为后面的竞价依据。

  • 思路

  1. 找到摇号官网 [http://xqctk.sztb.gov.cn/wxlm/index.html],使用 bs4 来处理。
  2. 从竞价结果页面获取每期竞价信息。由于这个页面没有格式,只好全面使用正则来匹配需要的竞价数据。
  3. 把爬取到的竞价数据导入到 excel 进行直观分析。(还没完成)
  • 代码

边看书边上网搜索,一行行比照敲出来的代码。
目前能跑通已经是极限了。美观和性能就暂时不考虑了。。
如果有高手愿意随手优化一下,非常欢迎 post 出来,我正好可以对照学习学习。

import requests
import re
from bs4 import BeautifulSoup

def get_html(url): # 获取网页 try: res = requests.get(url) res.encoding = ‘utf-8’ # 指定网页的编码格式 res.raise_for_status() return res.text # 返回网页文本 except Exception as exc: print(‘获取网页出错了:%s’ % (exc))

def get_price(url): # 获取摇号信息,通过正则匹配页面文字 html = get_html(url) soup = BeautifulSoup(html, ‘lxml’) str = soup.find_all(‘span’) # 大部分价格信息放在 span 中,个别除外 mytext = ‘’ for i in str: # 将解析的网页文案,拼接成整个字符串 mytext = mytext + i.get_text() results = [] time = re.match(’(\d+)年第(\d+)期深圳市小汽车增量指标竞价结束’, mytext) results.append(re.sub(’\D’, ‘’, time.group())) # 匹配摇号日期,使用 sub 方法\D,只保留数字 results.append(re.search(‘个人增量指标(\d+).?单位增量指标’, mytext)) results.append(re.search('本期参与竞价的有效编码个人为(\d+).?个。’, mytext)) results.append(re.search(‘两次平均报价分别.?(\d+).?单位(\d+)元。’, mytext)) results.append(re.search(‘两次平均报价分别.?;个人(\d+)元、’, mytext)) results.append(re.search('本期个人竞价.?最低成交价(\d+)元、平均成交价(\d+)元 /个,’, mytext)) results.append(re.search(‘本期个人竞价.*?成交结果:最低成交价\d+元、平均成交价(\d+)元 /个,’, mytext)) yh_result = {} yh_result[‘期次:’] = int(results[0]) yh_result[‘个人竞价指标总量:’] = int(results[1].group(1)) yh_result[‘个人竞价人数:’] = int(results[2].group(1)) yh_result[‘第 1 次报价均价:’] = int(results[3].group(1)) yh_result[‘第 2 次报价均价:’] = int(results[4].group(1)) yh_result[‘最低成交价:’] = int(results[5].group(1)) yh_result[‘平均成交价:’] = int(results[6].group(1)) return yh_result

def get_content(url): contents = [] html = get_html(url) soup = BeautifulSoup(html, ‘lxml’) liTags = soup.find_all(‘a’, attrs={‘class’: ‘am-list-item’}) for liTag in liTags: content = {} text = ‘竞价情况’ if text in liTag.get_text(): # 根据字符串匹配出摇号结果页面 try: content[‘title’] = liTag.get_text() content[‘detail_url’] = liTag.get(‘href’) content[‘摇号结果’] = get_price(content[‘detail_url’]) contents.append(content) except Exception as exc: print(‘解析网页出错了:%s’ % (exc)) return contents

def Out2File(contents): with open(‘深圳摇号竞价结果.txt’, ‘a’) as f: for content in contents: f.write(‘标题:%s\n 链接:%s\n 结果:%s\n\n’ % (content[‘title’], content[‘detail_url’], content[‘摇号结果’]))

def main(url): contents = get_content(url) Out2File(contents)

if name == ‘main’: url = ‘http://xqctk.sztb.gov.cn/wxlm/index.html’ # 第 1 页单独处理,url 格式不一样 main(url) for x in range(2, 12): # 信息一共 11 页,2-11 页 url 格式相同 url = ‘http://xqctk.sztb.gov.cn/wxlm/index_%s.html’ % x main(url) print(‘所有的信息都已经保存完毕!’)


Python如何爬取深圳小汽车摇号每期个人竞价数据

4 回复

有个总结就好了。


要爬取深圳小汽车摇号每期的个人竞价数据,最直接的方法是分析深圳市小汽车增量调控管理信息系统的官方网站。这类数据通常通过API接口或动态加载的方式提供。下面是一个完整的Python爬虫示例,使用requestsBeautifulSoup来获取和解析数据。

首先,确保安装了必要的库:

pip install requests beautifulsoup4 pandas

然后,使用以下代码来爬取数据:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

def fetch_bidding_data(page=1):
    """
    爬取指定页面的竞价数据
    :param page: 页码,默认为第1页
    :return: 包含数据的DataFrame
    """
    # 目标URL(示例URL,实际使用时需根据网站结构调整)
    url = f"https://example.com/sz-car-bidding?page={page}"  # 替换为实际URL
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

    # 解析HTML内容
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 假设数据在表格中,根据实际HTML结构调整选择器
    table = soup.find('table', {'class': 'bidding-table'})  # 替换为实际表格类名
    if not table:
        print("未找到数据表格")
        return None

    # 提取表头和数据行
    headers = [th.text.strip() for th in table.find_all('th')]
    rows = []
    for tr in table.find_all('tr')[1:]:  # 跳过表头行
        cells = [td.text.strip() for td in tr.find_all('td')]
        if cells:
            rows.append(cells)

    # 转换为DataFrame
    df = pd.DataFrame(rows, columns=headers)
    return df

def main():
    all_data = []
    for page in range(1, 6):  # 假设爬取前5页数据
        print(f"正在爬取第 {page} 页...")
        df = fetch_bidding_data(page)
        if df is not None:
            all_data.append(df)
        time.sleep(2)  # 避免请求过于频繁

    if all_data:
        result = pd.concat(all_data, ignore_index=True)
        result.to_csv('shenzhen_car_bidding.csv', index=False, encoding='utf-8-sig')
        print("数据已保存到 shenzhen_car_bidding.csv")
    else:
        print("未获取到任何数据")

if __name__ == "__main__":
    main()

关键点说明:

  1. URL分析:实际使用时,需要替换url为真实的竞价数据页面地址。可能需要检查网站的网络请求(使用浏览器开发者工具)来找到数据接口。
  2. 反爬处理:添加User-Agent头部模拟浏览器访问,并设置time.sleep()避免频繁请求。
  3. 数据解析:根据实际网页的HTML结构调整BeautifulSoup选择器(如表格类名、标签结构)。
  4. 数据保存:将爬取的数据保存为CSV文件,方便后续分析。

如果网站采用动态加载(如通过JavaScript渲染数据),可能需要使用SeleniumPlaywright等工具来模拟浏览器操作。此外,务必遵守网站的robots.txt规则,避免对服务器造成压力。

总结:先分析网站结构,再针对性写爬虫。

摇了 6 期了, 遥遥无期…

我摇了 37 期了

回到顶部