Scrapy читает список URL-адресов из файла для очистки?

Я только что установил 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)

Ответ 1

Вы были довольно близки.

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()]

Ответ 2

Если Dmoz ожидает только имена файлов в списке, вы должны вызвать полосу в каждой строке. В противном случае вы получите "\n" в конце каждого URL-адреса.

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']

Ответ 3

Возникните с похожим вопросом, когда пишете мой мир Scrapy helloworld. Помимо чтения URL из файла, вам также может понадобиться ввести имя файла в качестве аргумента. Это может быть сделано с помощью механизма аргументов Spider.

Мой пример:

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)