2017-10-12 4 views
-4

Hallo ich möchte die Daten von http://economictimes.indiatimes.com/archive.cms crawlen, werden alle URLs basierend auf Datum, Monat und Jahr archiviert, um zuerst die URL-Liste Ich verwende den Code von https://github.com/FraPochetti/StocksProject/blob/master/financeCrawler/financeCrawler/spiders/urlGenerator.py, modifiziert die Code für meine Webseite,URLs rekursiv aus Website-Archiven in scrapy extrahieren

import scrapy 
import urllib  
def etUrl(): 
    totalWeeks = [] 
    totalPosts = [] 
    url = 'http://economictimes.indiatimes.com/archive.cms' 
    data = urllib.urlopen(url).read() 
    hxs = scrapy.Selector(text=data) 
    months = hxs.xpath('//ul/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news.cms') 
    admittMonths = 12*(2013-2007) + 8 
    months = months[:admittMonths] 
    for month in months: 
     data = urllib.urlopen(month).read() 
     hxs = scrapy.Selector(text=data) 
     weeks = hxs.xpath('//ul[@class="weeks"]/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news/day\\d+\.cms') 
     totalWeeks += weeks 
     for week in totalWeeks: 
      data = urllib.urlopen(week).read() 
      hxs = scrapy.Selector(text=data) 
      posts = hxs.xpath('//ul[@class="archive"]/li/h1/a/@href').extract() 
      totalPosts += posts 
      with open("eturls.txt", "a") as myfile: 
       for post in totalPosts: 
        post = post + '\n' 
        myfile.write(post) 

etUrl() 

gespeicherte Datei als urlGenerator.py und lief mit dem Befehl $ python urlGenerator.py ich kein Ergebnis bin immer, könnte mir jemand helfen, wie Sie diesen Code für Fall meiner Nutzung der Website zu übernehmen oder eine andere Lösung?

+0

gibt es einen Aufruf von 'etUrl()', traditionell geschützt durch 'if __name__ ==" __main__ ": etUrl()' type Struktur? –

+1

es ist auch ** SEHR WEIß ** Scrapy zu installieren, aber dann 'urllib' basierte Anfrage-Antwort zu verwenden; wohl, 50% von Scrapys Macht liegt darin, wie es mit diesem ganzen Prozess umgeht - einschließlich klar definierter Callbacks, um die 4-tiefe Einrückung zu vermeiden, die du dort hast –

+0

Ich habe mir die Freiheit genommen, deinen Beitrag ein bisschen aufzuräumen, seit ich nehme an, du wolltest nicht 'etUrl()' rekursiv am unteren Rand aufrufen ... – Iguananaut

Antwort

0

Versuchen Sie, den Code Zeile für Zeile mit pdb zu durchlaufen. Führen Sie python -m pdb urlGenerator.py aus und befolgen Sie die Anweisungen zur Verwendung von pdb auf der verknüpften Seite.

Wenn Sie durch den Code Zeile für Zeile Schritt können Sie sehen sofort, dass die Leitung

data = urllib.urlopen(url).read() 

versagt etwas Nützliches zurück:

(pdb) print(data) 
<HTML><HEAD> 
<TITLE>Access Denied</TITLE> 
</HEAD><BODY> 
<H1>Access Denied</H1> 

You don't have permission to access "http&#58;&#47;&#47;economictimes&#46;indiatimes&#46;com&#47;archive&#46;cms" on this server.<P> 
Reference&#32;&#35;18&#46;6057c817&#46;1508411706&#46;1c3ffe4 
</BODY> 
</HTML> 

Es scheint, dass sie keinen Zugang ermöglicht durch Pythons urllib. Wie in den Kommentaren erwähnt, sollten Sie sowieso nicht urllib verwenden - Scrapy ist bereits geschickt im Umgang damit.

Eine Menge der Rest Ihres Codes ist auch klar gebrochen. Zum Beispiel diese Zeile:

months = hxs.xpath('//ul/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news.cms') 

gibt eine leere Liste sogar angesichts der realen HTML von dieser Website. Wenn Sie sich das HTML ansehen, ist es eindeutig in einer Tabelle, nicht unsortierten Listen (<ul>). Sie haben auch das URL-Format falsch. Statt so etwas wie dies funktionieren würde:

months = response.xpath('//table//tr//a/@href').re(r'/archive/year-\d+,month-\d+.cms') 

Wenn Sie einen Web Scraper bauen wollen, anstatt von Code beginnen gefunden Sie (das ist nicht einmal richtig) und es blind ändern zu versuchen, versuchen, die official tutorial for Scrapy folgende und beginnen Sie mit einigen sehr einfachen Beispielen, dann bauen Sie von dort auf. Zum Beispiel:

class EtSpider(scrapy.Spider): 
    name = 'et' 
    start_urls = ["https://economictimes.indiatimes.com/archive.cms"] 

    def parse(self, response): 
     months = response.xpath('//table//tr//a/@href').re(r'/archive/year-\d+,month-\d+.cms') 
     for month in months: 
      self.logger.info(month) 

process = scrapy.crawler.CrawlerProcess() 
process.crawl(EtSpider) 
process.start() 

Dies läuft richtig, und man kann es deutlich sehen, die richtigen URLs für die einzelnen Monate zu finden, als in das Protokoll gedruckt. Jetzt können Sie von dort aus gehen und Callbacks verwenden, wie in der Dokumentation erläutert, um weitere zusätzliche Anforderungen zu stellen.

Am Ende sparen Sie sich viel Zeit und Ärger, indem Sie die Dokumente lesen und etwas verstehen, anstatt etwas dubiosen Code aus dem Internet zu nehmen und ihn in Ihr Problem zu schüren.