Trường Hợp Sử Dụng

Quét web nghiên cứu pháp lý bằng cách xử lý CAPTCHA

Cơ sở dữ liệu pháp lý, hệ thống hồ sơ tòa án và kho lưu trữ án lệ bảo vệ dữ liệu của họ bằng CAPTCHA. Các công ty luật, công ty công nghệ pháp lý và nhóm tuân thủ cần có quyền truy cập tự động vào việc tìm kiếm án lệ, giám sát hồ sơ và tổng hợp dữ liệu quy định. CaptchaAI xử lý các thử thách CAPTCHA trên các cổng này.


Nguồn dữ liệu pháp lý và CAPTCHA

Nguồn Loại CAPTCHA dữ liệu Người dùng
NHIỆT ĐỘ reCAPTCHA v2 Hồ sơ tòa án liên bang Đội tranh tụng
Hệ thống tòa án tiểu bang Hình ảnh CAPTCHA / reCAPTCHA Hồ sơ trường hợp nhà nước luật sư
GIÂY EDGAR reCAPTCHA v2 Hồ sơ doanh nghiệp Tuân thủ
Cơ sở dữ liệu sáng chế reCAPTCHA v2 hồ sơ bằng sáng chế nhà nghiên cứu sở hữu trí tuệ
Cổng thông tin quy định CAPTCHA hình ảnh Nội quy, hướng dẫn Tuân thủ
Cơ sở dữ liệu trích dẫn pháp lý reCAPTCHA v2 Trích dẫn trường hợp Công nghệ pháp lý
Danh bạ hiệp hội luật sư reCAPTCHA v2 Hồ sơ luật sư Sự thẩm định

Công cụ tìm kiếm án lệ

import requests
import time
import re
import base64
from bs4 import BeautifulSoup
import csv

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "userrecaptcha",
        "googlekey": sitekey, "pageurl": pageurl, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")

def solve_image_captcha(image_bytes):
    img_b64 = base64.b64encode(image_bytes).decode()
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY, "method": "base64",
        "body": img_b64, "json": 1,
    })
    task_id = resp.json()["request"]
    for _ in range(20):
        time.sleep(3)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")

