Как читать start_urls из CSV-файла в Scrapy? - PullRequest
0 голосов
/ 16 января 2020

У меня есть два паука. Допустим, A и B. A собирает кучу URL-адресов и записывает их в файл CSV, а B копирует внутри этих URL-адресов чтение из файла CSV, сгенерированного A. Но он выдает ошибку FileNotFound из B, прежде чем A действительно сможет создать файл. Как я могу заставить своих пауков вести себя так, чтобы B ждал, пока A не вернется с URL? Любое другое решение будет полезно.

Файл WriteToCsv.py

def write_to_csv(item):
    with open('urls.csv', 'a', newline='') as csvfile:
        fieldnames = ['url']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({'url': item})


class WriteToCsv(object):
    def process_item(self, item, spider):
        if item['url']:
            write_to_csv("http://pypi.org" +item["url"])
        return item

Файл Pipelines.py

ITEM_PIPELINES = {
    'PyPi.WriteToCsv.WriteToCsv': 100,
    'PyPi.pipelines.PypiPipeline': 300,
}

Метод read_csv

def read_csv():                   
x = []
with open('urls.csv', 'r') as csvFile:
    reader = csv.reader(csvFile)
    for row in reader:
        x = [''.join(url) for url in reader]
return x

start_urls в файле паука B

start_urls = read_csv() #Error here

1 Ответ

0 голосов
/ 16 января 2020

Я хотел бы рассмотреть возможность использования одного паука с двумя методами parse и final_parse. Насколько я могу судить из предоставленного вами контекста, нет необходимости записывать URL-адреса на диск.

parse должен содержать лог c для очистки URL-адресов, в которые в данный момент пишет паук A CSV и должен вернуть новый запрос с обратным вызовом для метода final_parse.

def parse(self, response):
    url = do_something(response.body_as_unicode())
    return scrapy.Request(url, callback=self.final_parse)

final_parse должен затем содержать логический анализ c, который был ранее в пауке B.

def final_parse(self, response):
    item = do_something_else(response.body_as_unicode())
    return item

Примечание. Если вам нужно передать какую-либо дополнительную информацию от parse до final_parse, вы можете использовать аргумент meta scrapy.Request.

Если вам нужны URL-адреса, вы Можно добавить это как поле для вашего элемента. Доступ к нему можно получить с помощью response.url.

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