如何从peakbagger网页提取经纬度及批量爬取优化方法
单页经纬度提取方法
你当前的代码已经拿到了页面所有td标签,针对经纬度的固定格式,可以用正则匹配快速定位提取,优化后的代码如下:
from urllib.request import urlopen from bs4 import BeautifulSoup import re url = 'https://www.peakbagger.com/peak.aspx?pid=10882' html = urlopen(url) soup = BeautifulSoup(html, 'html.parser') # 匹配经纬度的正则规则,直接适配你提到的格式片段 lat_lng_reg = re.compile(r'(\d+\.\d+),\s*(\d+\.\d+)') for td in soup.select("td"): match_res = lat_lng_reg.search(td.get_text()) if match_res: lat = float(match_res.group(1)) lng = float(match_res.group(2)) print(f"纬度:{lat},经度:{lng}") break
批量提取列表页所有山峰经纬度的方法
不需要逐个手动处理页面,你可以先爬取列表页拿到所有山峰的详情页链接,再循环批量爬取每个页面的经纬度,完整代码如下:
from urllib.request import urlopen from bs4 import BeautifulSoup import re import pandas as pd import time # 基础配置 list_url = 'https://www.peakbagger.com/list.aspx?lid=5651' peak_base_url = 'https://www.peakbagger.com/peak.aspx?pid=' lat_lng_reg = re.compile(r'(\d+\.\d+),\s*(\d+\.\d+)') result = [] # 第一步:爬列表页获取所有山峰的pid和名称 list_html = urlopen(list_url) list_soup = BeautifulSoup(list_html, 'html.parser') for a_tag in list_soup.select('a[href^="peak.aspx?pid="]'): pid = a_tag['href'].split('pid=')[-1] result.append({ 'pid': pid, 'peak_name': a_tag.get_text(strip=True) }) # 第二步:循环批量爬取每个山峰的经纬度 for item in result: try: # 加延时避免请求太频繁被限制 time.sleep(0.5) peak_html = urlopen(f"{peak_base_url}{item['pid']}") peak_soup = BeautifulSoup(peak_html, 'html.parser') for td in peak_soup.select('td'): match_res = lat_lng_reg.search(td.get_text()) if match_res: item['lat'] = float(match_res.group(1)) item['lng'] = float(match_res.group(2)) break except Exception as e: print(f"pid为{item['pid']}的山峰数据爬取失败:{str(e)}") continue # 结果可直接导出为csv文件 df = pd.DataFrame(result) print(df) # df.to_csv('山峰经纬度数据.csv', index=False, encoding='utf-8-sig')
- 批量爬取时可以根据网站的响应速度调整延时时间,避免触发反爬限制。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

