我正在嘗試抓取恰好在 XHR 請求中的產品資料。如果我絕對參考 XHR url,我可以抓取所需的資料。但是我試圖抓取的網站對抓取的每個產品頁面都有不同的 XHR 請求。
這是一個產品https://www.midwayusa.com/product/939287480?pid=598174 現在我確實注意到,如果您獲取每個頁面的 url 并輸入 [data] https://www.midwayusa.com/productdata /939287480?pid=598174你可以通過這種方式獲取 XHR 請求。我不知道如何使用爬蟲作為我的第二個爬蟲和 python 新手來做到這一點。
那么基本上我們從每個抓取的頁面中獲取 JSON 資料的最簡單方法是什么?
class PwspiderSpider(CrawlSpider):
name = 'pwspider'
allowed_domains = ['midwayusa.com']
start_urls = ['https://www.midwayusa.com/s?searchTerm=backpack']
# restricting css
le_backpack_title = LinkExtractor(restrict_css='li.product')
# Callback to ParseItem backpack and follow the parsed URL Links from URL
rule_Backpack_follow = Rule(le_backpack_title, callback='parse_item', follow=False)
# Rules set so Bot can't leave URL
rules = (
rule_Backpack_follow,
)
def start_requests(self):
yield scrapy.Request('https://www.midwayusa.com/s?searchTerm=backpack',
meta={'playwright': True})
def parse_item(self, response):
data = json.loads(response.body)
yield from data['products']
在此處輸入影像描述
uj5u.com熱心網友回復:
我測驗了頁面,它使用 JavaScript 生成帶有搜索結果的頁面,但它沒有從其他 url 獲取資料 - 它直接在 HTML 中包含所有資訊
<script>
window.icvData = {...}
</script>
產品頁面也是如此。他們也有直接在 HTML 中的資料。
有時他們可能有額外的線路,window.icvData.firstSaleItemId = ...
但我跳過了這些資訊。
import scrapy
import json
from scrapy.spiders import Spider
class PwspiderSpider(Spider):
name = 'pwspider'
allowed_domains = ['midwayusa.com']
start_urls = ['https://www.midwayusa.com/s?searchTerm=backpack']
def parse(self, response):
print('url:', response.url)
script = response.xpath('//script[contains(text(), "window.icvData")]/text()').get()
#print(script)
text = script.split("window.icvData = ")[-1].split('\n')[0].strip()
try:
data = json.loads(text)
except Exception as ex:
print('Exception:', ex)
print(text)
return
#print(data["searchResult"].keys())
products = data["searchResult"]['products']
for item in products:
#print(item)
colors = [color['name'] for color in item['swatches']]
print(item['description'], colors)
yield response.follow(item['link'], callback=self.parse_product, cb_kwargs={'colors': colors})
def parse_product(self, response, colors):
print('url:', response.url)
script = response.xpath('//script[contains(text(), "window.icvData")]/text()').get()
#print(script)
# I uses `.split('\n')[0]` because sometimes it may have second line with `window.icvData.firstSaleItemId = ...`
text = script.split("window.icvData = ")[-1].split('\n')[0].strip()
try:
data = json.loads(text)
data['colors'] = colors
except Exception as ex:
print('Exception:', ex)
print(text)
return
yield data
# --- run without project and save in `output.csv` ---
from scrapy.crawler import CrawlerProcess
c = CrawlerProcess({
# 'USER_AGENT': 'Mozilla/5.0',
'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0',
# save in file CSV, JSON or XML
'FEEDS': {'output.json': {'format': 'json'}}, # new in 2.1
})
c.crawl(PwspiderSpider)
c.start()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/439607.html
下一篇:集合視圖不顯示單元格
