Citat:
Jag skulle faktiskt rekommendera att du lär dig grunderna för CSS-selectors och använder Javascript direkt i browsern för att "leka" runt. Det som jag gjort här har jag slängt ihop på några minuter, eftersom jag känner till metoden.
Grundläggande HTML är också nödvändigt att känna till.
Det viktigaste i scraping är att kunna identifiera vilka element som man vill åt och vilka "mönster" som detta förutsätter.
I ditt exempel gjorde jag så här:
* Gick in på Nespresso-hemsidan i browsern och tryckte F12 (för utvecklarverktyg)
* Tryckte på inspektera-knappen och valde en av "rutorna" som har en kaffekapsel i sig.
* Tittade på hur detta element ser ut i HTLM-koden (under fliken Elements)
* Jag kunde då identifera ett väldigt speciellt element i detta fall som innehöll all nödvändig data. Det såg ut som följer:
* Eftersom jag kan grundläggande HTML förstod jag att just i detta fall så är elementet med "taggen" nb-sku-coffee ett "custom made" element, som hemsideskaparen själv har hittat på. Det verkade därför rimligt att alla "rutor" på sidan hade samma typ av "custom made"-element.
* Jag provade då att göra en sökning på hela HTML-sidan genom konsollen (Console-fliken - fortfarande i Developer Tools), med följande kod:
Varje sådant element innehåller dessutom (bekvämt nog) all information som vi vill åt.
Hemsideutvecklaren har lagt in ett "custom"-attribut som heter "data" i form av en textsträng i något som kallas JSON-formatet. Man får fram textsträngen genom funktionen getAttribute("data"). Resultatet är ett Javascript-objekt som är omvandlat till en textsträng. Genom funktionen JSON.Parse så kan vi omvandla textsträngen till ett objekt. Ovanstående exempel-element renderar då följande objekt:
Understryket i spoilern är de dataattribut som du var intresserad av och när man väl har ett Javascript-objekt är det mycket lätt att få ut dom genom principen:
obj.name och obj.price
Id som du också ville få, fanns direkt i elementet.
Grundläggande HTML är också nödvändigt att känna till.
Det viktigaste i scraping är att kunna identifiera vilka element som man vill åt och vilka "mönster" som detta förutsätter.
I ditt exempel gjorde jag så här:
* Gick in på Nespresso-hemsidan i browsern och tryckte F12 (för utvecklarverktyg)
* Tryckte på inspektera-knappen och valde en av "rutorna" som har en kaffekapsel i sig.
* Tittade på hur detta element ser ut i HTLM-koden (under fliken Elements)
* Jag kunde då identifera ett väldigt speciellt element i detta fall som innehöll all nödvändig data. Det såg ut som följer:
<nb-sku-coffee id="7256.30" data="{"id":"erp.se.b2c/prod/7256.30","name":"Vertuo Infiniment Double Espresso ","available":true,"cupSizes&q uot;:["nesclub2.se.b2c/cat/capsule-cupSize-double-espresso-vertuo"],"description":null,"flavors": ["nesclub2.se.b2c/cat/capsule-aromatic-fruity"],"headline":"FRUKTIG & KORNIG","hidePrice":false,"ima ge_alt_text":"","image":& quot;/ecom/medias/sys_master/public/15959523786782/C-0964-ResponsivePLPImage.png","internationalId ":"7256.30","internationalName ":"VL INFINIMENT DOUBLE ESPRESSO","legacyId":"7256.30& quot;,"maxOrderQuantity":null,"pack agingType":null,"price":"SEK 84.90","pushRatingEnabled":false,&q uot;ranges":[TRUNKERAT AV UTRYMMESSKÄL]</nb-sku-coffee>
* Jag provade då att göra en sökning på hela HTML-sidan genom konsollen (Console-fliken - fortfarande i Developer Tools), med följande kod:
Kod:
Detta returnerar en NodeList (lista med HTML-element) med 60 medlemmar.document.querySelectorAll("nb-sku-coffee");
Varje sådant element innehåller dessutom (bekvämt nog) all information som vi vill åt.
Hemsideutvecklaren har lagt in ett "custom"-attribut som heter "data" i form av en textsträng i något som kallas JSON-formatet. Man får fram textsträngen genom funktionen getAttribute("data"). Resultatet är ett Javascript-objekt som är omvandlat till en textsträng. Genom funktionen JSON.Parse så kan vi omvandla textsträngen till ett objekt. Ovanstående exempel-element renderar då följande objekt:
{
"id": "erp.se.b2c/prod/7256.30",
"name": "Vertuo Infiniment Double Espresso ",
"available": true,
"cupSizes": [
"nesclub2.se.b2c/cat/capsule-cupSize-double-espresso-vertuo"
],
"description": null,
"flavors": [
"nesclub2.se.b2c/cat/capsule-aromatic-fruity"
],
"headline": "FRUKTIG & KORNIG",
"hidePrice": false,
"image_alt_text": "",
"image": "/ecom/medias/sys_master/public/15959523786782/C-0964-ResponsivePLPImage.png",
"internationalId": "7256.30",
"internationalName": "VL INFINIMENT DOUBLE ESPRESSO",
"legacyId": "7256.30",
"maxOrderQuantity": null,
"packagingType": null,
"price": "SEK 84.90",
"pushRatingEnabled": false,
"ranges": [
"nesclub2.se.b2c/cat/capsule-range-label-LE",
"nesclub2.se.b2c/cat/capsule-range-limitedEdition",
"nesclub2.se.b2c/cat/capsule-range-label-new"
],
"salesMultiple": 10,
"technologies": [
"nesclub2.se.b2c/machineTechno/vertuo"
],
"type": "capsule",
"unitQuantity": 1,
"url": "/se/se/order/capsules/vertuo/infiniment-espresso-vertuo-kaffe",
"labels": [
{
"color": "#ffffff",
"name": "LIMITED EDITION",
"bgColor": "#38761d"
},
{
"color": "#FFFFFF",
"name": "NY",
"bgColor": "#ffd966"
}
],
"category_name": "capsule-range-limitedEdition",
"sku": "7256.30",
"longSku": "erp.se.b2c/prod/7256.30",
"slides": [],
"show_slider": "true",
"in_stock": true,
"sales_multiple": 10,
"bundled": false,
"logos": [],
"is_headline_hidden": false,
"a11y_price": "kr per kafferör",
"a11y_product_card": "View more details about {productName}",
"label_sleeve": "kafferör",
"label_sleeves": "kafferör",
"label_capsules": "kapslar",
"intensity": 6,
"a11y_intensity_max": "maximalt 12",
"label_decaffeinato": "decaffeinato",
"show_sleeve_price": true,
"show_sleeve": true,
"price_per_capsule": "SEK 8.49",
"final_price": null,
"capsule_price_label": "",
"capsule_price_syntax": "{capsule_price_label}: {price_per_capsule}",
"strikethrough_price": "",
"sleeve_syntax": "{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})",
"number_of_sleeves": "",
"number_of_capsules": "",
"show_capsule_price": true,
"additional_message": "",
"additional_message_icon": "",
"additional_message_link": {},
"highlighted": false,
"bundle_details": {},
"min_intensity": 2,
"max_intensity": 11,
"quick_view_plp": {},
"images": {},
"rendererName": {},
"intensity_label": "Intensitet",
"variation": "plp"
}
"id": "erp.se.b2c/prod/7256.30",
"name": "Vertuo Infiniment Double Espresso ",
"available": true,
"cupSizes": [
"nesclub2.se.b2c/cat/capsule-cupSize-double-espresso-vertuo"
],
"description": null,
"flavors": [
"nesclub2.se.b2c/cat/capsule-aromatic-fruity"
],
"headline": "FRUKTIG & KORNIG",
"hidePrice": false,
"image_alt_text": "",
"image": "/ecom/medias/sys_master/public/15959523786782/C-0964-ResponsivePLPImage.png",
"internationalId": "7256.30",
"internationalName": "VL INFINIMENT DOUBLE ESPRESSO",
"legacyId": "7256.30",
"maxOrderQuantity": null,
"packagingType": null,
"price": "SEK 84.90",
"pushRatingEnabled": false,
"ranges": [
"nesclub2.se.b2c/cat/capsule-range-label-LE",
"nesclub2.se.b2c/cat/capsule-range-limitedEdition",
"nesclub2.se.b2c/cat/capsule-range-label-new"
],
"salesMultiple": 10,
"technologies": [
"nesclub2.se.b2c/machineTechno/vertuo"
],
"type": "capsule",
"unitQuantity": 1,
"url": "/se/se/order/capsules/vertuo/infiniment-espresso-vertuo-kaffe",
"labels": [
{
"color": "#ffffff",
"name": "LIMITED EDITION",
"bgColor": "#38761d"
},
{
"color": "#FFFFFF",
"name": "NY",
"bgColor": "#ffd966"
}
],
"category_name": "capsule-range-limitedEdition",
"sku": "7256.30",
"longSku": "erp.se.b2c/prod/7256.30",
"slides": [],
"show_slider": "true",
"in_stock": true,
"sales_multiple": 10,
"bundled": false,
"logos": [],
"is_headline_hidden": false,
"a11y_price": "kr per kafferör",
"a11y_product_card": "View more details about {productName}",
"label_sleeve": "kafferör",
"label_sleeves": "kafferör",
"label_capsules": "kapslar",
"intensity": 6,
"a11y_intensity_max": "maximalt 12",
"label_decaffeinato": "decaffeinato",
"show_sleeve_price": true,
"show_sleeve": true,
"price_per_capsule": "SEK 8.49",
"final_price": null,
"capsule_price_label": "",
"capsule_price_syntax": "{capsule_price_label}: {price_per_capsule}",
"strikethrough_price": "",
"sleeve_syntax": "{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})",
"number_of_sleeves": "",
"number_of_capsules": "",
"show_capsule_price": true,
"additional_message": "",
"additional_message_icon": "",
"additional_message_link": {},
"highlighted": false,
"bundle_details": {},
"min_intensity": 2,
"max_intensity": 11,
"quick_view_plp": {},
"images": {},
"rendererName": {},
"intensity_label": "Intensitet",
"variation": "plp"
}
obj.name och obj.price
Id som du också ville få, fanns direkt i elementet.
Det var väldigt intressant att höra att du inte rekommenderade python direkt för att lära sig web scraping som många verkar göra. Om man inte kan javascript alls, skulle du fortfarande göra samma rekommendation?