xlsxwriter не может создать файл при использовании рекурсивного обратного вызова scrapy - PullRequest
0 голосов
/ 22 октября 2018

xlsxwriter не может создать файл в рекурсии, кто-нибудь может взглянуть?

import scrapy
import xlsxwriter

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    def start_requests(self):
        start_urls = [
            'https://www.hotelgg.com/venue/mittitlt/', 
        ]

создать книгу

        filename = 'hotel-list.xlsx'
        wb = xlsxwriter.Workbook(filename)
        self.wb = wb
        if start_urls[0] == 'https://www.hotelgg.com/venue/mittitlt/':
            self.ws = wb.add_worksheet("nanshan")

отправил запрос на сканирование

        yield scrapy.Request(url=start_urls[0], callback=self.parse)

    def parse(self, response):
        ws = self.ws
        i = 0
        # parse response
        for quote in response.css('ul.hotel_list div.info'):
            item = {
                'name': quote.css('h3.title a::text').extract_first(),
                'region': quote.css('span.region::text').extract_first(),
                'street': quote.css('span.street::text').extract_first(),
                'space': quote.css('span.meetingroom_space_range::text').extract(),
            }

записать строку в excel

            ws.write_string(i, 0, item['name'])
            ws.write_string(i, 1, item['region'])
            ws.write_string(i, 2, item['street'])
            if item['space']:
                ws.write_string(i, 3, item['space'][1])
            else:
                ws.write_string(i, 3, '0')
            i += 1

получить следующую страницу для сканирования

        next_page = response.css('div.pager a:last-child::attr(href)').extract_first()
        self.log(next_page)
        if next_page is not None:
            next_page = response.urljoin(next_page)

отправил запрос на следующую страницу

            yield scrapy.Request(next_page, callback=self.parse)

1 Ответ

0 голосов
/ 19 марта 2019

Попробуйте что-то вроде этого:

def process_item(self, item, spider):
    for key, value in item.items():
        if value is None or value is "":
            item[key] = "-"
    if item['yield_type'] == 'product':
        self.prod_row += 1
        self.products.write_string( "A%s" % self.prod_row, item["breadcrumb"] )
        self.products.write_string( "B%s" % self.prod_row, item["last_category"] )
        self.products.write_string( "C%s" % self.prod_row, item["product_href"] )
    if item['yield_type'] == 'profile':
        self.prof_row += 1
        self.profiles.write_string( "A%s" % self.prof_row, item["profile_category"] )
        self.profiles.write_string( "B%s" % self.prof_row, item["company_name"] )
        self.profiles.write_string( "C%s" % self.prof_row, item["company_href"] )

Сохраните данные на разных листах рабочей книги.

xlsxwriter выдает ошибку при отправке нулевого значения, поэтому убедитесь, что вы что-то поставили вместопусто / пусто:

    if value is None or value is "":
        item[key] = "-"
...