Scrapy Request каким-то образом режет URL - PullRequest
0 голосов
/ 29 марта 2019

Мне нравится указывать URL-адрес, который выглядит следующим образом: https://steamcommunity.com/market/search?appid=730#p1_popular_desc

Поскольку конец является динамическим, я создаю список URL-адресов при разборе, а затем создаю цикл запроса.

Проблема в том, что он обрезает URL после appid = 730 - поэтому каждый URL выглядит одинаково.Если я переключаюсь на dont_filter = true, я вижу, что он снова и снова зацикливается на странице page1.Я не понимаю проблему :(

"x" в коде станет динамическим позже (вот для чего нужен start_url), думаю, что это не имеет никакого отношения к проблеме.

Кажетсяон всегда ползает с URL-адреса реферира, а не с того, который я ему дал. URL может не закончиться к 730.

Отладочное сообщение:

...

2019-03-28 23:44:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://steamcommunity.com/market/search?appid=730> (referer: None)

2019-03-28 23:44:37 [scrapy.core.engine] DEBUG: Crawled (200) **<GET https://steamcommunity.com/market/search?appid=730#p7_popular_desc> (referer: https://steamcommunity.com/market/search?appid=730)**

...

2019-03-28 23:44:37 [scrapy.core.scraper] DEBUG: Scraped from <200 https://steamcommunity.com/market/search?appid=730>
{'item_count': u'7,899',
 'item_name': u'Prisma Case',
 'item_price': u'$2.79 USD',
 'item_subtext': u'Counter-Strike: Global Offensive'}
2019-03-28 23:44:37 [scrapy.core.scraper] DEBUG: **Scraped from <200 https://steamcommunity.com/market/search?appid=730>**
{'item_count': u'192,519',
 'item_name': u'Danger Zone Case',
 'item_price': u'$0.30 USD',
 'item_subtext': u'Counter-Strike: Global Offensive'}

allowed_domains = ['steamcommunity.com/market']
start_urls = ['https://steamcommunity.com/market/search?appid=730']

def parse(self, response):
    x = 15 
    steam_xpath = [u'//steamcommunity.com/market/search?appid=730#p'+str(i)+'_popular_desc' for i in range(1, x)]
    for link in steam_xpath:
        yield Request(response.urljoin(link), self.parse_steam, dont_filter=True)

def parse_steam(self, response):
    xitem_name = response.xpath('//span[@class="market_listing_item_name"]/text()').extract()
    xitem_price = response.xpath('//span[@class="normal_price"]/text()').extract()
    xitem_subtext = response.xpath('//span[@class="market_listing_game_name"]/text()').extract()
    xitem_count = response.xpath('//span[@class="market_listing_num_listings_qty"]/text()').extract()
    for item in zip(xitem_name, xitem_price, xitem_subtext, xitem_count):
        new_item = SteammarketItem()
        new_item['item_name'] = item[0]
        new_item['item_price'] = item[1]
        new_item['item_subtext'] = item[2]
        new_item['item_count'] = item[3]
        yield new_item

ожидается: 150 результатов, по 10 на каждый URL в цикле.

фактическое: 15 результатов, но каждые 10 раз - все с первого URL.

1 Ответ

0 голосов
/ 29 марта 2019

URL-адрес в адресной строке отображается так, как вы говорите, но если вы проверите запросы на вкладке "Сеть" вашего инструмента разработчика браузера, вы увидите запрос, который возвращает новые элементы:

https://steamcommunity.com/market/search/render/?query=&start=0&count=10&search_descriptions=0&sort_column=popular&sort_dir=desc&appid=730

Этот Json содержит HTML-страницу в поле results_html, вы можете создать селектор с этим значением, если хотите получать данные с помощью xpath.

import json

def parse(self, response):
    data = json.loads(response.text)
    sel = scrapy.Selector(text=data['results_html'])
    # then use sel
    value = sel.xpath('//value').get()

Читая ответ по этому URL, вы также можете заметить, что tip говорит о том, что также можно добавить параметр &norender=1 в URL и вообще не работать с HTML.Поэтому вам решать, что вам удобнее всего.

Многие сайты делают это, поэтому вам нужно следить за запросами и не всегда доверять тому, что отображается в адресной строке.Я советую вам никогда не доверять тому, что отображается в «Инспекторе», и всегда проверять исходный код (щелкните правой кнопкой мыши> См. Исходный код страницы).

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