网站爬取电话号码填充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("所有页面爬取完成")
代码说明
clean_phone函数:用正则表达式\D匹配所有非数字字符,替换为空字符串,直接得到纯数字格式的电话号码。- 请求头部优化:添加
User-Agent模拟浏览器访问,降低被网站反爬机制拦截的概率。 - Excel写入逻辑:改为逐个电话号码写入单独行,解决原代码中把整个DataFrame字符串塞进单个单元格的问题;同时自动检测表头,不存在则添加。
- 异常处理:细化异常捕获并打印错误信息,方便排查爬取失败的具体原因。
- 文件操作优化:将工作簿关闭操作移到循环结束后,避免重复打开/关闭文件,提升运行效率。
内容的提问来源于stack exchange,提问作者zaza2345
相关产品推荐
相关产品推荐

