Scrapy读取从文件到scrape的URL列表?

时间:2011-12-04 16:16:38

标签: python scrapy

我刚刚安装了scrapy并遵循了简单的dmoz tutorial。我只是查找了python的基本文件处理,并试图让爬虫从文件中读取URL列表,但是出现了一些错误。这可能是错的,但我试了一下。有人请告诉我一个将URL列表读入scrapy的例子吗?提前谢谢。

from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    f = open("urls.txt")
    start_urls = f

    def parse(self, response):
        filename = response.url.split("/")[-2]
        open(filename, 'wb').write(response.body)

3 个答案:

答案 0 :(得分:33)

你非常接近。

f = open("urls.txt")
start_urls = [url.strip() for url in f.readlines()]
f.close()

...更好的方法是使用上下文管理器确保文件按预期关闭:

with open("urls.txt", "rt") as f:
    start_urls = [url.strip() for url in f.readlines()]

答案 1 :(得分:4)

如果Dmoz只希望列表中有文件名,则必须在每一行上调用strip。否则,您会在每个网址的末尾得到一个“\ n”。

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [l.strip() for l in open('urls.txt').readlines()]

Python 2.7中的示例

>>> open('urls.txt').readlines()
['http://site.org\n', 'http://example.org\n', 'http://example.com/page\n']
>>> [l.strip() for l in open('urls.txt').readlines()]
['http://site.org', 'http://example.org', 'http://example.com/page']

答案 2 :(得分:0)

编写Scrapy helloworld时出现类似问题。除了从文件读取URL,您可能还需要输入文件名作为参数。这可以通过Spider argument机制来完成。

我的例子:

class MySpider(scrapy.Spider):                                                
    name = 'my'                                                               
    def __init__(self, config_file = None, *args, **kwargs):                    
        super(MySpider, self).__init__(*args, **kwargs)                       
        with open(config_file) as f:                                            
            self._config = json.load(f)                                         
        self._url_list = self._config['url_list']                             

    def start_requests(self):                                                   
        for url in self._url_list:                                              
            yield scrapy.Request(url = url, callback = self.parse)