2017-12-11 4 views
0

나는 필터가있는 웹 사이트의 데이터를 가져 오려고합니다. 웹 사이트는 다음 중 하나입니다 : https://www.lequipe.fr/Basket/RES_NBA.html치료와 함께 웹 사이트에서 필터를 관리하는 방법

나는 필요한 모든 정보를 수집하는 단순한 거미를 가지고 있지만 표시되는 날짜에만 있습니다.

필터에서 사용할 수있는 모든 날짜의 데이터를 수집하려면 필터를 반복해야합니다.

누군가가 도와 주시면 감사하겠습니다.

내 거미는 다음과 같이이다 :

그래서
# -*- coding: utf-8 -*- 
import scrapy 


class LequipeBotSpider(scrapy.Spider): 
name = 'Lequipe_bot' 
allowed_domains = ['www.lequipe.fr/Basket/RES_NBA.html'] 
start_urls = ['http://www.lequipe.fr/Basket/RES_NBA.html'] 
#location of csv file 
custom_settings = { 
    'FEED_FORMAT' : "csv", 
    'FEED_URI' : 'tmp/lequipe2.csv' 
} 

def parse(self, response): 
    #Extracting the content using css selectors 
    #recap = response.css(".equipeDom a::text,div.score span.score--chiffre::text,.equipeExt a::text").extract() 
    recap=response.css(".equipeDom a::text,div.score span.score--chiffre::text,.equipeExt a::text,div.equipeDom span.nba--ranking::text,div.equipeExt span.nba--ranking::text").extract() 




    #Give the extracted content row wise 
    for x in range(0,(len(recap))/6): 
     #create a dictionary to store the scraped info 
     scraped_info = { 
      'equipe_dom' : recap[1+6*x], 
      'score_dom' : recap[2+6*x], 
      'score_ext' : recap[3+6*x], 
      'equipe_ext' : recap[4+6*x], 
      'classement_dom' : recap[0+6*x], 
      'classement_ext' : recap[5+6*x], 

     } 

     #yield or give the scraped info to scrapy 
     yield scraped_info 

, 내가 어떻게

감사합니다 사전에 @furas의 솔루션으로 모든 페이지의 스크 레이 핑을 반복 할 수

+0

당신은 클래스 = filtrecalendrier''의 모든 날짜가 모든 날짜는 세부 사항 페이지에 대한 링크가 있습니다. 문제가 어디에 있습니까? – furas

답변

0

당신은 모든 날짜에이 인 select 위젯.
및 URL 자세한

for x in response.xpath('//*[@class="filtrecalendrier"]/option/@value'): 
    print(x.extract()) 

결과 페이지가

/Basket/BasketResultat22420.html 
/Basket/BasketResultat22421.html 
/Basket/BasketResultat22422.html 
... 

이제 https://www.lequipe.fr/

response.urljoin('/Basket/BasketResultat22420.html') 

# https://www.lequipe.fr/Basket/BasketResultat22420.html 

으로 가입해야하고 당신은 세부 사항을 얻기 위해 페이지를로드 할 수 있습니다


편집 : 작업 코드

#!/usr/bin/env python3 

# 
# https://stackoverflow.com/a/47761077/1832058 
# 

import scrapy 

class MySpider(scrapy.Spider): 

    name = 'myspider' 

    allowed_domains = ['www.lequipe.fr'] 

    start_urls = ['http://www.lequipe.fr/Basket/RES_NBA.html'] 

    def parse(self, response): 
     print('url:', response.url) 

     for item in response.xpath('//*[@class="filtrecalendrier"]/option'): 

      date = item.xpath('./text()').extract_first() 
      url = item.xpath('./@value').extract_first() 

      url = response.urljoin(url) 

      yield scrapy.Request(url, callback=self.parse_items, meta={'date': date}) 


    def parse_items(self, response): 
     rows = response.css('.ligne.bb-color') 

     for row in rows: 

      score = row.css('.score span::text').extract() 
      if len(score) < 2: 
       score = ['', ''] 

      item = { 
       'date': response.meta['date'], 
       'equipe_dom': row.css('.equipeDom a::text').extract_first(), 
       'score_dom': score[0], 
       'score_ext': score[1], 
       'equipe_ext': row.css('.equipeExt a::text').extract_first(), 
       'classement_dom': row.css('.equipeDom a span::text').extract_first(), 
       'classement_ext': row.css('.equipeExt a span::text').extract_first(), 
      } 

      #print(item) 

      yield item 

# --- it runs without project and saves in `output.csv` --- 

from scrapy.crawler import CrawlerProcess 

c = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/5.0', 

    # save in file as CSV, JSON or XML 
    'FEED_FORMAT': 'csv',  # csv, json, xml 
    'FEED_URI': 'output.csv', # 
}) 
c.crawl(MySpider) 
c.start() 
+0

고마워요. Furas, 나는 치료를 잘하는 초보자이기 때문에 나에게는 분명하지 않습니다;) 나는 당신의 솔루션을 시도해보고 그것을 거미에서 어떻게 반복 할 수 있는지 봅니다. 다시 한번 고마워요. – moundjou

+0

작업 코드를 입력했습니다. – furas

+0

정말 고마워. 나는 이것에서 멀리 떨어져 있었지만 지금은 돌아 왔고 당신의 코드를 시도 할 것이다. 계속 연락 해요. – moundjou