2017-07-11 18 views
1

スプラッシュ(JavaScriptをレンダリングする)とTorをPrivoxy(匿名性を提供する)の両方を使用してDockerコンテナ内のScrapyスパイダーをクロールしようとしています。ここで私はこの目的のために使用していdocker-compose.ymlです:スクレーパーが持っているスプラッシュとスプラッシュをHTTPプロキシと組み合わせたときの "500 Internal Server Error"

version: '3' 

services: 
    scraper: 
    build: ./apk_splash 
    # environment: 
     # - http_proxy=http://tor-privoxy:8118 
    links: 
     - tor-privoxy 
     - splash 

    tor-privoxy: 
    image: rdsubhas/tor-privoxy-alpine 

    splash: 
    image: scrapinghub/splash 

Dockerfile

FROM python:alpine 
RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl bash 
RUN pip install scrapy scrapy-splash scrapy-fake-useragent 
COPY . /scraper 
WORKDIR /scraper 
CMD ["scrapy", "crawl", "apkmirror"] 

と私はクロールしようとしているクモ

import scrapy 
from scrapy_splash import SplashRequest 
from apk_splash.items import ApkmirrorItem 

class ApkmirrorSpider(scrapy.Spider): 
    name = 'apkmirror' 
    allowed_domains = ['apkmirror.com'] 
    start_urls = [ 
     'http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/', 
    ] 

    custom_settings = {'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'} 

    def start_requests(self): 
     for url in self.start_urls: 
      yield SplashRequest(url=url, callback=self.parse, endpoint='render.html', args={'wait': 0.5}) 

    def parse(self, response): 
     item = ApkmirrorItem() 
     item['url'] = response.url 
     item['developer'] = response.css('.breadcrumbs').xpath('.//*[re:test(@href, "^/(?:[^/]+/){1}[^/]+/$")]/text()').extract_first() 
     item['app'] = response.css('.breadcrumbs').xpath('.//*[re:test(@href, "^/(?:[^/]+/){2}[^/]+/$")]/text()').extract_first() 
     item['version'] = response.css('.breadcrumbs').xpath('.//*[re:test(@href, "^/(?:[^/]+/){3}[^/]+/$")]/text()').extract_first() 
     yield item 
です

settings.pyに以下を追加しました:

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

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

SPLASH_URL = 'http://splash:8050/' 

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' 
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 

scraperコンテナのenvironmentがコメントアウトされていれば、スクレーパーの多かれ少なかれ動作します。 I以下含むログを取得:私はdocker-compose.ymlenvironment行にコメント場合

scraper_1  | 2017-07-11 13:57:19 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/ via http://splash:8050/render.html> (referer: None) 
scraper_1  | 2017-07-11 13:57:19 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/> 
scraper_1  | {'app': 'Androbench (Storage Benchmark)', 
scraper_1  | 'developer': '[email protected]', 
scraper_1  | 'url': 'http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/', 
scraper_1  | 'version': '5.0'} 
scraper_1  | 2017-07-11 13:57:19 [scrapy.core.engine] INFO: Closing spider (finished) 
scraper_1  | 2017-07-11 13:57:19 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
scraper_1  | {'downloader/request_bytes': 1508, 
scraper_1  | 'downloader/request_count': 3, 
scraper_1  | 'downloader/request_method_count/GET': 2, 
scraper_1  | 'downloader/request_method_count/POST': 1, 
scraper_1  | 'downloader/response_bytes': 190320, 
scraper_1  | 'downloader/response_count': 3, 
scraper_1  | 'downloader/response_status_count/200': 2, 
scraper_1  | 'downloader/response_status_count/404': 1, 
scraper_1  | 'finish_reason': 'finished', 
scraper_1  | 'finish_time': datetime.datetime(2017, 7, 11, 13, 57, 19, 488874), 
scraper_1  | 'item_scraped_count': 1, 
scraper_1  | 'log_count/DEBUG': 5, 
scraper_1  | 'log_count/INFO': 7, 
scraper_1  | 'memusage/max': 49131520, 
scraper_1  | 'memusage/startup': 49131520, 
scraper_1  | 'response_received_count': 3, 
scraper_1  | 'scheduler/dequeued': 2, 
scraper_1  | 'scheduler/dequeued/memory': 2, 
scraper_1  | 'scheduler/enqueued': 2, 
scraper_1  | 'scheduler/enqueued/memory': 2, 
scraper_1  | 'splash/render.html/request_count': 1, 
scraper_1  | 'splash/render.html/response_count/200': 1, 
scraper_1  | 'start_time': datetime.datetime(2017, 7, 11, 13, 57, 13, 788850)} 
scraper_1  | 2017-07-11 13:57:19 [scrapy.core.engine] INFO: Spider closed (finished) 
apksplashcompose_scraper_1 exited with code 0 

は、しかし、私は500内部サーバーエラーを取得:要するに

