2016-12-29 6 views
0

Я новичок в Scrapy и Python. Я хочу сделать следующее:Сканирование с параметром по списку URL-адресов из правила с помощью Scrapy

  1. доступ к URL-адресу и получить все ссылки содержащие «магазин/продукты» как часть URL. Звенья выглядеть следующим образом: "http://www.example.com/shop/products/category-name"

  2. Лом в URL из start_urls и получить общее количество продуктов, TOTAL. По коду TOTAL = num_items_per_category.

  3. В конце добавить "? Сортировать = Top & размер = 12 & старт = PARAM" в URL. PARAM должен быть увеличен на 12 на каждой итерации только в случае PARAM < = TOTAL. Конечным URL-адресом будет «http://www.example.com/shop/products/category-name?sort=Top&size=12&start=PARAM»

  4. Получить еще один URL-адрес из начального старта и начать второй шаг еще раз.


Вот мой паук код:

import scrapy 
import re 
import datetime 

from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor 
from scrapy.http.request import Request 

class MySpider(CrawlSpider): 
    name = 'my_spider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com/shop/products'] 
    rules = (
     Rule(LxmlLinkExtractor(
      restrict_xpaths=('.//li[@class="item"]/a')), 
      follow=False, 
      callback='parse_list' 
     ), 
    ) 

    def parse_list(self, response): 
     SET_SELECTOR = '.product' 
     for item in response.css(ITEM_SELECTOR): 
      NAME_SELECTOR = 'div[@class="product"]/h2/a/@title' 
      yield { 
       'name': item.xpath(NAME_SELECTOR).extract_first() 
      } 

     NUM_ITEMS_PER_CATEGORY_SELECTOR = 'div[@id="search"]/@data-count' 
     num_items_per_category = item.xpath(NUM_ITEMS_PER_CATEGORY_SELECTOR).extract_first() 
     nipc = int(0 if num_items_per_category is None else num_items_per_category) 
     try: 
      next_start = response.meta["next_start"] 
     except KeyError: 
      next_start = 0 
     if next_start <= nipc: 
      yield scrapy.Request(
       response.urljoin('%s?sort=Top&size=12&start=%s' % (response.url, next_start)), 
       meta={"next_start": next_start + 12}, 
       dont_filter=True, 
       callback = self.parse_list 
      ) 

Проблемы:

  1. Я не знаю, если он существует какой-либо селектор CSS или регулярное выражение для используйте в Правиле, чтобы выбрать каждую ссылку, которую я хочу. В коде я получаю доступ к пути, где я знаю, что есть некоторые из моих желаемых ссылок, но все еще есть на странице.

  2. Код не работает, как я ожидал. Кажется next_start не увеличивается на 12 на каждой итерации. Код получает только первые 12 элементов каждого URL-адреса в созданном списке start_urls. Я правильно использую meta переменных? Или может быть, мне нужен еще один первый клочок каждой категории, чтобы получить счет TOTAL, прежде чем я смогу использовать его для перебора по нему? Или, может быть, мне нужен другой подход, используя start_requests ... Как вы думаете?

ответ

0

Что именно делает ваш паук посещает URL http://www.example.com/shop/products, извлекает все ссылки внутри <li class="item"> элементов и извлекает все из них с помощью parse_list обратного вызова. Как я вижу, это не то поведение, о котором вы ждете - вместо этого вы должны использовать URL-адрес запуска, содержащий URL-адреса посева и Extractor с allow=r"shop/products" в правиле.

Также эта часть '%s?sort=Top&size=12&start=%s' % (response.url, next_start) неверна, потому что response.url содержит полный URL, включая параметры GET, поэтому каждый раз, когда вы добавляете деталь с параметрами в существующую строку параметров, такую ​​как ?sort=Top&size=12&start=0?sort=Top&size=12&start=12?sort=Top&size=12&start=24. Очистите параметры от url перед добавлением новой строки или просто используйте FormRequest как более удобный способ передачи параметров.

Кстати, у Scrapy есть очень удобная интерактивная консоль для отладки, которую вы можете вызвать из любой части паука, используя scrapy.shell.inspect_response.

+0

Спасибо, mizhgun! Это именно то, что происходит! Я буду играть с debbuger, чтобы проверить такие вещи. – ArtStack

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

  • Нет связанных вопросов^_^