2017-10-16 1 views
1

Je suis en train de gratter tous les liens vers des vidéos et des transcriptions en anglais de this site en utilisant scrapy et pythonpython scrapy - grattage de popup de onclick dialogue

Je suis l'araignée pour gratter tous les URL vidéo de toutes les pages (NB Je suis inutile à la programmation), mais je ne peux pas comprendre comment gratter les transcriptions. La boîte de dialogue de transcription n'apparaît qu'après avoir cliqué sur un bouton. Les liens vers les transcriptions se trouvent sur cette nouvelle fenêtre. Tous les autres didacticiels que j'ai lus concernent les requêtes POST, mais il semble que ce soit une requête ajax GET. (Donc, je suis complètement désemparé quoi faire). J'ai aussi vu les messages qui mentionnent des charges utiles et le contrôle de forme, mais je ne sais pas ce qu'ils sont pour ce site

HTML pertinent de la page précédente cliquage:

<span class="transcription make-cursor" onclick="showTranscriptionDialog('17394')"> 
 
<img class="video-doclet-icons" src="images/transcript4.png" 
 
title="Download Transcription, Tercüme'yi indir, تحميل النص" 
 
alt="Transcription" data-pin-nopin="true"></span>

HTML pertinent après un clic (de la boîte de dialogue contextuelle):

<span class="ui-corner-all" id="transcription-language-list17394" 
 
style="background-color: rgb(245, 243, 229); color: rgb(51, 51, 51);"> 
 
<a class="transcription-language-list" target="_blank" 
 
href="http://saltanat-transcriptions.s3.amazonaws.com/english/2017-08-08_en_NothingMeansEverything_SB.pdf" 
 
onmouseover="transcriptionLanguageMouseOver(17394)" 
 
onmouseout="transcriptionLanguageMouseOut(17394)" 
 
style="color: rgb(51, 51, 51);"> English </a></span>

mon code d'araignée actuelle (ne fonctionne pas)

import scrapy 
 

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

 
    def parse(self, response): 
 
\t \t \t yield { 
 
       'video': response.xpath('//span[@class='download make-cursor']/a/@href').extract(), 
 
      } 
 
\t \t videoid = response.xpath("substring(//span[@class='media-info make-cursor']/@onclick, 22, 5)").extract() 
 
     for p in videoid: 
 
      url = "http://saltanat.org/ajax_transcription.php?vid=" + p 
 
      yield scrapy.Request(url, callback=self.parse_transcript) 
 

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

Toute aide serait appréciée, merci!

+1

2 façons de le faire. Vous pouvez exécuter javascript avec un webdriver et simuler un clic sur le bouton. Ou vous pourriez faire la demande GET vous-même puis analyser la réponse. Ouvrez les outils de développement de votre navigateur dans l'onglet Réseau et vérifiez ce qu'il fait lorsque vous cliquez sur le bouton. Essayez de faire la même requête dans votre code python. – rm4

+0

@ rm4 Merci pour la réponse, je ne suis pas trop désireux d'utiliser un truc webdriver, j'ai joint mon code pour mon araignée ci-dessus où j'ai essayé de le faire en fonction de votre deuxième option. Le problème est que je ne reçois aucun résultat quand je lance l'araignée – jblack

Répondre

0

Ok, après avoir joué avec le code, j'ai eu une solution de travail, le problème était la commande "substring". Il n'aurait pas dû être placé dans la ligne "response.xpath". J'ai utilisé une autre syntaxe pour faire la même chose que ci-dessous (à savoir. Obtenir une sous-chaîne)

Ne faisant pas partie de travail

videoid = response.xpath("substring(//span[@class='media-info make-cursor']/@onclick, 22, 5)").extract() 
 
     for p in videoid: 
 
      url = "http://saltanat.org/ajax_transcription.php?vid=" + p

remplacé par cette partie de travail

fullvideoid = response.xpath("//span[@class='media-info make-cursor']/@onclick").extract() 
 
    
 
\t for videoid in fullvideoid: 
 
\t \t url = ("http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2])