pychan ist ein Python -Kunde für die Interaktion mit 4chan. 4Chan hat keine offizielle API, und Versuche, eine durch Dritte zu implementieren, haben dazu geführt, dass diese Bibliothek stattdessen Abstraktionen über die Interaktion mit (Scraping) 4chan direkt liefert. pychan ist objektorientiert und seine Implementierung faul, wenn vernünftige (mit Python-Generatoren), um die Leistung zu optimieren und überflüssige Blockierungs-E/A-Operationen zu minimieren.
Wenn Sie Python> = 3.10 und <4.0 installiert haben, kann pychan von PYPI mit etwas wie so installiert werden
pip install pychan Alle 4 -chan -Interaktionen werden intern durch Schlafstreifen innen gedrosselt. Wenn Sie pychan auf multitHhread -Weise ausführen, erhalten Sie nicht die Vorteile dieser Drosselung. pychan übernimmt in solchen Fällen keine Verantwortung für die Folgen übermäßiger HTTP -Anfragen.
from pychan import FourChan , LogLevel , PychanLogger
# With all defaults (logging disabled, all exceptions raised)
fourchan = FourChan ()
# Tell pychan to gracefully ignore HTTP exceptions, if any, within its internal logic
fourchan = FourChan ( raise_http_exceptions = False )
# Tell pychan to gracefully ignore parsing exceptions, if any, within its internal logic
fourchan = FourChan ( raise_parsing_exceptions = False )
# Configure logging explicitly
logger = PychanLogger ( LogLevel . INFO )
fourchan = FourChan ( logger = logger )
# Use all of the above settings at once
logger = PychanLogger ( LogLevel . INFO )
fourchan = FourChan ( logger = logger , raise_http_exceptions = True , raise_parsing_exceptions = True ) Der Rest der Beispiele in diesem README geht davon aus, dass Sie bereits eine Instanz der FourChan -Klasse erstellt haben, wie oben gezeigt.
Diese Funktion holt die Boards von 4chan zur Anrufzeit dynamisch ab.
Hinweis: In dieser Liste werden nicht mit
pychankompatibel.
boards = fourchan . get_boards ()
# Sample return value:
# ['a', 'b', 'c', 'd', 'e', 'g', 'gif', 'h', 'hr', 'k', 'm', 'o', 'p', 'r', 's', 't', 'u', 'v', 'vg', 'vm', 'vmg', 'vr', 'vrpg', 'vst', 'w', 'wg', 'i', 'ic', 'r9k', 's4s', 'vip', 'qa', 'cm', 'hm', 'lgbt', 'y', '3', 'aco', 'adv', 'an', 'bant', 'biz', 'cgl', 'ck', 'co', 'diy', 'fa', 'fit', 'gd', 'hc', 'his', 'int', 'jp', 'lit', 'mlp', 'mu', 'n', 'news', 'out', 'po', 'pol', 'pw', 'qst', 'sci', 'soc', 'sp', 'tg', 'toy', 'trv', 'tv', 'vp', 'vt', 'wsg', 'wsr', 'x', 'xs'] # Iterate over all threads in /b/
for thread in fourchan . get_threads ( "b" ):
# Do stuff with the thread
print ( thread . title )
# You can also iterate over all the posts in the thread
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text )Hinweis: Einige Boards haben kein Archiv (z. B.
/b/). Solche Boards geben entweder eine leere Liste zurück oder erhöhen eine Ausnahme, je nachdem, wie Sie IhreFourChan-Instanz konfiguriert haben.
Die von dieser Funktion zurückgegebenen Threads haben immer ein title , das den in der 4chans Schnittstelle unter dem Spaltenkopf "Auszug" gezeigten Text enthält. Dieser Text kann entweder der tatsächliche Titel des Threads oder eine Vorschau des originalen Beitrags Text sein. Das Übergeben eines der nach dieser Methode zurückgegebenen Threads an die Methode get_posts() korrigiert das title (falls erforderlich) auf dem Thread automatisch, der an die zurückgegebenen Beiträge angehängt wird. Weitere Informationen finden Sie unter Abrufen von Beiträgen für einen bestimmten Thread.
Technisch gesehen könnte
pychandas oben beschriebenetitledurch die Ausgabe einer zusätzlichen HTTP -Anfrage für jeden Thread ansprechen, um seinen eigentlichen Titel zu erhalten, aber im Geiste, die kleinste Anzahl von HTTP -Anforderungen möglich zu machen, verwendetpychanden Auszug direkt.
for thread in fourchan . get_archived_threads ( "pol" ):
# Do stuff with the thread
print ( thread . title )
# You can also iterate over all the posts in the thread
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text )Die Durchführung von Suchvorgängen gegen 4Chan ist viel umständlicher als der Zugriff auf den Rest der Daten von 4chan. Dies liegt daran, dass 4Chan eine Cloudflare-Firewall vor seiner REST-API hat. Die einzige Möglichkeit, Daten von der Suche zurückzugewinnen, besteht darin, die HTTP-Anforderungsinformationen zur Verfügung zu stellen, die zur Umgehung von Cloudflares-Anti-Bot-Überprüfungen erforderlich sind. Letztendlich besteht dies darin, bestimmte Header zusammen mit der HTTP -Anfrage zu übergeben, aber die Herausforderung besteht darin, solche Header tatsächlich zu erwerben.
Es liegt derzeit über den Rahmen von pychan hinaus, diese Header für Sie zu generieren. Wenn Sie also die Umgehung des Schutzes von CloudFlares automatisieren möchten, möchten Sie möglicherweise ein Projekt wie eine der folgenden Aussagen untersuchen (diese Liste ist alphabetisiert und nicht erschöpfend):
Eine manuelle Möglichkeit, diese Werte zu erwerben, besteht darin, eine 4Chan -Suche mit einem Webbrowser durchzuführen und die Entwickler -Tools des Browsers zu nutzen, um die während der Suche gestellten Netzwerkanforderungen nachzuverfolgen. Die Anforderung, die die Cloudflare -Werte enthält, wurde mit einigen Abfrageparametern an https://find.4chan.org/api gestellt. Sobald Sie diese Anfrage gefunden haben, kopieren Sie die User-Agent und Cookie Werte, die in Ihrer Anfrage gesendet wurden, und geben Sie sie dann an pychan search() -Methode weiter. Beachten Sie, dass die CloudFlare -Cookie (en) einen Ablauf haben. Diese manuelle Problemumgehung gibt daher nur die Ergebnisse zurück, bis CloudFlare Ihre Cookie (en) ungültig macht. Danach müssen Sie neue Werte erwerben.
HINWEIS: In den Suchergebnissen werden nie geschlossene/angeklagte/archivierte Threads zurückgegeben.
# This "threads" variable will contain a Python Generator (not a list) in order to facilitate laziness
threads = fourchan . search (
board = "b" ,
text = "ylyl" ,
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" ,
cloudflare_cookies = {
"cf_clearance" : "bm2RICpcDeR4cXoC2nfI_cnZcbAkN4UYpN6c1zzeb8g-1440859602-0-160"
}
)
for thread in threads :
# The thread object is the same class as the one returned by get_threads()
for post in fourchan . get_posts ( thread ):
# Do stuff with the post - refer to the model documentation in pychan's README for details
print ( post . text ) from pychan . models import Thread
# Instantiate a Thread instance with which to query for posts
thread = Thread ( "int" , 168484869 )
# Note: the thread contained within the returned posts will have all applicable metadata (such as
# title and sticky status), regardless of whether you provided such data above - pychan will
# "auto-discover" all metadata and include it in the post models' copy of the thread
posts = fourchan . get_posts ( thread )Die folgenden Tabellen fassen alle Arten von Daten zusammen, die für die verschiedenen von dieser Bibliothek verwendeten Modelle verfügbar sind.
Beachten Sie auch, dass alle Modellklassen in pychan die folgenden Methoden implementieren:
__repr____str____hash____eq____iter__ - Dies wird implementiert, damit die Modelle an Pythons tuple() -Funktion übergeben werden können__copy____deepcopy__ Die folgende Tabelle entspricht der Klasse pychan.models.Thread .
| Feld | Typ | Beispielwert (en) |
|---|---|---|
thread.board | str | "b" , "int" |
thread.number | int | 882774935 , 168484869 |
thread.title | Optional[str] | None , "YLYL thread" |
thread.is_stickied | bool | True , False |
thread.is_closed | bool | True , False |
thread.is_archived | bool | True , False |
thread.url | str | "https://boards.4chan.org/a/thread/251097344" |
Die folgende Tabelle entspricht der Klasse pychan.models.Post .
| Feld | Typ | Beispielwert (en) |
|---|---|---|
post.thread | Thread | pychan.models.Thread |
post.number | int | 882774935 , 882774974 |
post.timestamp | datetime.datetime | datetime.datetime |
post.poster | Poster | pychan.models.Poster |
post.text | str | ">be men>be boredn>write pychann>somehow it works" |
post.is_original_post | bool | True , False |
post.file | Optional[File] | None , pychan.models.File |
post.replies | list[Post] | [] , [pychan.models.Post, pychan.models.Post] |
post.url | str | "https://boards.4chan.org/a/thread/251097344#p251097419" |
Das oben gezeigte Feld replies ist nur eine Komfortfunktion, die pychan für den Zugriff auf alle Beiträge in einem Thread bietet, in dem der >> Bediener auf den aktuellen Beitrag "antworten". Es ist jedoch nicht erforderlich, das Feld replies zu verwenden, um auf alle verfügbaren Beiträge in einem Thread zuzugreifen. Wenn Sie die Methode get_posts() anrufen, erhalten Sie weiterhin alle Beiträge (in der Reihenfolge, die sie veröffentlicht wurden) als einzelne, flache Liste.
Die folgende Tabelle entspricht der pychan.models.Poster -Klasse.
| Feld | Typ | Beispielwert (en) |
|---|---|---|
poster.name | str | "Anonymous" |
poster.is_moderator | bool | True , False |
poster.id | Optional[str] | None , "BYagKQXI" |
poster.flag | Optional[str] | None , "United States" , "Canada" |
Die folgende Tabelle entspricht der Klasse pychan.models.File .
| Feld | Typ | Beispielwert (en) |
|---|---|---|
file.url | str | "https://i.4cdn.org/pol/1658892700380132.jpg" |
file.name | str | "wojak.jpg" , "i feel alone.jpg" |
file.size | str | "601 KB" |
file.dimensions | tuple[int, int] | (1920, 1080) , (800, 600) |
file.is_spoiler | bool | True , False |
Siehe Mitwirkende.md für Entwickler-orientierte Informationen.