2017-08-25 4 views
4

Ich habe den folgenden Code ein, der teilweise funktioniert,Scrapy CrawlSpider + Splash: Wie folgt man Links durch Linkextractor?

class ThreadSpider(CrawlSpider): 
    name = 'thread' 
    allowed_domains = ['bbs.example.com'] 
    start_urls = ['http://bbs.example.com/diy'] 

    rules = (
     Rule(LinkExtractor(
      allow=(), 
      restrict_xpaths=("//a[contains(text(), 'Next Page')]") 
     ), 
      callback='parse_item', 
      process_request='start_requests', 
      follow=True), 
    ) 

def start_requests(self): 
    for url in self.start_urls: 
     yield SplashRequest(url, self.parse_item, args={'wait': 0.5}) 

def parse_item(self, response): 
    # item parser 

der Code wird nur für start_urls laufen, aber werden die Links angegeben in restricted_xpaths nicht folgen, wenn ich start_requests() Methode kommentieren und die Linie process_request='start_requests', in den Regeln, Es wird ausgeführt und folgen Links auf bestimmte, natürlich ohne js rendering.

Ich habe die zwei miteinander verbundenen Fragen lesen, CrawlSpider with Splash getting stuck after first URL und CrawlSpider with Splash und speziell scrapy.Request()-SplashRequest() im start_requests() Methode geändert, aber das scheint nicht zu funktionieren. Was ist falsch an meinem Code? Danke,

Antwort

0

Verwenden Sie den folgenden Code - Kopieren Sie einfach und fügen Sie ihn

restrict_xpaths=('//a[contains(text(), "Next Page")]') 

Statt

restrict_xpaths=("//a[contains(text(), 'Next Page')]") 
+0

das scheint nicht zu helfen. erinnere dich an die Zeile 'restrict_xpaths = (" // a [contains (text(), 'Next Page')] ")' funktioniert gut, wenn ich 'start_requests() 'auskommentiere. Wie auch immer ich merke, dass dies ein ungelöstes Problem ist, wie es von vielen Benutzern hier gemeldet wird: https://github.com/scrapy-plugins/scrapyps-splash/issues/92 –

0

ich ein ähnliches Problem gehabt haben, die Integration von Splash mit einem Scrapy CrawlSpider schien spezifisch. Es würde nur die Start-URL besuchen und dann schließen. Die einzige Möglichkeit, es zum Laufen zu bringen, war, das scrapy-splash-Plugin nicht zu verwenden und stattdessen die Methode 'process_links' zu verwenden, um die Splash-HTTP-API auf alle Links vorzubereiten, die scrapy sammelt. Dann habe ich andere Anpassungen vorgenommen, um die neuen Probleme zu kompensieren, die sich aus dieser Methode ergeben. Hier ist, was ich getan habe:

Sie haben diese beiden Tools, um die Splash-URL zusammen und dann auseinander nehmen, wenn Sie beabsichtigen, es irgendwo zu speichern.

from urllib.parse import urlencode, parse_qs 

Mit der Splash-URL zu jedem Link preppended wird, scrapy werden sie alle als 'Off-Site-Domain-Anfragen' filtern, so machen wir 'localhost' die erlaubte Domain machen.

allowed_domains = ['localhost'] 
start_urls = ['https://www.example.com/'] 

Jedoch stellt dies ein Problem dar, weil dann können wir endlos im Web-Crawling am Ende, wenn wir nur eine Website durchsuchen wollen. Lassen Sie uns das mit den LinkExtractor-Regeln beheben. Indem wir nur Links von unserer gewünschten Domain scrapen, umgehen wir das Offsite-Anfrage-Problem.

LinkExtractor(allow=r'(http(s)?://)?(.*\.)?{}.*'.format(r'example.com')), 
process_links='process_links', 

Hier ist die Methode process_links. Das Wörterbuch in der Urlencode-Methode enthält alle Ihre Splash-Argumente.

def process_links(self, links): 
    for link in links: 
     if "http://localhost:8050/render.html?&" not in link.url: 
      link.url = "http://localhost:8050/render.html?&" + urlencode({'url':link.url, 
                      'wait':2.0}) 
    return links 

schließlich aus der Splash-URL, die URL zu nehmen wieder die parse_qs Methode verwenden.

parse_qs(response.url)['url'][0] 

Eine letzte Anmerkung zu diesem Ansatz. Du wirst bemerken, dass ich zu Beginn eine "&" in der Splash-URL habe. (... render.html? &). Dies macht das Parsen der Splash-URL zum Entfernen der tatsächlichen URL konsistent, unabhängig davon, in welcher Reihenfolge Sie die Argumente haben, wenn Sie die Methode urlencode verwenden.

Verwandte Themen