2013-06-01 1 views
4

Помощь! Чтение исходного кода Scrapy нелегко для меня. У меня очень длинный список start_urls. он составляет около 3 000 000 в файле. Таким образом, я делаю start_urls так:порядок URL-адресов сканирования Scrapy с длинным списком start_urls и URL-адресами от паука

start_urls = read_urls_from_file(u"XXXX") 
def read_urls_from_file(file_path): 
    with codecs.open(file_path, u"r", encoding=u"GB18030") as f: 
     for line in f: 
      try: 
       url = line.strip() 
       yield url 
      except: 
       print u"read line:%s from file failed!" % line 
       continue 
    print u"file read finish!" 

В то же время функции обратного вызова моего паука, как это:

def parse(self, response): 
     self.log("Visited %s" % response.url) 
     return Request(url=("http://www.baidu.com"), callback=self.just_test1) 
    def just_test1(self, response): 
     self.log("Visited %s" % response.url) 
     return Request(url=("http://www.163.com"), callback=self.just_test2) 
    def just_test2(self, response): 
     self.log("Visited %s" % response.url) 
     return [] 

мои вопросы:

  1. порядок адресов, используемых загрузчик? Будут ли запросы сделаны just_test1, just_test2 использоваться загрузчиком только после того, как всех start_urls используются? (Я сделал несколько тестов, мне кажется, что ответа нет Нет)
  2. Что определяет порядок? Почему и как этот порядок? Как мы можем это контролировать?
  3. Это хороший способ справиться с таким количеством URL-адресов, которые уже находятся в файле? Что еще?

спасибо!

Спасибо за answers.But Я еще немного запутался: By default, Scrapy uses a LIFO queue for storing pending requests.

  1. requests сделал функцию обратного вызова пауков будет дано scheduler .who делает то же самое start_url's requests-паука? start_requests() функция генерирует только итератор без предоставления реальных запросов.
  2. Будет ли все requests (start_url's и callback's) находиться в очереди того же запроса? Сколько очередей в Scrapy?

ответ

6

Прежде всего, см. Это thread. Думаю, вы найдете ответы на все вопросы.

Порядок URL-адресов, используемый загрузчиком? Будут ли запросы сделаны just_test1, just_test2 использоваться загрузчиком только после того, как используются все start_urls? (Я сделал несколько тестов, это не кажется, что ответ есть нет)

Вы правы, ответ есть No. Поведение полностью асинхронно: когда начинается паук, start_requests метод называется (source):

def start_requests(self): 
    for url in self.start_urls: 
     yield self.make_requests_from_url(url) 

def make_requests_from_url(self, url): 
    return Request(url, dont_filter=True) 

Что определяет порядок? Почему и как этот порядок? Как мы можем управлять ?

По умолчанию нет предопределенного порядка - вы не можете знать, когда Requests из make_requests_from_url приедет - это асинхронный.

См. this answer о том, как вы можете управлять заказом. Короче говоря, вы можете переопределить start_requests и отметьте Requests ключом priority (например, yield Request(url, meta={'priority': 0})). Например, значение priority может быть номером строки, где был найден url.

Это хороший способ справиться с таким количеством URL-адресов, которые уже находятся в файле ? Что еще?

Я думаю, вы должны прочитать файл и доходности URLs непосредственно в start_requests метода: см this answer.

Таким образом, вы должны сделать что-л так:

def start_requests(self): 
    with codecs.open(self.file_path, u"r", encoding=u"GB18030") as f: 
     for index, line in enumerate(f): 
      try: 
       url = line.strip() 
       yield Request(url, meta={'priority': index}) 
      except: 
       continue 

Надежда, что помогает.

+0

Большое спасибо! Я все еще немного смущен. [По умолчанию Scrapy использует очередь LIFO для хранения ожидающих запросов.] (Http://doc.scrapy.org/en/latest/faq.html#does -scrapy-ползать-в-дыхание первого или глубинный первый порядок). –

+0

Я дополнил свою проблему. Это слишком долго для комментариев. Надежда может получить ваш ответ. –

Смежные вопросы