Scrapy прочитать список URL-адресов из файла, чтобы очистить? - PullRequest
10 голосов
/ 04 декабря 2011

Я только что установил scrapy и следовал их простому учебнику dmoz , который работает.Я просто просмотрел базовую обработку файлов для 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 ]

33 голосов
/ 05 декабря 2011

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

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()]
4 голосов
/ 05 декабря 2011

Если Dmoz ожидает только имена файлов в списке, вы должны вызывать strip в каждой строке.В противном случае вы получите '\ 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']
0 голосов
/ 10 января 2019

Возникают с похожим вопросом, когда пишете мой мир 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)              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...