Как использовать урожай вместо печати с селектором и селена? - PullRequest
0 голосов
/ 15 октября 2018
from scrapy import Spider
from selenium import webdriver
from scrapy.selector import Selector

class FlipkartSpider(Spider):
    name = 'flipkarttrial1'
    allowed_domains = ['flipkart.com']

    def start_requests(self):
        self.driver = webdriver.Chrome('C:\\Users\\xyz\\chromedriver')
        self.driver.get('https://www.flipkart.com/womens-footwear/heels/pr?sid=osp,iko,6q1&otracker=nmenu_sub_Women_0_Heels')
        sel = Selector(text=self.driver.page_source)
        prices = sel.xpath('//div/div[@class="_1vC4OE"]/text()').extract()
        for price in prices:
            print(price)

    def parse(self, response):
        pass

Здесь скребок печатает цену, но когда я использую доходность, он выдает ошибку.Я хочу сохранить цены в CSV-файл.Как я могу сохранить данные, используя «yield»?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете легко опустить селен и scrapy.Selector и просто использовать ответ в методе разбора.

import scrapy

class FlipkartSpider(scrapy.Spider):
    name = 'flipkarttrial1'
    allowed_domains = ['flipkart.com']


    def start_requests(self):
        url = 'https://www.flipkart.com/womens-footwear/heels/pr?sid=osp,iko,6q1&otracker=nmenu_sub_Women_0_Heels'
        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        prices = response.xpath('//div/div[@class="_1vC4OE"]/text()').extract()
        for price in prices:
            yield {'price':price}

Затем запустите его, используя scrapy crawl flipkarttrial1 -o data.csv -t csv

Отредактировано: Если вы все еще хотитеSelenium, вы можете использовать модуль csv python для записи файла csv.

Метод start_request должен возвращать объект scrapy.Request(url, callback), затем метод обратного вызова (в приведенном ниже коде метод parse являетсяобратный вызов) выполняет всю остальную работу.

class FlipkartSpider(Spider):
    name = 'flipkarttrial1'
    allowed_domains = ['flipkart.com']
    start_urls = ['https://www.flipkart.com/womens-footwear/heels/pr?sid=osp,iko,6q1&otracker=nmenu_sub_Women_0_Heels']

    def parse(self, response):
        self.driver = webdriver.Chrome('C:\xyz\chromedriver')
        self.driver.get(response.url)
        sel = Selector(text=self.driver.page_source)
        prices = sel.xpath('//div/div[@class="_1vC4OE"]/text()').extract()

        output = open('output_data.csv', 'w')
        fieldnames = ['price']
        csv_file = csv.DictWriter(output, fieldnames)

        for price in prices:
            yield csv_file.writerow({fieldnames[0]: price})
0 голосов
/ 15 октября 2018

Вы должны yield правильный Python, как показано ниже

Я думаю, вы не можете получить элементы из strat_requests, поэтому просто сделайте фиктивный запрос, а затем получите элементы в методе разбора

def start_requests(self):
    yield scrapy.Request(url=“http://ip-api.com/json”, callback=self.parse)

def parse(self, response):
    self.driver = webdriver.Chrome('C:\\Users\\xyz\\chromedriver')
    self.driver.get('https://www.flipkart.com/womens-footwear/heels/pr?sid=osp,iko,6q1&otracker=nmenu_sub_Women_0_Heels')
    sel = Selector(text=self.driver.page_source)
    prices = sel.xpath('//div/div[@class="_1vC4OE"]/text()').extract()
    for price in prices:
        yield {“price": price}
...