Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiel-Tutorial für einen Python-Crawling-Artikel

Beispiel-Tutorial für einen Python-Crawling-Artikel

巴扎黑
巴扎黑Original
2017-08-07 17:37:451858Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Verwendung von Python zum Crawlen von Artikeln auf Prosa-Websites ein. Die Einführung im Artikel ist sehr detailliert und bietet einen gewissen Referenz- und Lernwert für alle Freunde, die sie benötigen.

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Inhalte zu Python-Crawling-Prosa-Netzwerkartikeln vor. Er wird als Referenz und zum Studium zur Verfügung gestellt:

Das Rendering ist wie folgt:


Konfigurieren Sie Python 2.7


 bs4

 requests

Installation mit pipsudo pip install bs4


sudo pip install requests

Da es Webseiten crawlt, werde ich es tun Führen Sie find und find_all ein.

Der Unterschied zwischen find und find_all besteht darin, dass das, was zurückgegeben wird, unterschiedlich ist; find gibt das erste übereinstimmende Tag zurück und der Inhalt im Tag

find_all gibt eine Liste zurück

Beispielsweise schreiben wir eine test.html, um den Unterschied zwischen find und find_all zu testen.

Der Inhalt ist:


<html>
<head>
</head>
<body>
<p id="one"><a></a></p>
<p id="two"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >abc</a></p>
<p id="three"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a></p>
<p id="four"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >four<p>four p</p><p>four p</p><p>four p</p> a</a></p>
</body>
</html>

Dann lautet der Code von test.py:


from bs4 import BeautifulSoup
import lxml

