Изменить ввод файла CSV от пауков при запуске CrawlerProcess / Scrapy - PullRequest
0 голосов
/ 12 декабря 2018

Я запускаю параллельно несколько пауков с CrawlerProcess, вот так.

def main():

    # ----- This part launch all given spiders ----- #

    process = CrawlerProcess(get_project_settings())

    process.crawl(FirstSpider)
    process.crawl(SecondSpider)
    process.crawl(ThirdSpider)
    process.crawl(EtcSpider)

    process.start()  # the script will block here until the crawling is finished

Все пауки работают на основе входного файла CSV, который содержит информацию для поиска на веб-сайтах.Вот пример:

class FirstSpider(scrapy.Spider):
    name = "first_bot"

    def start_requests(self):
        base_url = "https://example.fr/catalogsearch/result/?q="
        script_dir = osp.dirname(osp.realpath(__file__))
        file_path = osp.join(script_dir, 'files', 'to_collect_firstbot.csv')
        input_file = open(file_path, 'r', encoding="utf-8", errors="ignore")
        reader = csv.reader(input_file)
        for row in reader:
            if row:
                url = row[0]
                absolute_url = base_url + url
                print(absolute_url)
                yield scrapy.Request(
                    absolute_url,
                    meta={
                        "handle_httpstatus_list": [302, 301, 502],
                    },
                    callback=self.parse
                )

Это работает, но мне, возможно, придется изменить имя входного файла, которое записывается для каждого паука.

Можно ли сохранить «настроенный» файл по умолчанию для всех сценариев пауков, а затем в файл core.py (запуск всех пауков), изменить при необходимости входной файл CSV (в этом случае файл и имя будутбыть одинаковым для всех пауков)?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете передать аргументы для сканирования вашего паука, который, я думаю, вам нужен для этой работы.

Измените свой код на:

class FirstSpider(scrapy.Spider):
    name = "first_bot"

    file_name = 'to_collect_firstbot.csv' # <- we are gonna change this variable later

    def start_requests(self):
        base_url = "https://example.fr/catalogsearch/result/?q="
        script_dir = osp.dirname(osp.realpath(__file__))
        file_path = osp.join(script_dir, 'files', self.file_name) # here we use the argument
        input_file = open(file_path, 'r', encoding="utf-8", errors="ignore")
        reader = csv.reader(input_file)
        for row in reader:
            if row:
                url = row[0]
                absolute_url = base_url + url
                print(absolute_url)
                yield scrapy.Request(
                    absolute_url,
                    meta={
                        "handle_httpstatus_list": [302, 301, 502],
                    },
                    callback=self.parse
                )

А теперь при запуске вашего паука,просто передайте их в качестве аргументов при вызове процесса сканирования:

def main():

    # ----- This part launch all given spiders ----- #

    process = CrawlerProcess(get_project_settings())

    process.crawl(FirstSpider, file_name='custom_file1.csv')
    process.crawl(SecondSpider, file_name='custom_file2.csv')
    process.crawl(ThirdSpider)
    process.crawl(EtcSpider, file_name='custom_file_whatever.csv')

    process.start()  # the script will block here until the crawling is finished

Убедитесь, что третий вызов не устанавливает аргумент file_name, что означает, что паук будет использовать по умолчанию, указанный в коде паука:

file_name = 'to_collect_firstbot.csv'
0 голосов
/ 12 декабря 2018

crawl принимает аргументы, и вы можете использовать их из from_crawler вашего паука.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...