2017-04-20 1 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에서 "@"가 포함 된 링크 텍스트를 추출 할 수 없습니다

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

그러나, 통보하는 응용 프로그램 이름, [email protected]이 결과들 사이되지 않습니다 :

enter image description here

나는 다음의 XPath 선택을 시도했습니다. <a> 태그를 갖고있는 것 같다 않기 때문에 (크롬에서 "검사"를 사용하여 그림과 같이) 나는이 이해가 안 :

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 버그의 일종이 될 수 있음을 의심하기 시작하고있다. 이게 사실일까요? "검사"대신 크롬의 "페이지 소스보기"옵션을 사용하여 페이지 소스보기

답변

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

,이 특정 링크에 대한 탐색 모음은 자바 스크립트 포함을 참조하십시오

의 마력 방 페이지 반면
<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와

<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/)입니다.

관련 문제