2016-07-10 18 views
1

Ich habe eine Anfrage funktioniert normal auf regulären Browsern aber nicht auf in scrapy Shell. Ein ganzer HTML-Block wird verschwinden, sobald ich "scrapy shell" oder "scrapy crawl" benutze. Ich bin nicht mit Sicherheit verboten.scrapy kein HTML-Element erkennen, aber es ist auf der Quellseite sichtbar

Hier unten ist das Thema auf der GitHub (mit Bildern), bevor ich in Richtung hier des untenstehenden Link (französisch Website Immobilien Auktion) mit einem normalen Browser wie mozilla Umleitung war:

https://github.com/scrapy/scrapy/issues/2109

Um es kurz zu machen, versuche ich eine Auktion Website zu kratzen. Und mit einem normalen Browser erscheinen alle Daten normal. Aber wenn ich mit dem scrapy Shell überprüft, ein ganzer HTML-Block fehlt vom response.body

scrapy shell http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html 

Selbst wenn ich meinen User-Agenten ändern, indem Sie Folgendes eingeben:

scrapy shell -s USER_AGENT='Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1' 'http...the rest of url' 

Ich habe versucht, das zu ändern User-Agent, wie mir gesagt wurde, ist ein potentielles Header-Problem oder ein Javascript-Problem.

Plus diese Fehlermeldung auf meinem Terminal sagt:

[1:1:0710/114628:ERROR:PlatformKeyboardEvent.cpp(117)] Not implemented reached in static PlatformEvent::Modifiers blink::PlatformKeyboardEvent::getCurrentModifierState()

nur für den Fall, ich DOWNLOAD_HANDLERS: {'s3': None} in meinen Einstellungen, um hinzuzufügen hatte eine Fehlermeldung loszuwerden.

Ich bin auf Ubuntu 14 laufen und ich habe Anaconda mit Scrapy 1.03 installiert.

Wo vermisse ich den Punkt bitte Leute?


EDIT: die Header-Lösung zu überprüfen, ich copy-paste derselben Header von mozilla-Browser, der gut in meine scrapy Shell arbeitet. Hier ist mein Code:

from scrapy import Request 

req = Request('MY_URL', 
    headers={ 
    'Accept': 'text/html, */*; q=0.01', 
    'Accept-Encoding': 'gzip, deflate, sdch', 
    'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 
    'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", 
    }) 

fetch(req) 

Die HTML-Daten fehlen noch.

Ist ein JavaScript möglich, um Scrapy zu verhindern?


EDIT:

ich auch scrapy-Splash mit seiner Docker Voraussetzung installiert.

Und dann habe ich versucht, dieses Problem zu beheben, indem Sie den Splash-Server verwenden.

NOCH DAS GLEICHE PROBLEM !!Hier ist mein Code:

$ scrapy shell 

from scrapy import Request 
from scrapy_splash import SplashRequest 
url='http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-paris/jeudi-7-juillet-2016.html' 
req = SplashRequest(url, args={'wait': 0.5}, 
headers={ 
'Accept': 'text/html, */*; q=0.01', 
'Accept-Encoding': 'gzip, deflate, sdch', 
'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 
'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", 
}) 

fetch(req) 
view(response) 

Also zusammenfassend, das ist, was ich getan habe:

  • Ich änderte meinen Header die gleiche meines Mozilla-Browser sein (das funktioniert)
  • I installiert Splash und versuchte, es zu verwenden, um JavaScript zu behandeln

Antwort

1

Dies ist ein Javascript-Problem.

Der Teil der Seite, der nicht geladen wird, wird dynamisch von einer AJAX-Anfrage aufgerufen.

Da Scrapy standardmäßig kein Javascript einschließlich AJAX-Anforderungen darstellt, bleibt der Inhalt des Blocks auf der Seite leer.

Dies ist definitiv in Scrapy mit Splash handhabbar.

Hier ist der Code für eine funktionierende Spinne, die die Seite richtig lädt.

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.shell import inspect_response 
from scrapy.shell import open_in_browser 
from scrapy_splash import SplashRequest 


