Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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

scrapy / response javascript

0 votes

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é il y a 6 jours par buffalo974 (2,540 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

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...