Anwendungsfälle

Web Scraping für akademische Forschung mit CAPTCHA-Lösung

Wissenschaftliche Datenbanken und Zeitschriftenportale nutzen CAPTCHAs, um den automatisierten Zugriff einzuschränken. Forscher, die Literaturrecherchen, bibliometrische Analysen und Metastudien durchführen, müssen Daten aus diesen Quellen in großem Maßstab sammeln. CaptchaAI verarbeitet die CAPTCHA-Herausforderungen automatisch.


Akademische Quellen und CAPTCHAs

Quelle CAPTCHA-Typ Auslöser Daten
Google Scholar reCAPTCHA v3 Umfangreiche Abfragen Zitate, Aufsätze
PubMed reCAPTCHA v2 Wiederholte Suche Biomedizinische Literatur
Web of Science Cloudflare Turnstile Massen-Downloads Zitiermetriken
Scopus reCAPTCHA v2 Exportvorgänge Bibliometrische Daten
IEEE Xplore reCAPTCHA v2 Suchen + herunterladen Technische Arbeiten
JSTOR reCAPTCHA v2 Zugriffsseiten Geistes- und Sozialwissenschaften

Zitierdatensammler

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

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


def solve_captcha(method, sitekey, pageurl, **kwargs):
    data = {
        "key": CAPTCHAAI_KEY, "method": method,
        "googlekey": sitekey, "pageurl": pageurl, "json": 1,
    }
    data.update(kwargs)
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data=data)
    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,
        })
        r = result.json()
        if r["request"] != "CAPCHA_NOT_READY":
            return r["request"]
    raise TimeoutError("Timeout")


