You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网站爬取电话号码填充Excel:保留纯数字及代码求助

爬取auto.ria.com电话号码并清洗为纯数字写入Excel

以下是针对你的需求修改后的代码,解决了电话号码清洗、Excel写入格式错误以及代码中的无效语句问题:

修改要点

  • 移除代码中无效的4语句
  • 添加电话号码清洗函数,用正则表达式过滤所有非数字字符
  • 修正Excel写入逻辑,避免将整个DataFrame作为字符串写入单个单元格
  • 优化请求头部,降低被反爬拦截的概率
  • 调整文件操作逻辑,避免循环内重复关闭/打开工作簿

修改后的完整代码

import requests
import pandas as pd
from bs4 import BeautifulSoup
from openpyxl import load_workbook
import re

# 清洗电话号码,仅保留纯数字
def clean_phone(phone_str):
    return re.sub(r'\D', '', phone_str)

def get_phone(id_):
    url1 = f"https://auto.ria.com/demo/bu/mainPage/rotator/item/{id_}?type=bu&langId=4"
    url2 = "https://auto.ria.com/users/phones/{id_}?hash={userSecureHash}"
    
    # 模拟浏览器请求头部
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    
    try:
        data = requests.get(url1, headers=headers).json()
        userSecureHash = data["userSecure"]["hash"]
        phone_data = requests.get(url2.format(id_=id_, userSecureHash=userSecureHash), headers=headers).json()
        
        # 清洗每个电话号码,只保留数字
        cleaned_phones = [clean_phone(p["phoneFormatted"]) for p in phone_data["phones"]]
        return data, cleaned_phones
    except Exception as e:
        print(f"获取ID {id_} 的电话失败: {e}")
        return {}, []

page = 0
page_count = int(input("Pages: "))
price = input("Price: ")

fn = 'example.xlsx'
wb = load_workbook(fn)
ws = wb['data']

# 自动写入表头(如果不存在)
if ws.max_row == 1:
    ws.append(["电话号码"])

while page <= page_count:
    url = f"https://auto.ria.com/uk/search/?indexName=auto,order_auto,newauto_search&categories.main.id=1&country.import.usa.not=-1&price.USD.gte={price}&price.currency=1&abroad.not=0&custom.not=1&sellerType=1&page={page}"
    print(f"正在爬取第 {page} 页: {url}")
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    soup = BeautifulSoup(requests.get(url, headers=headers).content, "html.parser")
    
    for a in soup.select("a.address"):
        id_ = a["href"].split("_")[-1].split(".")[0]
        data, phones = get_phone(id_)
        if not data:
            continue
        
        # 每个电话号码单独写入一行
        for phone in phones:
            if phone:  # 跳过空号码
                ws.append([phone])
    
    wb.save(fn)
    print(f"第 {page} 页数据已保存")
    page += 1

wb.close()
print("所有页面爬取完成")

代码说明

  1. clean_phone函数:用正则表达式\D匹配所有非数字字符,替换为空字符串,直接得到纯数字格式的电话号码。
  2. 请求头部优化:添加User-Agent模拟浏览器访问,降低被网站反爬机制拦截的概率。
  3. Excel写入逻辑:改为逐个电话号码写入单独行,解决原代码中把整个DataFrame字符串塞进单个单元格的问题;同时自动检测表头,不存在则添加。
  4. 异常处理:细化异常捕获并打印错误信息,方便排查爬取失败的具体原因。
  5. 文件操作优化:将工作簿关闭操作移到循环结束后,避免重复打开/关闭文件,提升运行效率。

内容的提问来源于stack exchange,提问作者zaza2345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:33:39