所以我的問題是:我有一個包含產品串列的網頁。每個產品在每個 div 的屬性中都定義了很多東西。但是,其中一個欄位不明確,所以我決定打開產品頁面并從那里獲取它,在那里我還發現了一些我認為可能對我的分析有用的其他資料。但是,當我合并資料時,某些列是相同的,而其他列似乎已更新。
這是代碼:
import scrapy
from scrapy.utils.response import open_in_browser
class getSalesData(scrapy.Spider):
name = 'getsalesdata'
start_urls = ['https://link']
def __init__(self):
self.params = ['data-id-cod', 'id', 'data-name','data-area' ,'data-zone' ,'data-items','data-ssellertype' ,
'data-surface' ,'price' ,'tva' ,'mobile-container-url']
self.item = { "id_cod" : 'null',
"id" : 'null',
"tip_prop" : 'null',
"area" : 'null',
"zone" : 'null',
"no_items" : 'null',
"seller_type" : 'null',
"surface" : 'null',
"surface_orig" : 'null',
"price" : 'null',
"currency" : 'null',
"url" : 'null'
}
self.columns = { "data-id-cod" : 'id_cod',
"id" : 'id',
"data-name" : 'tip_prop',
"data-area" : 'area',
"data-zone" : 'zone',
"data-items" : 'nr_items',
"data-ssellertype" : 'seller_type',
"data-surface" : 'surface',
"price" : 'price',
"tva" : 'valuta',
"mobile-container-url" : 'url'
}
def parse(self, response):
item = self.item
for listing in response.css("div.box-an"):
if not 'box-an ' in listing.attrib['class']:
for parameter in self.params:
if parameter in ['price', 'tva']:
item[self.columns[parameter]] = \
(listing.css('span.' parameter '::text').get()).replace('.','') \
if (parameter in listing.get()) else item[self.columns[parameter]]
elif parameter in 'mobile-container-url':
url = listing.css('a.visible-xs.' parameter).attrib['href'] \
if (parameter in listing.get()) else item[self.columns[parameter]]
#self.logger.info('----->>> At URL : ' url)
item[self.columns[parameter]] = url
elif parameter in 'data-surface':
item['surface'] = str(int(listing.attrib[parameter])/100) \
if (int(listing.attrib[parameter])>1000) else listing.attrib[parameter]
item['surface_orig'] = listing.attrib[parameter] \
if (parameter in listing.get()) else item[self.columns[parameter]]
else:
item[self.columns[parameter]] = \
listing.attrib[parameter] if (parameter in listing.get()) else item[self.columns[parameter]]
request = scrapy.Request(url=item['url'],
callback=self.parseNextPage,
meta={'item' : item})
yield request
def parseNextPage(self, response):
item = response.meta['item']
self.logger.info('Running on : ' item['url'])
#for spec in response.css('li.list-group-item.specificatii-oferta__lista--item'):
for spec in response.css('ul.list-tab'):
for lst in spec.css('li'):
field = lst.css('li::text').get()
#self.logger.info('Adding ' field '\n')
item[field] = lst.css('span::text').get()
return item
這是資料(請參閱相同的星號專案):
id_cod id tip_prop no_items surface surface_all
*A2Q00LMBUS9 *XA2Q0001E *prodType1 2 41,21 mp *46.89 mp
*A2Q00LMBUS9 *XA2Q0001E *prodType1 3 140 mp *46.89 mp
我有一種感覺,我不明白 self.item 是如何更新的,并且一些資料是從以前的運行中保留的,也許?
更新:這很奇怪。如果我使用此代碼:
request = scrapy.Request(url=item['url'],
callback=self.parseNextPage,
meta={'item' : {'id' : item['id'] ,
'id_cod' : item['id_cod'],
'area' : item['area'],
'nr_items' : item['nr_items'],
'seller_type' : item['seller_type'],
'surface' : item['suprafata'],
'tip_prop' : item['tip_prop'],
'url' : item['url'],
'currency' : item['valuta'],
'area' : item['zona']
}
}
)
它作業正常。但是,如果我使用此代碼:
request = scrapy.Request(url=item['url'],
callback=self.parseNextPage,
meta={'item' : item})
它不再起作用了。我在上面傳遞的專案和字典是相同的。
uj5u.com熱心網友回復:
因為item作為參考傳遞給請求的元資料,并且它所參考的記憶體在所有產品之間重復使用,所以一直被覆寫。
要修復在建構式中洗掉宣告self.item并簡單地在回圈中創建新專案:
...
def init_item(self):
return { "id_cod" : 'null',
"id" : 'null',
"tip_prop" : 'null',
"area" : 'null',
"zone" : 'null',
"no_items" : 'null',
"seller_type" : 'null',
"surface" : 'null',
"surface_orig" : 'null',
"price" : 'null',
"currency" : 'null',
"url" : 'null'
}
def parse(self, response):
for listing in response.css("div.box-an"):
item = self.init_item()
if not 'box-an ' in listing.attrib['class']:
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/460060.html
