Я новичок в Scrapy и Python. Я хочу сделать следующее:Сканирование с параметром по списку URL-адресов из правила с помощью Scrapy
доступ к URL-адресу и получить все ссылки содержащие «магазин/продукты» как часть URL. Звенья выглядеть следующим образом: "http://www.example.com/shop/products/category-name"
Лом в URL из start_urls и получить общее количество продуктов, TOTAL. По коду TOTAL = num_items_per_category.
В конце добавить "? Сортировать = Top & размер = 12 & старт = PARAM" в URL. PARAM должен быть увеличен на 12 на каждой итерации только в случае PARAM < = TOTAL. Конечным URL-адресом будет «http://www.example.com/shop/products/category-name?sort=Top&size=12&start=PARAM»
Получить еще один 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
)
Проблемы:
Я не знаю, если он существует какой-либо селектор CSS или регулярное выражение для используйте в Правиле, чтобы выбрать каждую ссылку, которую я хочу. В коде я получаю доступ к пути, где я знаю, что есть некоторые из моих желаемых ссылок, но все еще есть на странице.
Код не работает, как я ожидал. Кажется next_start не увеличивается на 12 на каждой итерации. Код получает только первые 12 элементов каждого URL-адреса в созданном списке start_urls. Я правильно использую meta переменных? Или может быть, мне нужен еще один первый клочок каждой категории, чтобы получить счет TOTAL, прежде чем я смогу использовать его для перебора по нему? Или, может быть, мне нужен другой подход, используя start_requests ... Как вы думаете?
Спасибо, mizhgun! Это именно то, что происходит! Я буду играть с debbuger, чтобы проверить такие вещи. – ArtStack