【问题标题】:Scrapy code reading from multiple urls and then writing results in final csv从多个 url 读取的 Scrapy 代码,然后将结果写入最终的 csv
【发布时间】:2018-08-28 19:34:48
【问题描述】:

我需要使用正则表达式从多个 url 的脚本标签中提取数据。我已经设法实现了完成一半工作的代码。我有一个 csv 文件('links.csv '),其中包含我需要抓取的所有网址。我设法读取了 csv 并将所有 url 存储在名为 'start_urls' 的变量中。我的问题是我需要一种方法来一次读取来自'start_urls' 的网址并执行我的代码的下一部分。 当我在终端中执行我的代码时,我收到 2 个错误:

1.ERROR:获取启动请求时出错 2. TypeError: Request url must be str or unicode, got list

如何修复我的代码?我是 Scrapy 的初学者,但我真的需要这个脚本才能工作......提前谢谢你!

以下是我存储在初始 csv('links.csv') 中的一些 url 示例:

"https://www.samsung.com/uk/smartphones/galaxy-note8/"
"https://www.samsung.com/uk/smartphones/galaxy-s8/"
"https://www.samsung.com/uk/smartphones/galaxy-s9/"

这是我的代码:

import scrapy
import csv
import re

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        with open('links.csv','r') as csvf:
            for url in csvf:
                yield scrapy.Request(url.strip())

    def parse(self, response):
        source = response.xpath("//script[contains(., 'COUNTRY_SHOP_STATUS')]/text()").extract()[0]
        def get_values(parameter, script):
            return re.findall('%s = "(.*)"' % parameter, script)[0]

        with open('baza.csv', 'w') as csvfile:
            fieldnames = ['Category', 'Type', 'SK']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            for pvi_subtype_name,pathIndicator.depth_5,model_name in zip(source):
                writer.writerow({'Category': get_values("pvi_subtype_name", source), 'Type': get_values("pathIndicator.depth_5", source), 'SK': get_values("model_name", source)})

【问题讨论】:

    标签: python regex scrapy


    【解决方案1】:

    将以下方法附加到蜘蛛:

    def start_requests(self):
        with open('links.csv','r') as csvf:
            for url in csvf:
                yield scrapy.Request(url.strip())
    

    并从代码中删除之前的 with... 块。

    【讨论】:

    • 非常感谢@mizhgun!我已经根据您的建议编辑了代码并运行它。我仍然有2个错误。我认为它们出现在写入最终 csv 文件('baza.csv')的那部分中,但我真的不知道如何修改它。错误是:1. for pvi_subtype_name,pathIndicator.depth_5,model_name in zip(source): ValueError: not enough values to unpack (expected 3, got 1) AND 2. source = response.xpath("//script[contains(. , 'COUNTRY_SHOP_STATUS')]/text()").extract()[0] IndexError: 列表索引超出范围。我也在上面编辑了我的代码。再次感谢您!
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多