2017-05-11 3 views
0

Der von mir erstellte Crawler ruft Namen und URLs von einer Webseite ab. Jetzt kann ich mir keine Idee machen, meinen Crawler dazu zu bringen, die von next_page erzeugten Links zu verwenden, um Daten von der nächsten Seite zu holen. Ich bin sehr neu in der Erstellung von Crawlern mit Klassen, weil ich mich nicht weiter bewegen kann. Ich habe bereits eine Initiative ergriffen, um eine kleine Wendung in meinem Code zu machen, aber es bringt weder ein Ergebnis noch löst es einen Fehler aus. Hoffe, dass jemand einen Blick darauf werfen wird.Die generierten Links für die nächste Seite können nicht rekursiv gecrawlt werden

import requests 
from lxml import html 

class wiseowl: 
    def __init__(self,start_url): 
     self.start_url=start_url 
     self.storage=[] 

    def crawl(self): 
     self.get_link(self.start_url) 

    def get_link(self,link): 
     url="http://www.wiseowl.co.uk" 
     response=requests.get(link) 
     tree=html.fromstring(response.text) 
     name=tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']/a/text()") 
     urls=tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']/a/@href") 
     docs=(name,urls) 
     self.storage.append(docs) 

     next_page=tree.xpath("//div[contains(concat(' ', @class, ' '), ' woPaging ')]//a[@class='woPagingItem']/@href") 
     for npage in next_page: 
      if npage is not None: 
       self.get_link(url+npage) 


    def __str__(self): 
     return "{}".format(self.storage) 


crawler=wiseowl("http://www.wiseowl.co.uk/videos/") 
crawler.crawl() 
for item in crawler.storage: 
    print(item) 

Antwort

1

ich einige Teile Ihrer Klasse geändert, es zu versuchen:

class wiseowl: 
    def __init__(self,start_url): 
     self.start_url=start_url 
     self.links = [ self.start_url ] # a list of links to crawl # 
     self.storage=[] 

    def crawl(self): 
     for link in self.links : # call get_link for every link in self.links # 
      self.get_link(link) 

    def get_link(self,link): 
     print('Crawling: ' + link) 
     url="http://www.wiseowl.co.uk" 
     response=requests.get(link) 
     tree=html.fromstring(response.text) 
     name=tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']/a/text()") 
     urls=tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']/a/@href") 
     docs=(name,urls) 
     #docs=(name, [url+u for u in urls]) # use this line if you want to join the urls # 
     self.storage.append(docs) 
     next_page=tree.xpath("//div[contains(concat(' ', @class, ' '), ' woPaging ')]//*[@class='woPagingItem' or @class='woPagingNext']/@href") # get links form 'woPagingItem' or 'woPagingNext' # 
     for npage in next_page: 
      if npage and url+npage not in self.links : # don't get the same link twice # 
       self.links += [ url+npage ] 

    def __str__(self): 
     return "{}".format(self.storage) 

crawler=wiseowl("http://www.wiseowl.co.uk/videos/") 
crawler.crawl() 
for item in crawler.storage: 
    item = zip(item[0], item[1]) 
    for i in item : 
     print('{:60} {}'.format(i[0], i[1])) # you can change 60 to the value you want # 
+0

Danke sir t.m.adam, für Ihre Antwort. Es gibt nichts zu versuchen. Jedes Mal, wenn du meinen unordentlichen Code berührst, funktioniert es wie Magie, so wie es jetzt ist. Eine weitere Sache, die ich von hier erwarte, ist: Wie kann ich die Ergebnisse in zwei Spalten anzeigen, wie in Videotitel in der ersten Spalte und Link ist in der zweiten Spalte. Ich meinte, dass der resultierende Code als Liste geparst wird. Es ist alles meine Schuld obwohl. Danke nochmal, mein Herr. – SIM

+1

Ich aktualisierte die for-Schleife, druckt zwei Spalten. Sie können die 8. Zeile in 'get_link' auskommentieren, wenn Sie möchten, dass die Links vollständige URLs sind –

+0

OMG !!!!! Was Sie hier getan haben, ist völlig jenseits meiner Erwartung. Es löst alle Probleme. Lang lebe Sir t.m.adam !!!! – SIM

0

Sie denken sollen, irgendeine Art von Datenstruktur unter Verwendung beiden besuchten Links zu halten (um Endlosschleifen zu vermeiden) sowie ein Behälter für Links, die Sie noch haben zu besuchen. Krabbeln ist im Wesentlichen eine erste Suche im Internet. Also, sollten Sie Google erste Suche googlen, um ein besseres Verständnis des zugrunde liegenden Algorithmus zu erhalten.

  1. Implementieren Sie eine Warteschlange für Links, die Sie besuchen müssen. Jedes Mal, wenn Sie einen Link besuchen, scrappen Sie die Seite für alle Links und fügen Sie sie in die Warteschlange ein.
  2. Implementieren Sie eine Gruppe in Python oder einem Wörterbuch, um zu prüfen, ob die in die Warteschlange eingereihten Verbindungen bereits besucht wurden. Wenn sie besucht wurden, können Sie sie nicht in die Warteschlange stellen.
  3. Crawler Methode sollte so etwas wie:

    def crawler(self): 
    while len(self.queue): 
    curr_link = self.queue.pop(0) 
    # process curr_link here -> scrape and add more links to queue 
    # mark curr_link as visited 
    
+0

Dank ryankdwyer, für deine Antwort. Eigentlich bin ich mehr oder weniger mit Looping vertraut. Ich hatte nicht die Absicht, in meinem Beitrag zu fragen, wie die Art meiner Schleife eher sein sollte. Ich fragte, wie ich meine neu erstellten Links zu der Methode befördere, so dass es eine Schleife sein kann und holen, was ich von ihr erwarte. – SIM

Verwandte Themen