2017-01-23 94 views
0

我是Python和Scrapy的新手。我有一个项目。在蜘蛛有一个这样的代码:(Python,Scrapy)将txt文件中的数据转换为Scrapy蜘蛛

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

我想从一个txt文件采取1230812812308148之间的范围内的数字(或CSV文件)

可以说,它的numbers.txt包括两行其中:

12308128 
12308148 

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

谢谢。

回答

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) 

所以,你可以看到我们通过重写它在这里做什么。

+0

ks寻求帮助,但在抓取我的项目时出现错误。它说'IndentationError:预计一个缩进块'为这行:'与开放('numbers.txt','r')为f:' –

+0

好吧我想我找到了问题。它必须连接到“def”行。但它说'SyntaxError:'yield'outside function' now –

+0

我认为你在复制文本时误导了文本,请确保缩进符合我的示例。不应该有任何错误。 – Granitosaurus

0

我认为你需要阅读的文件和值传递给你的URL字符串

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

您可以使用前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 
+0

感谢您的答复,但我应该写入范围?如何将您的代码的开始和结束编号写入范围? –