Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

scrapy / response javascript

–1 vote

Le but est d' automatiser la récupération de tous les cours boursiers d'un site de trading. J'ai pris l' exemple de boursorama.
Au début je me retrouvais avec des listes vides sans comprendre, puis je me suis dit que la réponse devait se faire en ajax. Pourtant après plusieurs reprise, ça ne marche pas.
Est-ce le serveur qui détecte l' araignée ?

items.py

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import scrapy
from scrapy.selector import HtmlXPathSelector
import json

class TraderItem(scrapy.Item):

    name = scrapy.Field()
    cours = scrapy.Field()
    fluctu = scrapy.Field()

spiderman.py

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import HtmlXPathSelector 
import json


class SpidermanSpider(scrapy.Spider):
    name = 'spiderman'
    allowed_domains = ['http://www.boursorama.com']
    start_urls = ['http://www.boursorama.com/cours.phtml?symbole=1rPEC/']

    def parse(self, response):

        #data = json.loads(response.body) # TypeError: the JSON object must be str, not 'bytes'
        #data = json.load(response.body) # AttributeError: 'bytes' object has no attribute 'read'
        #data = json.loads(response.decode('utf-8')) # AttributeError: 'HtmlResponse' object has no attribute 'decode'

        #data = HtmlXPathSelector(response) # <HtmlXPathSelector xpath=None data='<html>\n<head>\n\n\t<title>Moteur de recherc'> # {'cours': None, 'name': None, 'fluctu': []}
        data = HtmlXPathSelector(text=response.body) # idem

        print("\n\n\n")
        print(data)
        print("\n\n\n")

        print("\n________________________________________________________________________________________")

        yield {
        #'name': response.xpath('.//*[@id="b41c4b1"]/text()').extract_first(), #liste vide
        'name': response.xpath('.//*[@id="b41c4b1"]/text()').extract(), #liste vide     
        'cours': response.xpath('.//*[@id="brs-sl5a26629228c44"]/text()').extract(),
        'fluctu': response.xpath('.//*[@id="brs-sl5a26629228f85"]/text()').extract()
        }
        print("\n\n\n")

J'ai laissé en commentaire mes "meilleures tentatives".
Question bonus, une alternative serait d' utiliser une regex sur la page HMTL (ctrl+U), mais c'est dommage de faire ainsi.

demandé 5-Dec-2017 par buffalo974 (2,942 points)

c'est pas pratique le systeme de xpath car c'est basé dans mon exemple sur une id donc susceptible de casser sur les autres actions ?

Je dirais de tenter avec Selenium

Se connecter ou S'inscrire pour répondre à cette question.

...