class AcademicScraper:
    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",
            "Accept-Language": "en-US,en;q=0.9",
        })

    def search_papers(self, search_url, query, max_pages=10):
        """Search academic database for papers matching query."""
        all_papers = []

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

            # Handle CAPTCHA
            if self._has_captcha(resp.text):
                resp = self._solve_and_retry(resp.text, url)

            papers = self._parse_results(resp.text)
            if not papers:
                break  # No more results

            all_papers.extend(papers)
            print(f"Page {page + 1}: {len(papers)} papers")
            time.sleep(5)  # Respectful delay

        return all_papers

    def get_paper_details(self, paper_url):
        """Get detailed metadata for a single paper."""
        resp = self.session.get(paper_url, timeout=30)

        if self._has_captcha(resp.text):
            resp = self._solve_and_retry(resp.text, paper_url)

        soup = BeautifulSoup(resp.text, "html.parser")
        return {
            "title": self._safe_text(soup, "h1, .article-title"),
            "authors": self._safe_text(soup, ".authors, .author-list"),
            "abstract": self._safe_text(soup, ".abstract, #abstract"),
            "doi": self._safe_text(soup, ".doi, [data-doi]"),
            "journal": self._safe_text(soup, ".journal-name, .publication"),
            "year": self._safe_text(soup, ".pub-date, .year"),
            "citations": self._safe_text(soup, ".citation-count, .cited-by"),
        }

    def export_to_csv(self, papers, filename):
        """Export collected papers to CSV."""
        if not papers:
            return
        keys = papers[0].keys()
        with open(filename, "w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=keys)
            writer.writeheader()
            writer.writerows(papers)
        print(f"Exported {len(papers)} papers to {filename}")

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

    def _solve_and_retry(self, html, url):
        match = re.search(r'data-sitekey="([^"]+)"', html)
        if not match:
            return self.session.get(url)

        sitekey = match.group(1)
        if 'cf-turnstile' in html:
            token = solve_captcha("turnstile", sitekey, url)
            return self.session.post(url, data={"cf-turnstile-response": token})
        else:
            token = solve_captcha("userrecaptcha", sitekey, url)
            return self.session.post(url, data={"g-recaptcha-response": token})

    def _parse_results(self, html):
        soup = BeautifulSoup(html, "html.parser")
        papers = []
        for item in soup.select(".gs_r, .search-result, article.result"):
            title_el = item.select_one("h3 a, .result-title a")
            if title_el:
                papers.append({
                    "title": title_el.get_text(strip=True),
                    "url": title_el.get("href", ""),
                    "snippet": self._safe_text(item, ".gs_rs, .abstract-snippet"),
                    "authors": self._safe_text(item, ".gs_a, .author-info"),
                })
        return papers

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


# Usage — Literature review
scraper = AcademicScraper(
    proxy="http://user:pass@residential.proxy.com:5000"
)

papers = scraper.search_papers(
    "https://scholar.example.com/scholar",
    query="machine learning CAPTCHA solving",
    max_pages=5,
)

# Get details for top papers
detailed = []
for paper in papers[:20]:
    if paper["url"]:
        detail = scraper.get_paper_details(paper["url"])
        detailed.append(detail)
        time.sleep(3)

scraper.export_to_csv(detailed, "literature_review.csv")

Bibliometrische Analyse

def bibliometric_analysis(scraper, seed_papers, depth=2):
    """Follow citations to build a citation network."""
    visited = set()
    network = []

    def _crawl(paper_url, current_depth):
        if current_depth > depth or paper_url in visited:
            return
        visited.add(paper_url)

        try:
            details = scraper.get_paper_details(paper_url)
            network.append(details)

            # Follow "cited by" links
            resp = scraper.session.get(f"{paper_url}/citations", timeout=30)
            if scraper._has_captcha(resp.text):
                resp = scraper._solve_and_retry(resp.text, f"{paper_url}/citations")

            citations = scraper._parse_results(resp.text)
            for cite in citations[:5]:  # Limit breadth
                if cite["url"]:
                    _crawl(cite["url"], current_depth + 1)
                    time.sleep(3)

        except Exception as e:
            print(f"Error crawling {paper_url}: {e}")

    for paper in seed_papers:
        _crawl(paper["url"], 0)

    return network

Ratenbegrenzung für akademische Websites

Quelle Empfohlene Verzögerung Max. Seiten/Std.
Google Scholar 10-15 Sek 40-50
PubMed 3-5 Sek 100
Web of Science 5-10 Sek 60
Scopus 5-10 Sek 60
IEEE 3-5 Sek 100
JSTOR 5-10 Sek 60

Akademische Websites verbieten IPs schnell. Verwenden Sie konservative Verzögerungen.


Fehlerbehebung

Problem Ursache Lösung
CAPTCHA bei jeder Suche Akademische Website hat IP gemeldet Proxy wechseln, Verzögerung auf 15+ Sek. erhöhen
Es wurden keine Ergebnisse zurückgegeben Stattdessen wurde die CAPTCHA-Seite zurückgegeben Suchen Sie vor dem Parsen nach CAPTCHA
Zusammenfassung fehlt Hinter Paywall Nutzen Sie institutionellen Proxy oder Open Access
Google Scholar blockiert IP Ratenlimit überschritten 30 Minuten warten und andere IP verwenden
Export begrenzt Die Website begrenzt Massen-Downloads In kleineren Mengen herunterladen

FAQ

Ist das Scrapen akademischer Datenbanken erlaubt?

Öffentliche Metadaten (Titel, Autoren, Abstracts) sind allgemein zugänglich. Der Volltextzugriff ist lizenzabhängig. PubMed unterstützt explizit den programmgesteuerten Zugriff über seine E-Utilities-API. Bevorzugen Sie immer offizielle APIs, sofern verfügbar.

Wie vermeide ich eine Blockierung bei Google Scholar?

Verwenden Sie Verzögerungen von 10 bis 15 Sekunden zwischen Anfragen, rotieren Sie Proxys für Privatanwender und begrenzen Sie die Anzahl auf 50 Abfragen pro Stunde. Scholar geht aggressiv gegen die Blockierung des automatisierten Zugriffs vor.

Kann ich CaptchaAI mit einem institutionellen Proxy verwenden?

Ja. Legen Sie Ihren institutionellen Proxy für die Browsersitzung und CaptchaAI für die CAPTCHA-Lösung fest – sie funktionieren unabhängig voneinander.


Verwandte Leitfäden

  • Rotierende Wohn-Proxies
  • Proxy-Qualität und CAPTCHA-Lösungsrate

Beschleunigen Sie Ihre Literaturrecherche – Holen Sie sich Ihren CaptchaAI-Schlüssel und automatisieren Sie die akademische Datenerfassung.

Diskussionen (0)

Noch keine Kommentare.