2

通常のブラウザでは正常に機能するリクエストがありますが、スクレイピー シェルでは機能しません。「スクレイピー シェル」または「スクレイピー クロール」を使用すると、HTML ブロック全体がすぐに消えてしまいます。私は確かに禁止されていません。

以下は、mozilla のような通常のブラウザを使用して、以下のリンク (フランスの Web サイト プロパティ オークション) のこちらにリダイレクトされる前の github (写真付き) の問題です。

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

簡単に言うと、オークションサイトをスクレイピングしてみました。また、通常のブラウザでは、すべてのデータが正常に表示されます。しかし、scrapy シェルで確認したところ、response.body から HTML ブロック全体が欠落しています。

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

次のように入力してユーザーエージェントを変更した場合でも:

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'

潜在的なヘッダーの問題またはJavaScriptの問題であると言われたため、ユーザーエージェントを変更しようとしました。

さらに、端末のこのメッセージエラーは次のように述べています。

[1:1:0710/114628:ERROR:PlatformKeyboardEvent.cpp(117)] 静的 PlatformEvent::Modifiers で実装されていません。blink::PlatformKeyboardEvent::getCurrentModifierState()

DOWNLOAD_HANDLERS: {'s3': None} 念のため、エラー メッセージを取り除くために設定を追加する必要がありました。

私はubuntu 14で実行しており、scrapy 1.03でanacondaをインストールしています。

人々を喜ばせるポイントをどこで見逃していますか?


編集: ヘッダー ソリューションを確認するために、うまく機能する mozilla ブラウザーから同じヘッダーをコピーして、私のスクレイピー シェルに貼り付けます。これが私のコードです:

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)

HTML データがまだありません。

JavaScriptがスクレイピーの動作を妨げる可能性はありますか?


編集:

また、docker の前提条件を使用して、scrapy-splash をインストールしました。

そして、スプラッシュサーバーを使用してこの問題を処理しようとしました。

それでも同じ問題!! これが私のコードです:

$ 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)

要約すると、これは私がしたことです:

  • ヘッダーを Mozilla ブラウザーと同じになるように変更しました (動作します)。
  • Splashをインストールして、それを使ってjavascriptを処理しようとしました
4

2 に答える 2

2

これは Javascript の問題です。

ロードされないページのセクションは、AJAX 要求によって動的に呼び出されます。

Scrapy はデフォルトで AJAX リクエストを含む Javascript をレンダリングしないため、ページ内のブロックの内容は空のままです。

これは、Splash を使用して Scrapy で確実に処理できます。

ページを適切にロードする動作中のスパイダーのコードを次に示します。

# -*- 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)

Spider を実行する前に Splash Docker インスタンスが実行されていることを確認し、次の設定を Spiderssettings.pyファイルに追加します。

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,
}
于 2016-07-10T18:08:17.910 に答える
0

そのページ ( view-source:http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.html) から実際の HTML ソースを表示すると、GitHub の問題で丸で囲んだデータは表示されません。

http://www.licitor.com/ventes-judiciaires-immobilieres/tgi-fontainebleau/mercredi-15-juin-2016.htmlをロードするときに、ブラウザーのネットワーク タブを調べると、httpへの XHR 要求に気付くでしょう。 //www.licitor.com/annonce/06/20/24/vente-aux-encheres/un-appartement/avon/seine-et-marne/062024.html

このページをスクレイピーで取得すると、必要なデータが得られます。

広告へのリンクは<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 €">
...

このスクレイピー シェル セッションを参照してください。

$ 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')

ページを取得して内容を収集<div class="AdContent" id="ad-062024">すると、ブラウザが表示するデータが表示されます。

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
于 2016-07-10T18:14:22.850 に答える