如何从已提取的URL列表中抓取深层数据?附Python代码
深层数据抓取实现方案
你现有的代码已经完成了列表页URL的提取,要抓取每个URL对应的深层数据,只需要在遍历列表项时,对详情页发起请求并解析所需字段即可。以下是具体实现方案:
核心修改思路
- 新增详情页处理函数,负责请求详情页并提取深层数据
- 在列表遍历逻辑中调用该函数,将基础信息与深层数据合并
- 加入请求延迟,避免触发网站反爬机制
修改后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd import time def extract(page): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'} url = f'https://www.legalentityidentifier.in/leicert/?page_size={page}' r = requests.get(url, headers) soup = BeautifulSoup(r.content, 'html.parser') return soup # 新增:处理详情页的函数,传入相对链接,返回提取的深层数据 def extract_details(relative_link): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'} # 拼接完整的详情页URL full_url = f'https://www.legalentityidentifier.in{relative_link}' try: r = requests.get(full_url, headers) r.raise_for_status() # 捕获HTTP请求错误 soup = BeautifulSoup(r.content, 'html.parser') # 根据详情页实际HTML结构提取字段(以下为示例,需自行调整) details = {} # 提取LEI编码 lei_code = soup.find('div', class_='lei-number').text.strip() if soup.find('div', class_='lei-number') else '未找到' details['LEI编码'] = lei_code # 提取注册状态 status = soup.find('div', class_='status').text.strip() if soup.find('div', class_='status') else '未找到' details['注册状态'] = status # 可添加更多字段提取逻辑 return details except requests.exceptions.RequestException as e: print(f"请求详情页失败: {full_url}, 错误信息: {e}") return {'LEI编码': '请求失败', '注册状态': '请求失败'} def transform(soup): divs = soup.find_all('div', class_='table-cell legal-name') joblist = [] for item in divs: title = item.find('a').text.strip() link = item.find('a')['href'] # 获取详情页数据并合并 deep_data = extract_details(link) job_info = { '名称': title, '详情链接': link, **deep_data # 展开深层数据字典 } joblist.append(job_info) # 添加请求延迟,避免频率过高被限制 time.sleep(1) return joblist # 主执行逻辑 page_soup = extract(10) joblist = transform(page_soup) df = pd.DataFrame(joblist) print(df.head()) df.to_csv('LEI详情数据.csv', index=False)
关键注意事项
- 字段提取调整:代码中的详情页选择器(如
lei-number、status)是示例,需通过浏览器F12查看目标页面的实际HTML结构,修改对应的选择器 - 反爬优化:可以将固定延迟改为随机延迟(需导入
random模块,使用time.sleep(random.uniform(0.5, 2))),降低被识别的概率 - 异常处理:代码中加入了基础的请求异常捕获,可根据需求扩展,比如处理页面解析失败的情况
内容的提问来源于stack exchange,提问作者Kadam Jain
相关产品推荐
相关产品推荐