class LegalResearchScraper:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
        })

    def search_cases(self, search_url, query, sitekey=None, max_pages=5):
        """Search case law database."""
        all_cases = []

        for page in range(max_pages):
            url = f"{search_url}?q={query}&page={page + 1}"
            resp = self.session.get(url, timeout=30)

            if self._has_captcha(resp.text):
                if sitekey:
                    token = solve_recaptcha(sitekey, url)
                    resp = self.session.post(url, data={
                        "q": query,
                        "g-recaptcha-response": token,
                    })
                else:
                    resp = self._solve_image_and_retry(resp.text, url, query)

            cases = self._parse_cases(resp.text)
            if not cases:
                break

            all_cases.extend(cases)
            print(f"Page {page + 1}: {len(cases)} cases")
            time.sleep(5)

        return all_cases

    def get_case_details(self, case_url):
        """Fetch full case details."""
        resp = self.session.get(case_url, timeout=30)

        if self._has_captcha(resp.text):
            sitekey = self._extract_sitekey(resp.text)
            if sitekey:
                token = solve_recaptcha(sitekey, case_url)
                resp = self.session.post(case_url, data={
                    "g-recaptcha-response": token,
                })

        soup = BeautifulSoup(resp.text, "html.parser")
        return {
            "title": self._text(soup, "h1, .case-title"),
            "citation": self._text(soup, ".citation, .case-cite"),
            "court": self._text(soup, ".court, .jurisdiction"),
            "date": self._text(soup, ".decision-date, .date-decided"),
            "judge": self._text(soup, ".judge, .authored-by"),
            "summary": self._text(soup, ".summary, .headnote"),
            "url": case_url,
        }

    def monitor_docket(self, docket_url, case_number, sitekey=None):
        """Monitor a specific case docket for new filings."""
        resp = self.session.get(docket_url, timeout=30)

        data = {"case_number": case_number}
        if sitekey and self._has_captcha(resp.text):
            token = solve_recaptcha(sitekey, docket_url)
            data["g-recaptcha-response"] = token

        resp = self.session.post(docket_url, data=data)
        return self._parse_docket(resp.text)

    def export_results(self, cases, filename):
        """Export case results to CSV."""
        if not cases:
            return
        with open(filename, "w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=cases[0].keys())
            writer.writeheader()
            writer.writerows(cases)

    def _has_captcha(self, html):
        return any(tag in html.lower() for tag in [
            'data-sitekey', 'g-recaptcha', 'captcha',
        ])

    def _extract_sitekey(self, html):
        match = re.search(r'data-sitekey="([^"]+)"', html)
        return match.group(1) if match else None

    def _solve_image_and_retry(self, html, url, query):
        match = re.search(r'src="(/captcha[^"]+)"', html)
        if match:
            img_url = url.split("?")[0].rstrip("/") + match.group(1)
            img = self.session.get(img_url)
            answer = solve_image_captcha(img.content)
            return self.session.post(url, data={
                "q": query,
                "captcha": answer,
            })
        return self.session.get(url)

    def _parse_cases(self, html):
        soup = BeautifulSoup(html, "html.parser")
        cases = []
        for item in soup.select(".case-result, .search-result, tr.result"):
            title_el = item.select_one("a, .case-name")
            if title_el:
                cases.append({
                    "title": title_el.get_text(strip=True),
                    "url": title_el.get("href", ""),
                    "citation": self._text(item, ".citation, .cite"),
                    "date": self._text(item, ".date"),
                    "court": self._text(item, ".court"),
                })
        return cases

    def _parse_docket(self, html):
        soup = BeautifulSoup(html, "html.parser")
        entries = []
        for row in soup.select(".docket-entry, tr.filing"):
            entries.append({
                "date": self._text(row, ".date, td:first-child"),
                "entry": self._text(row, ".description, td:nth-child(2)"),
                "filed_by": self._text(row, ".filer, td:nth-child(3)"),
            })
        return entries

    def _text(self, el, selector):
        found = el.select_one(selector)
        return found.get_text(strip=True) if found else ""

# Usage
scraper = LegalResearchScraper(
    proxy="http://user:pass@residential.proxy.com:5000"
)

# Search case law
cases = scraper.search_cases(
    search_url="https://caselaw.example.com/search",
    query="data privacy GDPR",
    max_pages=5,
)

# Get details for relevant cases
for case in cases[:10]:
    if case["url"]:
        details = scraper.get_case_details(case["url"])
        print(f"{details['citation']}: {details['title']}")
        time.sleep(3)

# Export results
scraper.export_results(cases, "gdpr_cases.csv")

Giám sát quy định

class RegulatoryMonitor:
    def __init__(self, proxy=None):
        self.scraper = LegalResearchScraper(proxy=proxy)
        self.seen_entries = set()

    def check_new_filings(self, feeds):
        """Check regulatory portals for new filings."""
        new_filings = []

        for feed in feeds:
            try:
                cases = self.scraper.search_cases(
                    feed["url"], feed["query"],
                    sitekey=feed.get("sitekey"),
                    max_pages=2,
                )

                for case in cases:
                    key = case.get("citation") or case.get("title")
                    if key and key not in self.seen_entries:
                        self.seen_entries.add(key)
                        case["source"] = feed["name"]
                        new_filings.append(case)

            except Exception as e:
                print(f"Error checking {feed['name']}: {e}")

            time.sleep(5)

        return new_filings

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Hình ảnh CAPTCHA liên tục bị lỗi Văn bản bị bóp méo Báo cáo và thử lại – hình ảnh mới
PACER chặn quyền truy cập Đã vượt quá giới hạn tỷ lệ Đợi 30 phút, giảm tần suất yêu cầu
Chi tiết vụ việc không đầy đủ Đằng sau bức tường phí Trả phí mỗi trang nếu được yêu cầu
Tìm kiếm không trả lại kết quả nào Thay vào đó, trang CAPTCHA đã được trả lại Kiểm tra CAPTCHA trước khi phân tích cú pháp
Giám sát sổ ghi chép bỏ sót hồ sơ Khoảng thời gian kiểm tra quá dài Tăng tần suất kiểm tra

Câu hỏi thường gặp

Việc truy cập tự động vào hồ sơ tòa án có hợp pháp không?

Hồ sơ tòa án công cộng thường có thể truy cập được. PACER tính phí mỗi trang bất kể phương thức truy cập nào. Luôn tôn trọng giới hạn tốc độ hệ thống và điều khoản sử dụng.

Làm cách nào để xử lý phí PACER?

PACER tính phí trên mỗi trang. Ngân sách chi phí khi lập kế hoạch thu thập dữ liệu số lượng lớn. Hãy xem xét RECAP (kho lưu trữ miễn phí) cho các tài liệu đã tải xuống.

Cơ sở dữ liệu pháp lý nào có nhiều CAPTCHA nhất?

Hệ thống tòa án tiểu bang tệ nhất - nhiều tòa án sử dụng CAPTCHA hình ảnh cũ. Tòa án liên bang (PACER) sử dụng reCAPTCHA v2. Cơ sở dữ liệu bằng sáng chế cũng thường xuyên kích hoạt CAPTCHA.


Hướng dẫn liên quan


Os comentários estão desativados para este artigo.