如何用Python爬取Justia父页面并抓取子页面表格数据追加至对应输出文件
如何用Python爬取Justia父页面并抓取子页面表格数据追加至对应输出文件
嘿,作为一个同样踩过爬虫坑的Python新手,我来给你唠唠怎么解决这个问题~首先说结论:完全不需要Selenium!Justia的子页面都是静态HTML,用你已经在玩的requests+BeautifulSoup就足够搞定,简单又高效。
咱们直接基于你现有的代码改,一步步实现你要的三个需求:
第一步:准备工作(避免文件夹报错)
首先得确保posts文件夹存在,不然写入文件时会报错,咱们加几行代码自动创建:
import os from bs4 import BeautifulSoup import requests # 自动创建posts文件夹,不存在就建,存在就跳过 os.makedirs("posts", exist_ok=True)
第二步:爬父页面+子页面表格,写入对应文件
接下来在你的循环里,拿到案件的子页面URL后,直接发送请求爬取表格内容,然后一起写入文件。这里要加个异常处理,避免某个子页面加载失败导致整个程序崩掉:
# 父页面请求(加请求头模拟浏览器,减少被拦截概率) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" } html_text = requests.get("https://dockets.justia.com/search?parties=Novo+Nordisk", headers=headers).text soup = BeautifulSoup(html_text, "lxml") cases = soup.find_all("div", class_ = "has-padding-content-block-30 -zb") # 遍历每个案件,爬取父页面信息+子页面表格 for index, case in enumerate(cases): # 提取父页面的案件号和子页面URL case_number = case.find("span", class_ = "citation").text.replace(" ","").strip() case_url = case.find("a", {"class": "case-name"})["href"] # 爬取子页面的表格内容 table_content = "\n--- 案件详情表格 ---\n" try: # 请求子页面 child_html = requests.get(case_url, headers=headers).text child_soup = BeautifulSoup(child_html, "lxml") # 定位你要的目标表格 target_table = child_soup.find("table", class_="table-responsive with-gaps table-padding--small table-bordered table-padding-sides--small table-full-width") if target_table: # 遍历表格的每一行,整理内容 for row in target_table.find_all("tr"): # 提取每行的表头或单元格内容 cells = row.find_all(["th", "td"]) # 用制表符分隔单元格,让内容更整齐 row_text = "\t".join(cell.get_text(strip=True) for cell in cells) table_content += row_text + "\n" else: table_content += "未找到目标表格\n" except Exception as e: table_content += f"获取子页面失败: {str(e)}\n" # 写入文件(把父页面信息和子页面表格一起写进去) with open(f"posts/{index}.txt", "w", encoding="utf-8") as f: f.write(f"Case No.: {case_number}\n") f.write(f"Case URL: {case_url}\n") f.write(table_content) print(f"文件已保存: posts/{index}.txt")
关键细节解释
为什么不用Selenium?
Justia的页面数据都是直接渲染在HTML里的,没有需要点击或JS动态生成的内容,requests就能直接拿到完整页面源码,Selenium反而会增加程序的复杂度和运行速度,完全没必要用。请求头的作用
加User-Agent是为了模拟浏览器请求,避免网站把咱们的爬虫识别成机器人而拦截请求,你可以把自己浏览器的User-Agent填进去(Chrome里按F12,在Network面板找请求头)。异常处理
用try-except包裹子页面的爬取逻辑,就算某个子页面网络出错或者结构变了,程序也能继续爬其他案件,不会直接崩溃。编码设置
打开文件时指定encoding="utf-8",避免遇到特殊字符时出现乱码问题。
备注:内容来源于stack exchange,提问作者PressMeister




