【问题标题】:(Python, Scrapy) Taking data from txt file into Scrapy spider(Python, Scrapy) 从 txt 文件中取数据到 Scrapy 蜘蛛
【发布时间】:2017-01-23 18:27:24
【问题描述】:

我是 Python 和 Scrapy 的新手。我有一个项目。在蜘蛛中有这样的代码:

class MySpider(BaseSpider):
    name = "project"
    allowed_domains = ["domain.com"]
    start_urls = ["https://domain.com/%d" % i for i in range(12308128,12308148)]

我想从 txt 文件(或 csv 文件)中获取 1230812812308148 之间的范围数字

假设它的 numbers.txt 包含两行:

12308128
12308148

如何将这些数字导入我的蜘蛛?另一个进程会定期更改 txt 文件中的这些数字,我的蜘蛛会更新这些数字并运行。

谢谢。

【问题讨论】:

    标签: python csv parsing scrapy


    【解决方案1】:

    您可以在蜘蛛的start_requests() 方法中覆盖 start_urls 逻辑:

    class Myspider(scrapy.Spider):
        name = 'myspider'
    
        def start_requests(self):
            # read file data
            with open('filename', 'r') as f: 
                start, end = f.read().split('\n', 1)
            # make range and urls with your numbers
            range_ = (int(start.strip()), int(end.strip()))
            start_urls = ["https://domain.com/%d" % i for i in range(range_)]
            for url in start_urls:
                yield scrapy.Request(url)
    

    这个蜘蛛将打开文件、读取数字、创建起始 url、遍历它们并为每个它们安排一个请求。

    默认start_requests() 方法类似于:

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url)
    

    因此,您可以通过覆盖它来查看我们在此处执行的操作。

    【讨论】:

    • 感谢您的帮助,但它在抓取我的项目时出错。上面写着IndentationError: expected an indented block 这条线:with open('numbers.txt', 'r') as f:
    • 好的,我想我发现了问题。它必须连接到def 线。但它现在说SyntaxError: 'yield' outside function
    • 我认为您在复制文本时误解了文本,请确保缩进与我的示例匹配。应该没有任何错误。
    • 好的,我想我修正了错误的行,但它没有用。我蜘蛛的输出文件是 0 字节。顺便说一句,你的代码是filename.txt filename.csv
    • 错误是TypeError: range() integer end argument expected, got tuple
    【解决方案2】:

    您可以通过命令行使用scrapy crawl 的选项-a 将任何参数传递给蜘蛛的构造函数,例如)

    scrapy crawl spider -a inputfile=filename.txt
    

    然后像这样使用它:

    class MySpider(scrapy.Spider):
        name = 'spider'
        def __init__(self, *args, **kwargs):
            self.infile = kwargs.pop('inputfile', None)
    
        def start_requests(self):
            if self.infile is None:
                raise CloseSpider('No filename')
            # process file, name in self.infile
    

    或者您可以像这样以类似的方式传递开始值和结束值:

    scrapy crawl spider -a start=10000 -a end=20000
    

    【讨论】:

    • 感谢您的回复,但是我应该在 range 中写入什么?它如何使用您的代码将开始和结束数字写入范围?
    【解决方案3】:

    我相信您需要阅读文件并将值传递给您的 url 字符串

    Start_Range = datacont.readline()
    End_Range = datacont.readline()
    print Start_Range
    print End_Range
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多