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)