if __name__==&#39;__main__&#39;:
 s = BeautifulSoup(open(&#39;test.html&#39;),&#39;lxml&#39;)
 print s.prettify()
 print "------------------------------"
 print s.find(&#39;p&#39;)
 print s.find_all(&#39;p&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id=&#39;one&#39;)
 print s.find_all(&#39;p&#39;,id=&#39;one&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id="two")
 print s.find_all(&#39;p&#39;,id="two")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="three")
 print s.find_all(&#39;p&#39;,id="three")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="four")
 print s.find_all(&#39;p&#39;,id="four")
 print "------------------------------"

Nach dem Ausführen können wir das Ergebnis sehen. Beim Abrufen einer Gruppe von Tags wird der Unterschied zwischen den beiden angezeigt .


Wir müssen also darauf achten, was wir wollen, wenn wir es verwenden, sonst erscheint ein Fehler

Der nächste Schritt ist es, Webseiteninformationen durch Anfragen zu erhalten. Warum schreibe ich gehörte und andere Dinge? Ich greife direkt auf die Webseite zu und erhalte mehrere klassifizierte sekundäre Webseiten Durch die Methode get und dann einen Gruppentest bestehen, um alle Webseiten zu crawlen


In diesem Teil des Codes habe ich das

nicht verarbeitet Das sind nicht 200. Das daraus resultierende Problem besteht darin, dass der Fehler nicht angezeigt wird und der gecrawlte Inhalt verloren geht. Dann habe ich die Webseite der Prosa-Website analysiert und festgestellt, dass sie www.sanwen.net/rizhi/&p=1 war.
def get_html():
 url = "https://www.sanwen.net/"
 two_html = [&#39;sanwen&#39;,&#39;shige&#39;,&#39;zawen&#39;,&#39;suibi&#39;,&#39;rizhi&#39;,&#39;novel&#39;]
 for doc in two_html:
 i=1
  if doc==&#39;sanwen&#39;:
  print "running sanwen -----------------------------"
  if doc==&#39;shige&#39;:
  print "running shige ------------------------------"
  if doc==&#39;zawen&#39;:
  print &#39;running zawen -------------------------------&#39;
  if doc==&#39;suibi&#39;:
  print &#39;running suibi -------------------------------&#39;
  if doc==&#39;rizhi&#39;:
  print &#39;running ruzhi -------------------------------&#39;
  if doc==&#39;nove&#39;:
  print &#39;running xiaoxiaoshuo -------------------------&#39;
 while(i<10):
 par = {&#39;p&#39;:i}
 res = requests.get(url+doc+&#39;/&#39;,params=par)
 if res.status_code==200:
  soup(res.text)
  i+=i

res.status_codeDer Maximalwert von p ist 10. Ich verstehe das nicht Als ich die Festplatte das letzte Mal gecrawlt habe, waren es 100 Seiten. Vergessen Sie es und analysieren Sie es später. Rufen Sie dann den Inhalt jeder Seite über die get-Methode ab.

Nachdem Sie den Inhalt jeder Seite erhalten haben, analysieren Sie den Autor und den Titel. Der Code sieht so aus:


Es gibt einen Ich möchte euch fragen, warum ihr nicht nur einen, sondern auch zwei Schrägstriche in den Dateinamen einfügt, als ich die Datei später schrieb. Also habe ich einen regulären Ausdruck geschrieben und werde ihn Ihnen geben. Ändern Sie Ihre Karriere.

def soup(html_text):
 s = BeautifulSoup(html_text,&#39;lxml&#39;)
 link = s.find(&#39;p&#39;,class_=&#39;categorylist&#39;).find_all(&#39;li&#39;)
 for i in link:
 if i!=s.find(&#39;li&#39;,class_=&#39;page&#39;):
 title = i.find_all(&#39;a&#39;)[1]
 author = i.find_all(&#39;a&#39;)[2].text
 url = title.attrs[&#39;href&#39;]
 sign = re.compile(r&#39;(//)|/&#39;)
 match = sign.search(title.text)
 file_name = title.text
 if match:
 file_name = sign.sub(&#39;a&#39;,str(title.text))

Der letzte Schritt besteht darin, den Prosainhalt zu erhalten, indem wir die Artikeladresse analysieren und dann den Inhalt erhalten, den ich ursprünglich einzeln erhalten wollte die Webadresse, was Ärger erspart.


Schreiben Sie abschließend die Datei und speichern Sie sie in Ordnung

def get_content(url):
 res = requests.get(&#39;https://www.sanwen.net&#39;+url)
 if res.status_code==200:
 soup = BeautifulSoup(res.text,&#39;lxml&#39;)
 contents = soup.find(&#39;p&#39;,class_=&#39;content&#39;).find_all(&#39;p&#39;)
 content = &#39;&#39;
 for i in contents:
 content+=i.text+&#39;\n&#39;
 return content


Drei Funktionen, um die zu erhalten Prosa-Netzwerk Prosa, aber es gibt ein Problem, dass ich nicht weiß, warum einige Artikel verloren gehen. Dies unterscheidet sich stark von den Artikeln auf Prose.com Seite für Seite. Ich hoffe, jemand kann mir bei diesem Problem helfen. Vielleicht sollten wir die Webseite unzugänglich machen. Natürlich denke ich, dass es etwas mit dem kaputten Netzwerk in meinem Wohnheim zu tun hat

 f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)

 print &#39;running w txt&#39;+file_name+&#39;.txt&#39;
 f.write(title.text+&#39;\n&#39;)
 f.write(author+&#39;\n&#39;)
 content=get_content(url) 
 f.write(content)
 f.close()


Ich hätte das Rendering fast vergessen

 f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)
 print &#39;running w txt&#39;+file_name+&#39;.txt&#39;
 f.write(title.text+&#39;\n&#39;)
 f.write(author+&#39;\n&#39;)
 content=get_content(url) 
 f.write(content)
 f.close()

Es kann zu einem Timeout-Phänomen kommen. Ich kann nur sagen, dass Sie eine gute Internetverbindung wählen müssen, wenn Sie zur Uni gehen!

Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial für einen Python-Crawling-Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn