我正在做一個附帶專案,作為學習 Python 的機會,并拼湊了一個大部分時間都可以使用的網路爬蟲。本質上,我有一個大約 2,000 個專案的串列,我對這些專案進行迭代,為每個專案創建一個單獨的 POST 請求,該請求回傳一個包含股票和價格資料的 JSON 檔案。
我遇到的問題是,在某些運行中,我的串列中有一個隨機專案回傳:“TypeError:'NoneType' object is not subscriptable”。這將我從 for 回圈中敲出,我必須重新啟動整個程序,但不能保證下一次它可以正常作業。有沒有辦法跳過串列中回傳此錯誤的專案并保持腳本運行?
最近的錯誤是串列中大約第 200 項的這一行:
price = resp['data']['product']['pricing']['value']
代碼部分:
for store_code in stores_codes:
for prod in prods:
query = {
"operationName":"productClientOnlyProduct","variables":{
"skipSpecificationGroup":False,"skipSubscribeAndSave":False,"skipKPF":False,"itemId":str(prod),"storeId":str(store_code),"zipCode":"75209" #not sure we need to change zip?
},
"query":"query productClientOnlyProduct($storeId: String, $zipCode: String, $itemId: String!, $dataSource: String, $loyaltyMembershipInput: LoyaltyMembershipInput, $skipSpecificationGroup: Boolean = false, $skipSubscribeAndSave: Boolean = false, $skipKPF: Boolean = false) {\n product(itemId: $itemId, dataSource: $dataSource, loyaltyMembershipInput: $loyaltyMembershipInput) {\n fulfillment(storeId: $storeId, zipCode: $zipCode) {\n backordered\n fulfillmentOptions {\n type\n services {\n type\n locations {\n isAnchor\n inventory {\n isLimitedQuantity\n isOutOfStock\n isInStock\n quantity\n isUnavailable\n maxAllowedBopisQty\n minAllowedBopisQty\n __typename\n }\n type\n storeName\n locationId\n curbsidePickupFlag\n isBuyInStoreCheckNearBy\n distance\n state\n storePhone\n __typename\n }\n deliveryTimeline\n deliveryDates {\n startDate\n endDate\n __typename\n }\n deliveryCharge\n dynamicEta {\n hours\n minutes\n __typename\n }\n hasFreeShipping\n freeDeliveryThreshold\n totalCharge\n __typename\n }\n fulfillable\n __typename\n }\n anchorStoreStatus\n anchorStoreStatusType\n backorderedShipDate\n bossExcludedShipStates\n sthExcludedShipState\n bossExcludedShipState\n excludedShipStates\n seasonStatusEligible\n onlineStoreStatus\n onlineStoreStatusType\n inStoreAssemblyEligible\n __typename\n }\n info {\n dotComColorEligible\n hidePrice\n ecoRebate\n quantityLimit\n sskMin\n sskMax\n unitOfMeasureCoverage\n wasMaxPriceRange\n wasMinPriceRange\n fiscalYear\n productDepartment\n classNumber\n forProfessionalUseOnly\n globalCustomConfigurator {\n customButtonText\n customDescription\n customExperience\n customExperienceUrl\n customTitle\n __typename\n }\n paintBrand\n movingCalculatorEligible\n label\n prop65Warning\n returnable\n recommendationFlags {\n visualNavigation\n reqItems\n batItems\n __typename\n }\n replacementOMSID\n hasSubscription\n minimumOrderQuantity\n projectCalculatorEligible\n subClassNumber\n calculatorType\n isLiveGoodsProduct\n protectionPlanSku\n hasServiceAddOns\n consultationType\n __typename\n }\n itemId\n dataSources\n identifiers {\n canonicalUrl\n brandName\n itemId\n modelNumber\n productLabel\n storeSkuNumber\n upcGtin13\n specialOrderSku\n toolRentalSkuNumber\n rentalCategory\n rentalSubCategory\n upc\n productType\n isSuperSku\n parentId\n roomVOEnabled\n sampleId\n __typename\n }\n availabilityType {\n discontinued\n status\n type\n buyable\n __typename\n }\n details {\n description\n collection {\n url\n collectionId\n __typename\n }\n highlights\n descriptiveAttributes {\n name\n value\n bulleted\n sequence\n __typename\n }\n infoAndGuides {\n name\n url\n __typename\n }\n installation {\n leadGenUrl\n __typename\n }\n __typename\n }\n media {\n images {\n url\n type\n subType\n sizes\n __typename\n }\n video {\n shortDescription\n thumbnail\n url\n videoStill\n link {\n text\n url\n __typename\n }\n title\n type\n videoId\n longDescription\n __typename\n }\n threeSixty {\n id\n url\n __typename\n }\n augmentedRealityLink {\n usdz\n image\n __typename\n }\n richContent {\n content\n __typename\n }\n __typename\n }\n pricing(storeId: $storeId) {\n promotion {\n dates {\n end\n start\n __typename\n }\n type\n description {\n shortDesc\n longDesc\n __typename\n }\n dollarOff\n percentageOff\n savingsCenter\n savingsCenterPromos\n specialBuySavings\n specialBuyDollarOff\n specialBuyPercentageOff\n experienceTag\n subExperienceTag\n anchorItemList\n itemList\n reward {\n tiers {\n minPurchaseAmount\n minPurchaseQuantity\n rewardPercent\n rewardAmountPerOrder\n rewardAmountPerItem\n rewardFixedPrice\n __typename\n }\n __typename\n }\n __typename\n }\n value\n alternatePriceDisplay\n alternate {\n bulk {\n pricePerUnit\n thresholdQuantity\n value\n __typename\n }\n unit {\n caseUnitOfMeasure\n unitsOriginalPrice\n unitsPerCase\n value\n __typename\n }\n __typename\n }\n original\n mapAboveOriginalPrice\n message\n preferredPriceFlag\n specialBuy\n unitOfMeasure\n __typename\n }\n reviews {\n ratingsReviews {\n averageRating\n totalReviews\n __typename\n }\n __typename\n }\n seo {\n seoKeywords\n seoDescription\n __typename\n }\n specificationGroup @skip(if: $skipSpecificationGroup) {\n specifications {\n specName\n specValue\n __typename\n }\n specTitle\n __typename\n }\n taxonomy {\n breadCrumbs {\n label\n url\n browseUrl\n creativeIconUrl\n deselectUrl\n dimensionName\n refinementKey\n __typename\n }\n brandLinkUrl\n __typename\n }\n favoriteDetail {\n count\n __typename\n }\n sizeAndFitDetail {\n attributeGroups {\n attributes {\n attributeName\n dimensions\n __typename\n }\n dimensionLabel\n productType\n __typename\n }\n __typename\n }\n subscription @skip(if: $skipSubscribeAndSave) {\n defaultfrequency\n discountPercentage\n subscriptionEnabled\n __typename\n }\n badges(storeId: $storeId) {\n label\n color\n creativeImageUrl\n endDate\n message\n name\n timerDuration\n timer {\n timeBombThreshold\n daysLeftThreshold\n dateDisplayThreshold\n message\n __typename\n }\n __typename\n }\n keyProductFeatures @skip(if: $skipKPF) {\n keyProductFeaturesItems {\n features {\n name\n refinementId\n refinementUrl\n value\n __typename\n }\n __typename\n }\n __typename\n }\n seoDescription\n installServices {\n scheduleAMeasure\n __typename\n }\n dataSource\n __typename\n }\n}\n"}
url = 'https://www.homedepot.com/federation-gateway/graphql?opname=productClientOnlyProduct'
resp = s.post(url,headers=headers,json=query).json()
name = resp['data']['product']['identifiers']['productLabel']
price = resp['data']['product']['pricing']['value']
stock = resp['data']['product']['fulfillment']['fulfillmentOptions'][0]['services'][0]['locations'][0]['inventory']['quantity']
uj5u.com熱心網友回復:
您有 2 個選項:
使用 try-except 捕獲錯誤:
try:
name = resp['data']['product']['identifiers']['productLabel']
price = resp['data']['product']['pricing']['value']
stock = resp['data']['product']['fulfillment']['fulfillmentOptions'][0]['services'][0]['locations'][0]['inventory']['quantity']
except TypeError:
print("Data not found")
使用get而不是括號 [] 來訪問資料。這樣,如果某些東西不存在,您可以將其替換為默認值,對于庫存,使用next這樣您就可以回傳默認值以防萬一它不存在:
product = resp.get('data', dict()).get('product', dict())
name = product.get('identifiers', dict()).get('productLabel', '')
price = product.get('pricing', dict()).get('value', 0)
stock = next((product.get('fulfillment', dict()).get('fulfillmentOptions', dict())), 0) # returns 0 if it doesn't exist
uj5u.com熱心網友回復:
您可以包圍最后三行,您可以在其中訪問try/except塊中的回應欄位。
try:
name = resp['data']['product']['identifiers']['productLabel']
price = resp['data']['product']['pricing']['value']
stock = resp['data']['product']['fulfillment']['fulfillmentOptions'][0]['services'][0]['locations'][0]['inventory']['quantity']
except TypeError:
print("error occured")
continue
continue關鍵字用于繼續下一次迭代,無論您的代碼塊后面會發生什么。
uj5u.com熱心網友回復:
添加一行
if prod is None:
del a [prod]
你也可以試試,
except TypeError:
#what you want to do if type is none
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415165.html
標籤:
上一篇:python中的資料整理/清理