scraper_1  | 2017-07-11 14:05:07 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <GET http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/ via http://splash:8050/render.html> (failed 3 times): 500 Internal Server Error 
scraper_1  | 2017-07-11 14:05:07 [scrapy.core.engine] DEBUG: Crawled (500) <GET http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/ via http://splash:8050/render.html> (referer: None) 
scraper_1  | 2017-07-11 14:05:07 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <500 http://www.apkmirror.com/apk/cslskku/androbench-storage-benchmark/androbench-storage-benchmark-5-0-release/androbench-storage-benchmark-5-0-android-apk-download/>: HTTP status code is not handled or not allowed 
scraper_1  | 2017-07-11 14:05:07 [scrapy.core.engine] INFO: Closing spider (finished) 
scraper_1  | 2017-07-11 14:05:07 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
scraper_1  | {'downloader/request_bytes': 3898, 
scraper_1  | 'downloader/request_count': 7, 
scraper_1  | 'downloader/request_method_count/GET': 4, 
scraper_1  | 'downloader/request_method_count/POST': 3, 
scraper_1  | 'downloader/response_bytes': 6839, 
scraper_1  | 'downloader/response_count': 7, 
scraper_1  | 'downloader/response_status_count/200': 1, 
scraper_1  | 'downloader/response_status_count/500': 6, 
scraper_1  | 'finish_reason': 'finished', 
scraper_1  | 'finish_time': datetime.datetime(2017, 7, 11, 14, 5, 7, 866713), 
scraper_1  | 'httperror/response_ignored_count': 1, 
scraper_1  | 'httperror/response_ignored_status_count/500': 1, 
scraper_1  | 'log_count/DEBUG': 10, 
scraper_1  | 'log_count/INFO': 8, 
scraper_1  | 'memusage/max': 49065984, 
scraper_1  | 'memusage/startup': 49065984, 
scraper_1  | 'response_received_count': 3, 
scraper_1  | 'retry/count': 4, 
scraper_1  | 'retry/max_reached': 2, 
scraper_1  | 'retry/reason_count/500 Internal Server Error': 4, 
scraper_1  | 'scheduler/dequeued': 4, 
scraper_1  | 'scheduler/dequeued/memory': 4, 
scraper_1  | 'scheduler/enqueued': 4, 
scraper_1  | 'scheduler/enqueued/memory': 4, 
scraper_1  | 'splash/render.html/request_count': 1, 
scraper_1  | 'splash/render.html/response_count/500': 3, 
scraper_1  | 'start_time': datetime.datetime(2017, 7, 11, 14, 4, 46, 717691)} 
scraper_1  | 2017-07-11 14:05:07 [scrapy.core.engine] INFO: Spider closed (finished) 
apksplashcompose_scraper_1 exited with code 0 

、レンダリングにスプラッシュを使用した場合JavaScriptでは、TorからPrivoxyを使用するために、HttpProxyMiddlewareを正常に使用することができません。誰かがここで間違っているのを見ることができますか?ポールさんのコメントに続いて

更新

、私は次のようにsplashサービスを適応しようとした:

私はそうのようなメインディレクトリに「スプラッシュ」ディレクトリを追加しました
splash: 
    image: scrapinghub/splash 
    volumes: 
     - ./splash/proxy-profiles:/etc/splash/proxy-profiles 

. 
├── apk_splash 
├── docker-compose.yml 
└── splash 
    └── proxy-profiles 
     └── proxy.ini 

およびproxy.ini読み取り

[proxy] 

host=tor-privoxy 
port=8118 

私が理解しているように、これはプロキシを常に使用する必要があります(つまり、 whitelistはデフォルトで".*"になり、blacklistにはなりません)。

しかし、再度docker-compose builddocker-compose upを入力しても、まだHTTP 500エラーが発生します。だから問題はこれらを解決する方法が残っている?

(ちなみに、この質問はhttps://github.com/scrapy-plugins/scrapy-splash/issues/117と似ていますが、私はCrawleraを使用していないため、回答の仕方がわかりません)。どのように私が実行しているためのよう

~$ docker ps -l 
CONTAINER ID  IMAGE      COMMAND     CREATED    STATUS    PORTS    NAMES 
04909e6ef5cb  apksplashcompose_scraper "scrapy crawl apkm..." 2 hours ago   Up 8 seconds       apksplashcompose_scraper_1 
~$ docker exec -it $(docker ps -lq) /bin/bash 
bash-4.3# python 
Python 3.6.1 (default, Jun 19 2017, 23:58:41) 
[GCC 5.3.0] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> socket.gethostbyname('tor-privoxy') 
'172.22.0.2' 

アップデート2

はパウロの第二のコメントに続いて、私は(それがまだ実行中)tor-privoxyはこれを行うことにより、容器内に解決されることを確認しましたスプラッシュ、それはリンクされたコンテナを介して、https://splash.readthedocs.io/en/stable/install.html#docker-folder-sharingに記載されている方法に似ています。

~$ docker exec -it apksplashcompose_splash_1 /bin/bash 
[email protected]:/# cd /etc/splash/proxy-profiles 
[email protected]:/etc/splash/proxy-profiles# ls 
proxy.ini 
[email protected]:/etc/splash/proxy-profiles# cat proxy.ini 
[proxy] 

host=tor-privoxy 
port=8118 

私はAquariumしようとしますが、現在の設定が動作しない理由を疑問は残る:私は/etc/splash/proxy-profiles/proxy.iniがコンテナ内に存在することを確認しましたか?

+1

[スプラッシュのプロキシプロファイル](https://splash.readthedocs.io/en/stable/api.html?#proxy-profiles)を使用してみましたか? –

+0

[paul trmbrth](https://stackoverflow.com/users/2572383/paul-trmbrth)、私はこれを試しました(更新された質問を参照)が、残念ながら私はまだ500のエラーを取得しています。 –

+1

愚かではないかもしれませんが、 'python3 -m splash.server --proxy-profiles-path = ...'を使ってSplashを実行していますか?ホストとしての 'tor-privoxy'はDockerイメージ内で解決しますか? –

答えて

0

paul trmbrthにより示唆されるようにAquariumプロジェクトの構造に続いて、私は.iniファイルdefault.ini、ないproxy.iniを(それ以外の場合は、自動的に「拾った」取得していない)名前を付けるために不可欠であることがわかりました。私はこの方法でスクレーパーを働かせることができました(私の自己回答How to use Scrapy with both Splash and Tor over Privoxy in Docker Compose参照)。

関連する問題