2017-04-20 17 views
1

URL http://www.apkmirror.com/apk/sony-mobile-communications/foldinghome/foldinghome-1-00-40-release/foldinghome-1-00-40-android-apk-download/のScrapyシェルで、開発者、アプリ、バージョン名をナビゲーションバーから抽出しようとしています:Scrapyでは、「@」を含むリンクのテキストを抽出できません

enter image description here

私は次のXPathセレクタを試してみた:

In [6]: response.xpath('//*[@class="breadcrumbs"]//a/text()').extract() 
Out[6]: [u'Sony Mobile Communications', u'1.00.40'] 

しかし、[email protected]、そのアプリ名に気づく、結果のうちではありません。 <a>タグを持っているように見えるんので、私は(Chromeで「点検」を使用して示すように)このことを理解していない:

enter image description here

また、似たようなサイト、http://www.apkmirror.com/apk/oculus-vr/oculus-rooms/oculus-rooms-0-0-2-release/oculus-rooms-0-0-2-android-apk-download/のために、このセレクタが作業を行います。

In [1]: response.xpath('//*[@class="breadcrumbs"]//a/text()').extract() 
Out[1]: [u'Oculus VR', u'Oculus Rooms', u'0.0.2'] 

私は、これはそれが@シンボルとtext()<a>の要素を選択しないことにより、Scrapyのバグのいくつかの種類であるかもしれないことを疑うし始めています。これが当てはまるかもしれませんか? Chromeの「ページのソースを表示」オプションの代わりに、「点検」を使用して、ページのソースを表示

答えて

1

既にご存知のように、ブレッドクラムリンクの1つは「保護され」ており、ブラウザでJavaScriptが実行されて動的に構築されます。

この問題に簡単にアプローチするには、Splashからscrapy-splashミドルウェア経由でページのコンテンツを渡すことです。これは私のために働いた:次の設定で

import scrapy 
from scrapy_splash import SplashRequest 


class ApkSpider(scrapy.Spider): 
    name = "apkmirror" 
    allowed_domains = ['apkmirror.com'] 

    def start_requests(self): 
     yield SplashRequest(
      'http://www.apkmirror.com/apk/sony-mobile-communications/foldinghome/foldinghome-1-00-40-release/foldinghome-1-00-40-android-apk-download/', 
      self.parse_result, 
      ) 

    def parse_result(self, response): 
     print(response.xpath('//*[@class="breadcrumbs"]//a/text()').extract()) 

SPLASH_URL = 'http://127.0.0.1:8050' 
SPLASH_COOKIES_DEBUG = True 

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

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

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' 

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 

Splashをポート8050にドッキングウィンドウコンテナで実行されています。

プリント:

[u'Sony Mobile Communications', u'[email protected]', u'1.00.40'] 
1

は、私は、この特定のリンクのナビゲーションバーにはJavaScriptが含まれていることを参照してください。

<nav style="margin-left:16px; margin-right:16px;" class="navbar navbar-default" role="navigation"> 
<div style="color: #013967 !important;" class="breadcrumbs"><a class="withoutripple" style="color: #013967 !important;" href="/apk/sony-mobile-communications/">Sony Mobile Communications</a> <svg class="icon chevron-icon"><use xlink:href="#apkm-icon-chevron"></use></svg> <a class="withoutripple " style="color: #013967 !important;" href="/apk/sony-mobile-communications/foldinghome/"><span class="__cf_email__" data-cfemail="c781a8aba3aea9a0878fa8aaa2">[email&#160;protected]</span><script data-cfhash='f9e31' type="text/javascript">/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */</script></a> <svg class="icon chevron-icon"><use xlink:href="#apkm-icon-chevron"></use></svg> <a class="active withoutripple" style="color: #013967 !important;" href="/apk/sony-mobile-communications/foldinghome/foldinghome-1-00-40-release/">1.00.40</a> </nav> 

一方でオクルス部屋ページの第二の例では、それはしません:ScrapyでJavaScriptを取り扱い

<nav style="margin-left:16px; margin-right:16px;" class="navbar navbar-default" role="navigation"> 
<div style="color: #646464 !important;" class="breadcrumbs"><a class="withoutripple" style="color: #646464 !important;" href="/apk/oculus-vr/">Oculus VR</a> <svg class="icon chevron-icon"><use xlink:href="#apkm-icon-chevron"></use></svg> <a class="withoutripple " style="color: #646464 !important;" href="/apk/oculus-vr/oculus-rooms/">Oculus Rooms</a> <svg class="icon chevron-icon"><use xlink:href="#apkm-icon-chevron"></use></svg> <a class="active withoutripple" style="color: #646464 !important;" href="/apk/oculus-vr/oculus-rooms/oculus-rooms-0-0-2-release/">0.0.2</a> </nav> 

は、既知の問題(参照:https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/)です。

関連する問題