2017-11-11 3 views
0

Ich bin neu in Scrapy und ich versuche gerade einen CrawlSpider zu schreiben, der ein Forum auf dem Tor Darknet crawlen wird. Derzeit ist mein CrawlSpider Code ist:Wie kann ich mit meinem scrapy CrawlSpider relative Pfade in absolute Pfade umwandeln?

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 

class HiddenAnswersSpider(CrawlSpider): 
    name = 'ha' 
    start_urls = ['http://answerstedhctbek.onion/questions'] 
    allowed_domains = ['http://answerstedhctbek.onion', 'answerstedhctbek.onion'] 
    rules = (
      Rule(LinkExtractor(allow=(r'answerstedhctbek.onion/\d\.\*', r'https://answerstedhctbek.onion/\d\.\*')), follow=True, process_links='makeAbsolutePath'), 
      Rule(LinkExtractor(allow=()), follow=True, process_links='makeAbsolutePath') 

      ) 

def makeAbsolutePath(links): 
    for i in range(links): 
      links[i] = links[i].replace("../","") 
    return links 

Da das Forum relativen Pfad verwendet, habe ich versucht, eine benutzerdefinierte process_links zu erstellen, um die „../“ jedoch zu entfernen, wenn ich meinen Code ausführen ich noch recieving:

2017-11-11 14:46:46 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 http://answerstedhctbek.onion/../badges>: HTTP status code is not handled or not allowed 
2017-11-11 14:46:46 [scrapy.core.engine] DEBUG: Crawled (400) <GET http://answerstedhctbek.onion/../general-guidelines> (referer: http://answerstedhctbek.onion/questions) 
2017-11-11 14:46:47 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 http://answerstedhctbek.onion/../general-guidelines>: HTTP status code is not handled or not allowed 
2017-11-11 14:46:47 [scrapy.core.engine] DEBUG: Crawled (400) <GET http://answerstedhctbek.onion/../contact-us> (referer: http://answerstedhctbek.onion/questions) 
2017-11-11 14:46:47 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 http://answerstedhctbek.onion/../contact-us>: HTTP status code is not handled or not allowed 
2017-11-11 14:46:48 [scrapy.core.engine] DEBUG: Crawled (400) <GET http://answerstedhctbek.onion/../questions?sort=hot> (referer: http://answerstedhctbek.onion/questions) 
2017-11-11 14:46:48 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 http://answerstedhctbek.onion/../questions?sort=hot>: HTTP status code is not handled or not allowed 
2017-11-11 14:46:48 [scrapy.core.engine] DEBUG: Crawled (400) <GET http://answerstedhctbek.onion/../questions?sort=votes> (referer: http://answerstedhctbek.onion/questions) 

Wie Sie sehen können, bekomme ich immer noch 400 Fehler aufgrund des schlechten Pfades. Warum entfernt mein Code die "../" nicht von den Links?

Danke!

Antwort

0

Das Problem könnte sein, dass makeAbsolutePaths nicht Teil der Spider-Klasse ist. The documentation states:

process_links is a callable, or a string (in which case a method from the spider object with that name will be used)

Sie verwenden nicht self in makeAbsolutePaths, so dass ich davon ausgehen, es nicht eine Vertiefung Fehler ist. makeAbsolutePaths hat auch einige andere Fehler. Wenn wir korrigieren Sie den Code in diesen Zustand:

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 


class HiddenAnswersSpider(CrawlSpider): 
    name = 'ha' 
    start_urls = ['file:///home/user/testscrapy/test.html'] 
    allowed_domains = [] 
    rules = (
      Rule(LinkExtractor(allow=(r'.*')), follow=True, process_links='makeAbsolutePath'), 
      ) 

    def makeAbsolutePath(self, links): 
     print(links) 
     for i in range(links): 
      links[i] = links[i].replace("../","") 
     return links 

es diesen Fehler ergeben wird:

TypeError: 'list' object cannot be interpreted as an integer 

Dies ist, weil kein Aufruf len() im Aufruf von range verwendet wurde und range kann nur arbeiten auf ganze Zahlen. Sie will eine Nummer und geben Sie den Bereich von 0 bis diese Nummer minus 1

Nach dieser Frage Festsetzung, wird es den Fehler geben:

AttributeError: 'Link' object has no attribute 'replace' 

Dies ist - denn anders als Sie dachten - links ist keine Liste von Strings, die den Inhalt von href="" Attribute enthalten. Stattdessen ist es eine Liste von Link Objekten.

Ich würde empfehlen, geben Sie den Inhalt links innerhalb makeAbsolutePath und sehen, ob Sie überhaupt etwas tun müssen. Meiner Meinung nach sollte Scrapy bereits ..-Operatoren auflösen, sobald es die Domänenebene erreicht, also sollten Ihre Links auf http://answerstedhctbek.onion/<number>/<title> zeigen, obwohl die Website .. -Operator ohne eine tatsächliche Ordnerebene verwendet (wie die URL ist /questions und nicht /questions/).

Irgendwie wie folgt aus:

def makeAbsolutePath(self, links): 
     for i in range(len(links)): 
      print(links[i].url) 

     return [] 

Wenn Sie dann herausfinden, die URLs (hier eine leere Liste zurückkehrend gibt Ihnen den Vorteil, dass die Spinne wird die Konsolenausgabe stoppen und Sie können überprüfen) tatsächlich falsch sind, können Sie einiges an Arbeit auf sie durch das url Attribut ausführen:

links[i].url = 'http://example.com' 
+0

Aufziehvogel, es endlich richtig funktioniert dank an Sie! Ich konnte keinen der oben genannten Fehler erhalten, bis ich "self" als Parameter in makeAbsolutePath hinzugefügt habe. Das Hinzufügen von "Selbst" einschließlich aller anderen von Ihnen genannten Auflösungen hat das Problem gelöst.Die URLs waren immer noch falsch, aber ich war in der Lage, einfach die Linie Links [i] .url = Links [i] .url.replace ('../', '') – ToriTompkins