You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用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")

关键细节解释

  1. 为什么不用Selenium?
    Justia的页面数据都是直接渲染在HTML里的,没有需要点击或JS动态生成的内容,requests就能直接拿到完整页面源码,Selenium反而会增加程序的复杂度和运行速度,完全没必要用。

  2. 请求头的作用
    User-Agent是为了模拟浏览器请求,避免网站把咱们的爬虫识别成机器人而拦截请求,你可以把自己浏览器的User-Agent填进去(Chrome里按F12,在Network面板找请求头)。

  3. 异常处理
    try-except包裹子页面的爬取逻辑,就算某个子页面网络出错或者结构变了,程序也能继续爬其他案件,不会直接崩溃。

  4. 编码设置
    打开文件时指定encoding="utf-8",避免遇到特殊字符时出现乱码问题。

备注:内容来源于stack exchange,提问作者PressMeister

火山引擎 最新活动