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.