2017-10-20 4 views
-1

으로 바꿉니다. 따라서 site에서 "Videos"와 "English Transcripts"의 다운로드 링크를 추출하는 스파이더를 작성했습니다. cmd를 윈도우에서 나는 모든 올바른 정보가 긁힌 것을 볼 수 있습니다.파이썬 스케이프 - 콜백에서 콜백에서 항목을 CSV

내가 겪고있는 문제는 출력 csv 파일에는 "영어 번역본"링크가 아니라 "비디오"링크 만 포함되어 있습니다 (cmd 창에서 스크랩 된 것을 볼 수 있음에도 불구하고).

다른 게시물에서 몇 가지 제안을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다.

다음 그림은 I 출력 모양을하고 싶은 방법입니다 CSV Output Picture

이 내 현재의 거미 코드입니다 : 당신은 항목의 서로 다른 두 종류의 열매를 산출하는

import scrapy 

class SuhbaSpider(scrapy.Spider): 
    name = "suhba2" 
    start_urls = ["http://saltanat.org/videos.php?topic=SheikhBahauddin&gopage={numb}".format(numb=numb) 
     for numb in range(1,3)] 

    def parse(self, response): 
     yield{ 
      "video" : response.xpath("//span[@class='download make-cursor']/a/@href").extract(), 
     } 
     fullvideoid = response.xpath("//span[@class='media-info make-cursor']/@onclick").extract() 

     for videoid in fullvideoid: 
      url = ("http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2]) 
      yield scrapy.Request(url, callback=self.parse_transcript) 

    def parse_transcript(self, response): 
     yield{ 
      "transcript" : response.xpath("//a[contains(@href,'english')]/@href").extract(), 
     } 
+0

가능한 중복 https://stackoverflow.com/questions/41917108/scrapy-csv-output-randomly-missing :

귀하의 예에 적용 -fields) –

답변

0

- 포함 하나 단지 video 속성이고 하나는 transcript 속성을 포함합니다. 두 속성으로 구성된 한 종류의 항목을 만들어야합니다. 이를 위해서는 parse에 항목을 만들고 meta을 사용하여 두 번째 수준 요청에 전달해야합니다. 그런 다음 parse_transcript에서 meta에서 가져 와서 추가 데이터를 채우고 마지막으로 항목을 산출합니다. 일반적인 패턴은 Scrapy documentation에 설명되어 있습니다.

두 번째로 extract() 방법을 사용하여 한 번에 모든 비디오를 추출해야합니다. 이렇게하면 각 개별 요소를 해당 성적서와 연결하는 것이 어려운 목록이 생성됩니다. 더 나은 접근 방식은 HTML의 각 개별 동영상 요소를 반복하고 각 동영상의 항목을 양보하는 것입니다.

import scrapy 

class SuhbaSpider(scrapy.Spider): 
    name = "suhba2" 
    start_urls = ["http://saltanat.org/videos.php?topic=SheikhBahauddin&gopage={numb}".format(numb=numb) for numb in range(1,3)] 

    def parse(self, response): 
     for video in response.xpath("//tr[@class='video-doclet-row']"): 
      item = dict() 
      item["video"] = video.xpath(".//span[@class='download make-cursor']/a/@href").extract_first() 

      videoid = video.xpath(".//span[@class='media-info make-cursor']/@onclick").extract_first() 
      url = "http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2] 
      request = scrapy.Request(url, callback=self.parse_transcript) 
      request.meta['item'] = item 
      yield request 

    def parse_transcript(self, response): 
     item = response.meta['item'] 
     item["transcript"] = response.xpath("//a[contains(@href,'english')]/@href").extract_first() 
     yield item 
[Scrapy의 CSV 출력 "무작위"실종 필드 (의
+0

대본이없는 동영상의 경우 'ajax_transcription.php'에 대한 요청이있을 것이므로 의심 스러울 것입니다. 스파이더가 사이트와 똑같이 행동하는 것이 중요합니다. 즉, 선택자를 통해 전사 존재 여부를 확인하고 해당 선택 항목에 대한 요청 만 수행해야합니다. –

+0

또한 XMLHttpRequest와 함께'X-Requested-With' 헤더를 추가 할 것을 권한다. 같은 이유. –

+0

기본 아이디어를 적용한 예를 제공하려고했지만 준비가되지 않은 코드는 제공하지 않았습니다. 현장 확인은 OP까지입니다. –