class LicitorSpider(scrapy.Spider): 
    name = "licitor" 
    allowed_domains = ["licitor.com"] 
    start_urls = (
     'http://www.licitor.com/', 
    ) 

    def parse(self, response): 
     url = 'http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html' 
     yield SplashRequest(url=url, callback=self.parse_item, args={'wait': 0.5}) 

    def parse_item(self, response): 
     open_in_browser(response) 
     assert ("www.dbcj-avocats.com" in response.body), "XHR request not loaded" 
     inspect_response(response, self) 

Achten Sie darauf, die Splash Docker Instanz laufen, bevor Sie die Spinne und auch fügen Sie die folgenden Einstellungen an Ihre Spiders settings.py Datei ausführen.

SPLASH_URL = 'http://localhost:8050' 
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' 
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 

SPIDER_MIDDLEWARES = { 
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, 
} 

DOWNLOADER_MIDDLEWARES = { 
    'scrapy_splash.SplashCookiesMiddleware': 723, 
    'scrapy_splash.SplashMiddleware': 725, 
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, 
} 
0

Wenn Sie die tatsächliche HTML-Quelle von dieser Seite (view-source:http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html) sehen Sie werden nicht die Daten sehen Sie in der GitHub Problem eingekreist.

Wenn Sie Ihren Browser-Registerkarte Netzwerk überprüfen, wenn http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html Laden, erhalten Sie eine XHR Anfrage http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html

merken Wenn Sie diese Seite mit scrapy holen, werden Sie die gewünschten Daten erhalten.

Die Links zu den Anzeigen sind in einem <ul>

<div class="Container"> 
     <ul class="AdResults"> 
     <li> 
     <a class="Ad Archives First" href="/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html" 
      title="Un appartement, Avon, Seine-et-Marne, adjudication : 101 000 €"> 
... 

diese scrapy Shell-Sitzung Siehe:

$ scrapy shell http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html 
2016-07-10 20:08:35 [scrapy] INFO: Scrapy 1.0.6 started (bot: scrapybot) 
(...) 
2016-07-10 20:08:36 [scrapy] DEBUG: Crawled (200) <GET http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html> (referer: None) 
(...)  
In [1]: for link in response.css('ul.AdResults > li > a'): 
    print(link.xpath('@title').extract_first(), response.urljoin(link.xpath('@href').extract_first())) 
    ...:  
(u'Un appartement, Avon, Seine-et-Marne, adjudication : 101 000 \u20ac', u'http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html') 
(u"Une maison d'habitation, Montereau-Fault-Yonne (Seine-et-Marne), Seine-et-Marne, adjudication : 95 500 \u20ac", u'http://www.licitor.com/annonce/06/22/90/vente-aux-encheres/une-maison-d-habitation/montereau-fault-yonne-seine-et-marne/seine-et-marne/062290.html') 
(u"Une maison d'habitation, Chevry-en-Sereine (Seine-et-Marne), Seine-et-Marne, adjudication : 48 000 \u20ac", u'http://www.licitor.com/annonce/06/22/91/vente-aux-encheres/une-maison-d-habitation/chevry-en-sereine-seine-et-marne/seine-et-marne/062291.html') 

die Seite Fetching und Sammeln der Daten, was in <div class="AdContent" id="ad-062024"> zeigt, dass ein Browser angezeigt:

In [2]: fetch('http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html') 
2016-07-10 20:11:25 [scrapy] DEBUG: Crawled (200) <GET http://www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html> (referer: None) 
(...) 
In [3]: print(response.css('div.AdContent').xpath('normalize-space()').extract_first()) 
Annonce publiée le 27 avril 2016 62024 Tribunal de Grande Instance de Fontainebleau (Seine et Marne) Vente aux enchères publiques sur licitation en un lot mercredi 15 juin 2016 à 14h Un appartement Une cave Deux boxes en sous-solCadastré section A n°142, 150, 1.016, 1.017 et 1.075, lots n°132, 214, 240 et 242Le bien est occupé Adjudication : 101 000 € (Mise à prix : 100 000 €) Avon Résidence Les Jardins de Changis29 - 35, rue des Yèbles (exactitude non garantie) SCP Dumont, Bortolotti, Combes, Junguenet, Avocats 149, rue Grande - 77300 FontainebleauTél.: 01 60 71 57 11 www.dbcj-avocats.com Ferrari & Cie - Réf. A16/0239