Как извлечь данные в файл с помощью scrapy? - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь извлечь данные с помощью Scrapy в ноутбуке Jupiter от anaconda.

Кажется, я установил все необходимые библиотеки. Вот мой код:

import scrapy
from scrapy.crawler import CrawlerProcess
class RoadSpider(scrapy.Spider):
    name = "road_spider"
    start_urls = [
        'http://autostrada.info/ru/reviews/page/1/',
    ]

    def parse(self, response):
        for review in response.css('div.col-md-12.reviewBlock'):
            tmp = review.css('p.comment.break-word::text').extract_first()
            tmp1 = review.css('a.label.label-code::text').extract_first()
            tmp2 = review.css('a.highwayLabel::text').extract_first()
            tmp = tmp.replace('\r\n', ' ')
            tmp = tmp.replace('\n', '')
            dd = {
                'title': tmp1 + ' ' + tmp2,
                'subtitle': review.css('div.col-sm-8.b-rate.hidden-xs b::text').extract_first(),
                'date': review.css('strong.reviewDate::text').extract_first(),
                'rate': review.css('span.b-stars::attr(title)').extract_first(),
                'description': tmp,
            }
            try:
                dd['date'] = dd['date'].replace('\t', '')
                dd['date'] = dd['date'].replace('\n', '')
                dd['date'] = dd['date'].replace('\u0433.', '')
            except:
                pass
            yield dd 

            with open('C:\\Scr\\all.txt','w') as f:
                f.write(dd + "\n")

        next_page = response.css('li.next a::attr(href)').extract_first()

        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)             
process = CrawlerProcess()
process.crawl(RoadSpider)
process.start()

В результатеизвлечения извлеченные данные должны быть записаны в файл C: \ Scr \ all.txt. Но когда я открываю этот файл, он пуст. Помогите исправить мой код.

1 Ответ

2 голосов
/ 15 октября 2019

РЕДАКТИРОВАТЬ:

Вы не сохраняете свой словарь правильно, попробуйте что-то вроде этого:

import scrapy
from scrapy.crawler import CrawlerProcess
import json
class RoadSpider(scrapy.Spider):
    name = "road_spider"
    start_urls = [
        'http://autostrada.info/ru/reviews/page/1/',
    ]

    def parse(self, response):
        for review in response.css('div.col-md-12.reviewBlock'):
            tmp = review.css('p.comment.break-word::text').extract_first()
            tmp1 = review.css('a.label.label-code::text').extract_first()
            tmp2 = review.css('a.highwayLabel::text').extract_first()
            tmp = tmp.replace('\r\n', ' ')
            tmp = tmp.replace('\n', '')
            dd = {
                'title': tmp1 + ' ' + tmp2,
                'subtitle': review.css('div.col-sm-8.b-rate.hidden-xs b::text').extract_first(),
                'date': review.css('strong.reviewDate::text').extract_first(),
                'rate': review.css('span.b-stars::attr(title)').extract_first(),
                'description': tmp,
            }
            try:
                dd['date'] = dd['date'].replace('\t', '')
                dd['date'] = dd['date'].replace('\n', '')
                dd['date'] = dd['date'].replace('\u0433.', '')
            except:
                pass
            yield dd 

            with open('C:\\Scr\\all.txt', 'a', encoding='utf8') as json_file:
                json.dump(dd, json_file, ensure_ascii=False)

        next_page = response.css('li.next a::attr(href)').extract_first()

        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)             
process = CrawlerProcess()
process.crawl(RoadSpider)
process.start()

хорошо работать на моем компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...