Heim >Backend-Entwicklung >Python-Tutorial >Sehr detaillierte Python-Fragen im Vorstellungsgespräch
Dieser Artikel bringt Ihnen sehr detaillierte allgemeine Python-Interviewfragen, die einen gewissen Referenzwert haben. Freunde in Not. Sie können sich darauf beziehen, ich hoffe es wird Ihnen hilfreich sein.
Empfohlene verwandte Artikel : „ Zusammenfassung der Python-Interviewfragen im Jahr 2020 (aktuell) “
1. Lesen von Big-Data-Dateien
① Verwenden Sie den Generatorgenerator
② Iterator, um eine iterative Durchquerung durchzuführen: für Zeile in Datei
2. Der Unterschied zwischen Iteratoren und Generatoren
1) Iterator ist ein abstrakteres Konzept. Jedes Objekt gibt sich selbst zurück, wenn seine Klasse eine Next-Methode und eine Iter-Methode hat. Für Containerobjekte wie Zeichenfolgen, Listen, Diktate, Tupel usw. ist es sehr praktisch, zum Durchlaufen eine for-Schleife zu verwenden. Im Hintergrund der for-Anweisung wird die Funktion iter() für das Containerobjekt aufgerufen. iter() ist eine integrierte Funktion von Python. iter() gibt ein Iteratorobjekt zurück, das die Methode next() definiert, die nacheinander auf die Elemente im Container zugreift. Next() ist ebenfalls eine integrierte Funktion von Python. Wenn keine nachfolgenden Elemente vorhanden sind, löst next() eine StopIteration-Ausnahme aus
2) Generator ist ein einfaches und leistungsstarkes Tool zum Erstellen von Iteratoren. Sie werden wie reguläre Funktionen geschrieben, außer dass sie die Yield-Anweisung verwenden, wenn sie Daten zurückgeben müssen. Bei jedem Aufruf von next() gibt der Generator die Position zurück, an der er aufgehört hat (er merkt sich die Position, an der die Anweisung zuletzt ausgeführt wurde, und alle Datenwerte).
Unterschied: Generatoren können das, was Iteratoren können. Alles, Und da die Methoden __iter__() und next() automatisch erstellt werden, ist der Generator besonders prägnant und die Verwendung von Generatorausdrücken anstelle von Listenverständnissen kann gleichzeitig Speicher sparen. Zusätzlich zur automatischen Methode zum Erstellen und Speichern des Programmstatus wird beim Beenden des Generators auch automatisch die StopIteration-Ausnahme ausgelöst
3. Die Rolle und Funktion des Dekorators:
Einführung in Protokolle
Statistiken zur Funktionsausführungszeit
Vorbereitende Verarbeitung vor Ausführung der Funktion
Reinigungsfunktion nach Ausführung der Funktion
Berechtigungsüberprüfung und andere Szenarien
Cache
4. Lassen Sie uns kurz über GIL sprechen:
Global Interpreter Lock (globale Interpretersperre)
Python Die Ausführung des Codes wird von der virtuellen Python-Maschine gesteuert (auch als Interpreter-Hauptschleife bezeichnet, CPython-Version). Ursprünglich war Python so konzipiert, dass nur ein Thread gleichzeitig in der Hauptschleife des Interpreters ausgeführt wird ist, dass zu jedem Zeitpunkt nur ein Thread im Interpreter ausgeführt wird. Der Zugriff auf die virtuelle Python-Maschine wird durch die Global Interpreter Lock (GIL) gesteuert, die sicherstellt, dass jeweils nur ein Thread ausgeführt wird.
In einer Multithread-Umgebung wird die virtuelle Python-Maschine wie folgt ausgeführt:
1. Wechseln Sie zu einem Thread ausführen
3. Führen Sie Folgendes aus:
a Geben Sie die Anzahl der Bytecode-Anweisungen an, oder b >
4. Versetzen Sie den Thread in den Ruhezustand 5. Wiederholen Sie alle oben genannten Schritte erneut , bevor Sie externen Code aufrufen (z. B C/C++-Erweiterungsfunktion) wird die GIL bis zum Ende dieser Funktion gesperrt (da in diesem Zeitraum kein Python-Bytecode ausgeführt wird, wird kein Threadwechsel durchgeführt).5. find and grep
Der grep-Befehl ist ein leistungsstarkes Textsuchwerkzeug. Die grep-Suchinhaltszeichenfolge kann ein regulärer Ausdruck sein, der die Strukturierung von Textdateien ermöglicht . Finden. Wenn ein passendes Muster gefunden wird, druckt grep alle Zeilen, die das Muster enthalten.find wird normalerweise verwendet, um nach Dateien zu suchen, die die Bedingungen in einem bestimmten Verzeichnis erfüllen. Es kann auch verwendet werden, um nach Dateien zu suchen, die einem bestimmten Benutzer gehören.
6. Was soll ich tun, wenn der Onlinedienst aus verschiedenen Gründen hängen bleibt?
Supervisor, ein Hintergrundprozessverwaltungstool unter LinuxNach jeder Dateiänderung führt Linux einen Service-Supervisor-Neustart aus
7 der Python-Effizienz
Verwenden Sie Schlüsselcodes, verwenden Sie externe Funktionspakete (Cython, Pylnlne, Pypy, Pyrex); vermeiden Sie den Zugriff auf die Eigenschaften von Variablen in Schleifen8. Gängige Linux-Befehle:
ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date9. Yield-Verwendung in Python
Yield ist einfach ein Generator, sodass sich die Funktion die Position im Funktionskörper merkt, als sie zuletzt zurückgegeben wurde. Der zweite (oder n) Aufruf des Generators springt zu dieser Funktion.10. Wie Python den Speicher verwaltet
1. Garbage Collection: Python ist nicht wie C++, Java und andere Sprachen. Sie können Variablen direkt zuweisen, ohne den Variablentyp im Voraus zu deklarieren. Bei der Python-Sprache werden Typ und Speicher des Objekts zur Laufzeit bestimmt. Dies ist auch der Grund, warum wir die Python-Sprache als dynamisch typisiert bezeichnen (hier können wir dynamische Typisierung einfach auf die Zuweisung von Variablenspeicheradressen reduzieren, die automatisch den Variablentyp ermittelt und der Variablen zur Laufzeit einen Wert zuweist).
2. Referenzzählung: Python verwendet eine Methode ähnlich den Windows-Kernelobjekten, um den Speicher zu verwalten. Jedes Objekt verwaltet eine Anzahl von Referenzen, die auf das Objekt verweisen. Wenn eine Variable an ein Objekt gebunden ist, beträgt die Referenzanzahl der Variablen 1 (es gibt auch andere Situationen, in denen sich die Variablenreferenzanzahl erhöht. Das System verwaltet diese Beschriftungen automatisch und scannt sie regelmäßig.) Wenn der Referenzzähler 0 wird, wird das Paar recycelt.
3. Speicherpoolmechanismus Der Speichermechanismus von Python besteht aus Pyramidenreihen. Die Schichten -1 und -2 werden hauptsächlich vom Betriebssystem betrieben.
Die 0. Schicht besteht aus Malloc-, freien und anderen Speichern in C. Zuweisungs- und Freigabefunktionen;
Schicht 1 und 2 sind Speicherpools, die durch die Python-Schnittstellenfunktion PyMem_Malloc implementiert werden. Wenn das Objekt kleiner als 256 KB ist, weist diese Schicht Speicher direkt zu >
Die dritte Schicht ist die oberste Schicht, die unsere direkte Operation von Python-Objekten ist;Wenn malloc und free in C häufig aufgerufen werden, treten Leistungsprobleme auf. Darüber hinaus kommt es zu häufigen Zuweisungen und Freigaben Kleine Speicherblöcke führen hier zu einer Speicherfragmentierung:Wenn die angeforderte Speicherzuweisung zwischen 1 und 256 Bytes liegt, verwenden Sie ein eigenes Speicherverwaltungssystem, andernfalls verwenden Sie malloc direkt.Hier wird malloc weiterhin aufgerufen, um Speicher zuzuweisen, aber jedes Mal wird ein großer Speicherblock mit einer Größe von 256 KB zugewiesen.Der über den Speicherpool registrierte Speicher wird weiterhin in den Speicherpool zurückgeführt Der Speicherpool von C wird am Ende nicht aufgerufen, um ihn für die nächste Verwendung freizugeben, z. B. Werte, Zeichenfolgen und Tupel (Tupel dürfen nicht geändert werden). wird verwendet, das heißt, Angenommen, wenn der Variablen A eine andere Variable B zugewiesen wird, sind die Speicherplätze von A und B zwar immer noch gleich, aber wenn sich der Wert von A ändert, wird der Speicherplatz A neu zugewiesen und die Adressen von A und B werden nicht mehr gleich sein11. Beschreiben Sie die Unterschiede zwischen Arrays, verknüpften Listen, Warteschlangen und Stapeln.
Arrays und verknüpfte Listen sind Konzepte der Datenspeicherung. Arrays speichern Daten im kontinuierlichen Bereich, während verknüpfte Listen Daten in nicht kontinuierlichen Bereichen speichern können. Warteschlange und Stapel beschreiben das Konzept der Datenzugriffsmethoden: Warteschlangen sind „First In First Out“ und Stapel sind „Last In First Out“. Warteschlangen und Stapel können mithilfe von Arrays oder verknüpften Listen implementiert werden.12. Kennen Sie mehrere Arten der Sortierung? Erzählen Sie mir von der, mit der Sie am besten vertraut sind?
Web-Framework-Teil
1. Welche Auswirkungen hat es, wenn sich ein Benutzer in Django bei Anwendungsserver A anmeldet (in den Anmeldestatus wechselt) und dann die nächste Anfrage von Nginx an Anwendungsserver B weitergeleitet wird? Wenn die vom Benutzer auf Anwendungsserver A angemeldeten Sitzungsdaten nicht an Anwendungsserver B weitergegeben werden, geht der vorherige Anmeldestatus von Nano verloren. 2. So lösen Sie das domänenübergreifende Anforderungsproblem in Django (Prinzip)Middleware aktivieren
Anfrage posten
Bestätigungscode
Tag {%csrf_token%} zum Formular hinzufügen
M wird „Model“ geschrieben und hat die gleiche Funktion wie M in MVC, verantwortlich für die Datenverarbeitung, mit eingebettetem ORM-Framework
V, geschrieben als View, das die gleiche Funktion wie C in MVC hat. Es empfängt HttpRequest, Geschäftsverarbeitung, und gibt HttpResponse
T, geschrieben als Vorlage, zurück , die mit der V-Funktion in MVC identisch ist. Sie ist für die Kapselung und Konstruktion des zurückzugebenden HTML-Codes verantwortlich, mit eingebetteter Vorlagen-Engine
Verwenden Sie order_by( )
Absteigende Reihenfolge erfordert das Hinzufügen von -
vor dem Namen des Sortierfelds: Abfragefeld ist größer als ein bestimmter Wert: Filter verwenden (Feldname_gt=Wert)
Middleware ist ein Verarbeitungsprozess zwischen Anforderungs- und Antwortverarbeitung. Sie ist relativ leichtgewichtig und verändert die Eingabe und Ausgabe von Django global.
Django geht einen großen und umfassenden Weg. Es ist vor allem für sein vollständig automatisiertes Verwaltungs-Backend bekannt: Sie müssen nur ORM verwenden und einfache Objektdefinitionen erstellen, und es kann automatisch eine Datenbankstruktur und ein voll funktionsfähiges Verwaltungs-Backend generieren . .
Djangos integriertes ORM ist eng mit anderen Modulen im Framework gekoppelt.
Die Designphilosophie von Django-Vorlagen besteht darin, Code und Stile vollständig zu trennen. Django eliminiert grundsätzlich die Möglichkeit, Daten in Vorlagen zu codieren und zu verarbeiten.
7. Wie implementieren Sie die Django-Umleitung? Welcher Statuscode wird verwendet?
HttpResponseRedirect verwenden
umleiten und umkehren
Statuscode: 302.301
8.ngnix Forward-Proxy und Reverse-Proxy?
Forward-Proxy ist ein Server, der sich zwischen dem Client und dem Ursprungsserver befindet. Um Inhalte vom Ursprungsserver zu erhalten, sendet der Client eine Anfrage an den Proxy und gibt das Ziel (Ursprungsserver) an, und dann sendet der Proxy die Inhalt an den Ursprungsserver weiterleitet und den erhaltenen Inhalt an den Client zurückgibt. Um den Forward-Proxy nutzen zu können, muss der Client einige spezielle Einstellungen vornehmen.
Ein Reverse-Proxy verhält sich für den Client wie der ursprüngliche Server, und der Client muss keine besonderen Einstellungen vornehmen. Der Client sendet eine normale Anfrage an den Inhalt im Namespace des Reverse-Proxys. Anschließend bestimmt der Reverse-Proxy, wohin die Anfrage weitergeleitet werden soll (ursprünglicher Server) und gibt den erhaltenen Inhalt an den Client zurück, als ob der Inhalt selbst derselbe wäre.
9.Was ist der Kern von Tornado?
Der Kern von Tornado sind die beiden Module ioloop und iostream. Ersteres bietet eine effiziente I/O-Ereignisschleife und letzteres kapselt einen nicht blockierenden Socket. Durch das Hinzufügen von Netzwerk-E/A-Ereignissen zu ioloop, die Verwendung nicht blockierender Sockets und das Anpassen der entsprechenden Rückruffunktionen können Sie die begehrte effiziente asynchrone Ausführung erreichen.
10.Django selbst stellt den Runserver bereit. Warum kann er nicht für die Bereitstellung verwendet werden? Die
Runserver-Methode ist eine häufig verwendete Ausführungsmethode beim Debuggen von Django. Sie verwendet Djangos eigenen
WSGI-Server. Sie wird hauptsächlich zum Testen und Entwickeln verwendet, und die Runserver-Methode ist auch ein Einzelprozess.
uWSGI ist ein Webserver, der das WSGI-Protokoll, uwsgi, http und andere Protokolle implementiert. Beachten Sie, dass uwsgi ein Kommunikationsprotokoll ist und uWSGI ein Webserver ist, der das uwsgi-Protokoll und das WSGI-Protokoll implementiert. uWSGI bietet die Vorteile einer ultraschnellen Leistung, einer geringen Speichernutzung und einer Multi-App-Verwaltung. In Kombination mit Nginx
wird es zu einer Produktionsumgebung, die Benutzerzugriffsanfragen von Anwendungs-Apps isolieren kann, um eine echte Bereitstellung zu erreichen. Im Vergleich dazu unterstützt es ein höheres Maß an Parallelität, erleichtert die Verwaltung mehrerer Prozesse, nutzt die Vorteile von Multicores und verbessert die Leistung.
Netzwerkprogrammierung und Front-End-Teil
1. Was ist AJAX und wie wird AJAX verwendet?
Ajax (asynchrones Javascript und XML) kann Teilseitendaten aktualisieren, anstatt die gesamte Webseite neu zu laden.
Der erste Schritt besteht darin, ein xmlhttprequest-Objekt zu erstellen. var xmlhttp =new XMLHttpRequest(); das XMLHttpRequest-Objekt wird zum Datenaustausch mit dem Server verwendet.
Der zweite Schritt besteht darin, die Methoden open() und send() des xmlhttprequest-Objekts zu verwenden, um Ressourcenanforderungen an den Server zu senden.
Der dritte Schritt besteht darin, das Attribut „responseText“ oder „responseXML“ des xmlhttprequest-Objekts zu verwenden, um die Antwort des Servers zu erhalten.
Der vierte Schritt ist die Funktion onreadystatechange. Beim Senden einer Anfrage an den Server müssen wir die Funktion onreadystatechange verwenden, wenn der Server antworten und einige Funktionen ausführen soll. Die Funktion onreadystatechange wird jedes Mal ausgelöst, wenn der readyState der xmlhttprequest aktiviert wird Objektveränderungen.
2. Was sind die gängigen HTTP-Statuscodes?
200 OK
301 Dauerhaft verschoben
302 Gefunden
304 Nicht geändert
307 Temporäre Weiterleitung
400 Ungültige Anfrage
401 Nicht autorisiert
403 Verboten
404 Nicht gefunden
410 Weg
500 Interner Serverfehler
501 Nicht implementiert
3. Was ist der Unterschied zwischen Post und get?
GET-Anfrage, die angeforderten Daten werden an die URL angehängt, um die URL aufzuteilen und Daten zu übertragen. Mehrere Parameter sind mit & verbunden. Das URL-Kodierungsformat verwendet ASCII-Kodierung anstelle von uniclde, was bedeutet, dass alle Nicht-ASCII-Zeichen vor der Übertragung kodiert werden müssen.
POST-Anfrage: Eine POST-Anfrage fügt die angeforderten Daten in den Hauptteil des HTTP-Anfragepakets ein. Das Element = Bandsäge oben sind die tatsächlichen Übertragungsdaten.
Daher werden Daten von GET-Anfragen in der Adressleiste angezeigt, POST-Anfragen jedoch nicht.
2. Die Größe der übertragenen Daten
In der HTTP-Spezifikation gibt es keine Einschränkungen hinsichtlich der Länge der URL und der Größe der übertragenen Daten. Im eigentlichen Entwicklungsprozess für GET gelten jedoch für bestimmte Browser und Server Einschränkungen hinsichtlich der Länge der URL. Daher sind bei der Verwendung von GET-Anfragen die übertragenen Daten durch die Länge der URL begrenzt.
Da es sich bei POST nicht um einen URL-Wert handelt, gibt es theoretisch keine Einschränkungen. Tatsächlich legt jedoch jeder Server eine Grenze für die Größe der per POST übermittelten Daten fest, und Apache und IIS haben ihre eigenen Konfigurationen.
3. Sicherheit
POST ist sicherer als GET. Die Sicherheit bezieht sich hier auf echte Sicherheit, die sich von der Sicherheit in der oben in GET erwähnten Sicherheitsmethode unterscheidet. Die oben erwähnte Sicherheit verändert einfach nicht die Daten des Servers. Wenn Sie beispielsweise einen Anmeldevorgang über eine GET-Anfrage durchführen, werden der Benutzername und das Kennwort auf der URL angezeigt. Da die Anmeldeseite möglicherweise vom Browser zwischengespeichert wird und andere Personen zu diesem Zeitpunkt den Browserverlauf, den Benutzernamen und das Kennwort anzeigen kann leicht von jemand anderem erworben werden. Darüber hinaus können die von der GET-Anfrage übermittelten Daten auch Cross-Site-Request-Frogery-Angriffe verursachen.
4. Was ist der Unterschied zwischen Cookie und Sitzung?
1. Die Cookie-Daten werden im Browser des Clients und die Sitzungsdaten auf dem Server gespeichert.
2. Cookies sind nicht sehr sicher. Andere können die lokal gespeicherten COOKIEs analysieren und aus Sicherheitsgründen Cookies verwenden.
3. Die Sitzung wird innerhalb eines bestimmten Zeitraums auf dem Server gespeichert. Wenn der Zugriff zunimmt, wird mehr Serverleistung beansprucht. Um die Serverleistung zu verringern, sollte COOKIE verwendet werden.
4. Die von einem einzelnen Cookie gespeicherten Daten dürfen 4 KB nicht überschreiten. Viele Browser beschränken die Speicherung auf bis zu 20 Cookies.
5. Vorschlag:
Speichern Sie wichtige Informationen wie Anmeldeinformationen als SITZUNG
Wenn andere Informationen gespeichert werden müssen, können diese in COOKIE abgelegt werden
Erforderlich zum Erstellen ein einfacher TCP-Server Der Prozess
1.socket erstellt einen Socket
2.bindet die IP und den Port
3.hört zu, um den Socket passiv verknüpfbar zu machen
4 für den Link des Kunden
5.recv/send zum Empfangen und Senden von Daten
Crawler- und Datenbankteil
1. Was ist der Unterschied zwischen Scrapy und Scrapy? redis? Warum Redis-Datenbank wählen?
(1) Scrapy ist ein Python-Crawler-Framework mit extrem hoher Crawling-Effizienz und hoher Anpassungsfähigkeit, unterstützt jedoch keine Verteilung. Scrapy-Redis ist eine Reihe von Komponenten, die auf der Redis-Datenbank basieren und auf dem Scrapy-Framework ausgeführt werden. Dadurch kann Scrapy verteilte Strategien unterstützen. Die Slaver-Seite teilt die Artikelwarteschlange, die Anforderungswarteschlange und den Anforderungsfingerabdruck, die in der Redis-Datenbank der Master-Seite festgelegt sind.
(2) Warum Redis-Datenbank wählen? Da Redis die Master-Slave-Synchronisation unterstützt und die Daten im Speicher zwischengespeichert werden, sind verteilte Crawler, die auf Redis basieren, beim Hochfrequenzlesen von Anfragen und Daten sehr effizient.
2. Welche Crawler-Frameworks oder Module haben Sie verwendet? Sprechen Sie über ihre Unterschiede oder Vor- und Nachteile?
Python kommt mit: urllib, urllib2
Dritter: Anfragen
Framework: Scrapy
Sowohl das urllib- als auch das urllib2-Modul führen Vorgänge im Zusammenhang mit der Anforderung von URLs aus, bieten jedoch unterschiedliche Funktionen.
urllib2.: urllib2.urlopen kann ein Request-Objekt oder eine URL akzeptieren (wenn Sie ein Request-Objekt akzeptieren, können Sie damit die Header einer URL festlegen), urllib.urlopen akzeptiert nur eine URL
urllib hat einen URL-Code, Es gibt keine urllib2, daher wird urllib2 häufig zusammen verwendet. Scrapy ist ein gekapseltes Framework, das einen Downloader, einen Parser, ein Protokoll und eine Ausnahmebehandlung enthält . Für feste Singles Die Website-Crawling-Entwicklung bietet Vorteile, aber für das Crawlen von 100 Websites von mehreren Websites ist sie in Bezug auf gleichzeitige und verteilte Verarbeitung nicht flexibel genug und es ist unpraktisch, sie anzupassen und zu erweitern.
Vor- und Nachteile von Scrapy:
Vorteile: Scrapy ist asynchron
Mehr nutzen lesbarer XPath anstelle regulärer AusdrückeLeistungsstarkes Statistik- und ProtokollsystemGleichzeitiges Crawlen auf verschiedenen URLsUnterstützt den Shell-Modus, um unabhängiges Debuggen zu erleichtern Schreiben Sie Middleware, um das Schreiben einiger einheitlicher Filter zu erleichternÜber Pipelines in der Datenbank gespeichertNachteile: Python-basiertes Crawler-Framework, relativ skalierbar Differenz
Basierend Im Twisted-Framework führt das Ausführen von Ausnahmen nicht zum Abbruch des Reaktors, und das asynchrone Framework stoppt andere Aufgaben nicht, nachdem ein Fehler aufgetreten ist, was die Erkennung von Datenfehlern erschwert.3. Welche sind Ihre am häufigsten verwendeten MySQL-Engines? Was sind die Unterschiede zwischen den Motoren?
Es gibt zwei Haupt-Engines, MyISAM und InnoDB. Die Hauptunterschiede sind wie folgt: 1. Das ist sehr wichtig. Bei einer Transaktion handelt es sich beispielsweise um eine Verarbeitungsmethode auf hoher Ebene. Solange ein Fehler auftritt, kann sie zurückgesetzt und wiederhergestellt werden, MyISAM jedoch nicht2. MyISAM eignet sich für Abfragen und einfügungsbasierte Anwendungen, während InnoDB für häufige Änderungen und Anwendungen mit höherer Sicherheit geeignet ist. 3 nicht; 4. MyISAM muss angegeben werden 5 Zeilen in der Tabelle werden nicht in InnoDB gespeichert. Wenn Sie beispielsweise count(*) aus der Tabelle auswählen, muss InnoDB die gesamte Tabelle scannen, um zu berechnen, wie viele Zeilen vorhanden sind, aber MyISAM muss nur lesen Anzahl der gespeicherten Zeilen ermitteln . Beachten Sie, dass MyISAM auch die gesamte Tabelle scannen muss, wenn die count(*)-Anweisung die Where-Bedingung enthält. 7. Für sich selbst erhöhende Felder muss InnoDB einen Index nur für dieses Feld enthalten, jedoch in MyISAM Gemeinsame Indizes können mit anderen Feldern in der Tabelle erstellt werden;8 Beim Löschen der gesamten Tabelle löscht InnoDB Zeilen einzeln, was sehr langsam ist. MyISAM erstellt die Tabelle neu ; 9 Benutzer mögen „%lee%“
4. Beschreiben Sie den Mechanismus des Scrapy-Frameworks
Rufen Sie den ersten Stapel von URLs von start_urls ab und senden Sie die Anfrage. Die Anfrage wird von der Engine an den Scheduler übergeben und in die Anfragewarteschlange gestellt. Nachdem die Erfassung abgeschlossen ist, übergibt der Scheduler die Anfrage an Der Downloader erhält die Antwortressource, die der Anforderung entspricht, und übergibt die Antwort an die von Ihnen geschriebene Analysemethode zur Extraktionsverarbeitung: 1. Wenn die erforderlichen Daten extrahiert werden, werden sie zur Verarbeitung an die Pipeline-Datei übergeben Nachdem die URL extrahiert wurde, fahren Sie mit den vorherigen Schritten fort (Senden der URL-Anfrage und Die Engine übergibt die Anfrage an den Scheduler und stellt sie in die Warteschlange ...), bis keine Anfragen mehr in der Anfragewarteschlange vorhanden sind und das Programm endet.
5. Was sind verwandte Abfragen und was sind sie?
Kombinieren Sie mehrere Tabellen für die Abfrage, hauptsächlich einschließlich Inner Join, Left Join, Right Join, Full Join (Outer Join)
6. Zum Schreiben von Crawlern verwenden. Es handelt sich um mehrere Prozesse besser? Oder ist Multithreading besser? Warum?
Bei E/A-intensivem Code (Dateiverarbeitung, Webcrawler usw.) kann Multithreading die Effizienz effektiv verbessern (wenn in einem einzelnen Thread E/A-Vorgänge vorhanden sind, kommt es zu E/A-Wartevorgängen, was unnötige Kosten verursacht). Zeitverschwendung und Öffnen mehrerer Threads können automatisch zu Thread B wechseln, während Thread A wartet, sodass keine CPU-Ressourcen verschwendet werden, wodurch die Effizienz der Programmausführung verbessert wird. Beim eigentlichen Datenerfassungsprozess müssen Sie nicht nur die Netzwerkgeschwindigkeit und Antwortprobleme berücksichtigen, sondern auch die Hardwarebedingungen Ihres eigenen Computers, um Multiprozess oder Multithread einzurichten
7. Datenbankoptimierung?
1. Optimieren Sie Indizes und SQL-Anweisungen und analysieren Sie langsame Abfragen. Entwerfen Sie die Datenbank streng nach dem Datenbankdesign-Paradigma >3 .Verwenden Sie den Cache, um häufig aufgerufene Daten und Daten, die nicht häufig geändert werden müssen, in den Cache zu legen, wodurch Festplatten-E/A eingespart werden kann.
4 Festplattenwarteschlangen-Technologie (RAID0, RAID1, RDID5) usw.;
5. Die Verwendung der Tabellenpartitionierungstechnologie, die mit MySQL geliefert wird, um Daten in verschiedene Dateien zu schichten, kann die Leseeffizienz der Magnetplatte verbessern >
6. Durch vertikale Tabellenpartitionierung werden einige selten gelesene Daten in einer Tabelle gespeichert. 7. Die Master-Slave-Replikation trennt das Lesen Operationen und Schreiboperationen der Datenbank; 8. Untergeordnete Datenbanken, Tabellen und Maschinen (die Datenmenge ist extrem groß). die entsprechende Tabellen-Engine und Optimierungsparameter; 10. Führen Sie Caching, Statik und Verteilung durch. 11 . Schnellere Speichermethoden wie NoSQL verwenden, um häufig aufgerufene Daten zu speichern8. Gängige Anti-Crawler und Gegenmaßnahmen?
1). Anti-Crawling durch Header Das von Benutzern angeforderte Anti-Crawling von Headern ist die häufigste Anti-Crawling-Strategie. Viele Websites erkennen den User-Agent von Headern und einige Websites erkennen Referrer (das Anti-Leeching einiger Ressourcen-Websites besteht darin, Referrer zu erkennen). Wenn Sie auf diese Art von Anti-Crawler-Mechanismus stoßen, können Sie Header direkt zum Crawler hinzufügen und den User-Agent des Browsers in die Header des Crawlers kopieren oder den Referrer-Wert in den Domainnamen der Zielwebsite ändern. Anti-Crawler, die Header erkennen, können leicht umgangen werden, indem Header im Crawler geändert oder hinzugefügt werden. 2). Anti-Crawler basierend auf dem BenutzerverhaltenEs gibt auch einige Websites, die Benutzerverhalten erkennen, wie z. B. den mehrfachen Besuch derselben Seite in kurzer Zeit durch dieselbe IP. oder dasselbe Konto mehrmals in kurzer Zeit. Machen Sie dasselbe. Die meisten Websites befinden sich in der ersteren Situation. In dieser Situation kann die Verwendung eines IP-Proxys Abhilfe schaffen. Sie können einen speziellen Crawler schreiben, um die im Internet öffentlichen Proxy-IPs zu crawlen und sie nach der Erkennung alle zu speichern. Solche Proxy-IP-Crawler werden häufig verwendet, daher ist es am besten, selbst einen vorzubereiten. Nachdem Sie eine große Anzahl von Proxy-IPs haben, können Sie alle paar Anfragen eine IP ändern. Dies ist einfach in Anfragen oder urllib2 möglich, sodass Sie den ersten Anti-Crawler problemlos umgehen können. Im zweiten Fall können Sie nach jeder Anfrage zufällig ein paar Sekunden warten, bevor Sie die nächste Anfrage stellen. Einige Websites mit Logiklücken können die Einschränkung, dass dasselbe Konto nicht mehrmals in kurzer Zeit dieselbe Anfrage stellen kann, umgehen, indem sie mehrmals eine Anfrage stellen, sich abmelden, erneut anmelden und die Anfrage fortsetzen. 3) Anti-Crawler für dynamische SeitenDie meisten der oben genannten Situationen treten auf statischen Seiten auf, und es gibt auch einige Websites, auf denen die zum Crawlen erforderlichen Daten über Ajax-Anfragen abgerufen werden. Oder per JavaScript generiert. Verwenden Sie zunächst Fiddler, um Netzwerkanforderungen zu analysieren. Wenn wir die Ajax-Anfrage finden und die spezifischen Parameter und die spezifische Bedeutung der Antwort analysieren können, können wir die obige Methode verwenden, um die Ajax-Anfrage direkt mithilfe von Anfragen oder urllib2 zu simulieren und den Antwort-JSON zu analysieren, um die erforderlichen Daten zu erhalten.
Es ist großartig, eine Ajax-Anfrage zum Abrufen von Daten direkt simulieren zu können, aber einige Websites verschlüsseln alle Parameter der Ajax-Anfrage. Wir haben einfach keine Möglichkeit, eine Anfrage für die von uns benötigten Daten zu erstellen. Verwenden Sie in diesem Fall Selenium + PhantomJS, um den Browser-Kernel aufzurufen, und PhantomJS, um JS auszuführen, um menschliche Vorgänge zu simulieren und JS-Skripte auf der Seite auszulösen. Vom Ausfüllen des Formulars über das Klicken auf die Schaltfläche bis hin zum Scrollen der Seite kann alles simuliert werden, unabhängig vom spezifischen Anfrage- und Antwortprozess. Es wird lediglich der Prozess des Durchsuchens der Seite zum Abrufen von Daten vollständig simuliert.Die Verwendung dieses Frameworks kann die meisten Anti-Crawler fast umgehen, da es nicht vorgibt, ein Browser zu sein, um Daten abzurufen (das oben erwähnte Hinzufügen von Headern dient gewissermaßen dazu, so zu tun, als wäre es ein Browser), sondern ein Browser selbst, PhantomJS ist ein Browser ohne Schnittstelle, aber der Browser wird nicht von Menschen gesteuert. Selenium+phantomJS kann viele Dinge tun, wie z. B. das Identifizieren von Berührungs- (12306) oder verschiebbaren Bestätigungscodes, Brute-Force-Knacken von Seitenformularen usw.
9. Welche Probleme löst der verteilte Crawler hauptsächlich?
1)IP
2)Bandbreite
3)CPU
4)io
10. Wie gehe ich mit dem Bestätigungscode während des Crawler-Prozesses um?
1. Scrapy kommt mit
2. Kostenpflichtige Schnittstelle
Verwandte Lernempfehlungen: Python-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSehr detaillierte Python-Fragen im Vorstellungsgespräch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!