xpath l oop страниц с красивым супом - PullRequest
0 голосов
/ 24 апреля 2020

Это, вероятно, несколько вопросов в одном, но человек, который может мне помочь, возможно, ответит на них все, поэтому я пишу это как один вопрос.

Итак, я хочу получить данные для разных продуктов.

  • Каждый продукт имеет несколько точек данных, которые я хотел бы собрать
  • На каждой странице перечислены 30 продуктов
  • Есть сотни страниц

Я использую xpath для получения данных, но я понял, что может быть сложно использовать beautifulSoup вместе с Xpath.

Проблемы:

  • Я не понимаю, как использовать BeautifulSoup в моем примере, когда я использую xPath
  • Я пытался l oop страниц с for-l oop, и это работало нормально. Затем я добавил элементы с помощью foundTitles.append ([title.text]), но потом мне не удалось заставить работать фрейм данных. Возможно, потому что я не понимаю, как поместить новый формат в фрейм данных.

Код:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
import time

options = Options()
options.add_argument("window-size=1400,600")
from fake_useragent import UserAgent 

ua = UserAgent()
a = ua.random
user_agent = ua.random

options.add_argument(f'user-agent={user_agent}')

driver = webdriver.Chrome(r"C:\Users\aaaa.bbbbb\Anaconda3\Lib\site-packages\chromedriver\chromedriver.exe")
baseUrl3 = 'https://wwwwwwww/sok/?categoryLevel1=Vin&assortmentText=Fast%20sortiment&page=2'
driver.get(baseUrl3);

image = []
productlink = []
group = []
title = []
typeyear = []
description = []
fruktsyra = []
fyllighet = []
stravhet = []
country = []
volume = []
price = []
maltid1 =[]

content= driver.page_source
soup = BeautifulSoup(content,'lxml')

image = driver.find_element_by_xpath("//img[@class='css-xzqcxb css-np3gtv']")
productlink = driver.find_element_by_xpath("//a[@class='css-10xvljd']")
group = driver.find_element_by_xpath("//h4[@class='css-16yusii']")
title = driver.find_element_by_xpath("//h3[@class='css-k091gg']")
typeyear = driver.find_element_by_xpath("//h3[@class='css-4hwyid']")
description = driver.find_element_by_xpath("//div[@class='css-uq1q8a']")
fruktsyra = driver.find_element_by_xpath("//li[@class='css-ffxk30'][1]/div/div[@class='css-1q82610']")
fyllighet = driver.find_element_by_xpath("//li[@class='css-ffxk30'][2]/div/div[@class='css-1q82610']")
stravhet = driver.find_element_by_xpath("//li[@class='css-ffxk30'][3]/div/div[@class='css-1q82610']")
country = driver.find_element_by_xpath("//div[@class='css-gl5xni']/span[2]")
volume = driver.find_element_by_xpath("//span[@class='css-15am57e']")
price = driver.find_element_by_xpath("//span[@class='css-tz3s9q']")
maltid1 = driver.find_element_by_xpath("//div[@class='css-uq1q8a'][1]/span[@class='css-1wkn33'][1]")


product_data = {
    'image_url': image.get_attribute('src'),
    'productlink': productlink.get_attribute('href'),
    'group': group.text,
    'title': title.text,
    'typeyear': typeyear.text,
    'description': description.text,
    'fruktsyra': fruktsyra.get_attribute('aria-label'),
    'fyllighet': fyllighet.get_attribute('aria-label'),
    'stravhet': stravhet.get_attribute('aria-label'),
    'country': country.text,
    'volume': volume.text,
    'price': price.text,
    'maltid1': maltid1.text,
    }

df = pd.DataFrame({'image_url': image.get_attribute('src'),'productlink': productlink.get_attribute('href'),'group': group.text,'title': title.text,'typeyear': typeyear.text, 'description': description.text, 'fruktsyra':fruktsyra.get_attribute('aria-label'), 'fyllighet':fyllighet.get_attribute('aria-label'),'stravhet':stravhet.get_attribute('aria-label'),'country':country.text, 'volume': volume.text, 'price': price.text,'maltid1': maltid1.text},index=[0])
df.to_csv(r'C:\Users\aaaa.bbbbb\Documents\Python Scripts\sytemet_test2.csv', index=False, sep=';',encoding='utf-8')

driver.implicitly_wait(1)
driver.quit()

1 Ответ

0 голосов
/ 25 апреля 2020

На самом деле вам не нужен селен или даже BeautifulSoup, весь контент загружается с помощью xhr запросов без необходимости javascript, как вы можете видеть на вкладке сети инструментов разработчика браузера, то есть:

import requests

h = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
    'X-Requested-With': 'XMLHttpRequest',
}

u = "https://www.systembolaget.se/api/productsearch/search/sok-dryck/?searchquery=land&sortdirection=Ascending&site=all&fullassortment=1"

req = requests.get(u,headers=h).json()

for prod in req['ProductSearchResults']:
    ProductId = prod['ProductId']
    ProductNumber = prod['ProductNumber']
    ProductNameBold = prod['ProductNameBold']
    ProductNameThin = prod['ProductNameThin']
    Volume = prod['Volume']
    Price = prod['Price']
    Category = prod['Category']
    ProductNumberShort = prod['ProductNumberShort']
    TasteAndUsage = prod['TasteAndUsage']
    #...  and many other product details
    print(ProductNumber, ProductNameBold)

9001001 Evening Land Vineyard Seven Springs
7233401 Seven Springs
694701 Tyrrell's Wines
57801 Barceló
53701 Highland Queen
57802 Barceló
...

Чтобы получить сведения о продукте по отдельности или в пакете, введите следующий запрос:

u = "https://www.systembolaget.se/api/product/GetProductsForAnalytics"
d = {"ProductNumbers":["2048801"]} # use the ProductNumber(s) gattered above
prod_detail = requests.post(u, json=d, headers=h).json()
print(prod_detail)

{'Products': [{'ProductId': '303987', 'ProductNumberShort': '20488', 'Assortment': 'FS', 'CustomerOrderSupplySource': 'depot', 'SupplyCode': None, 'IsNewVintage': False, 'OriginLevel1': 'Skottland', 'OriginLevel2': 'Highlands', 'OriginLevel3': 'Western Highlands', 'OriginLevel4': None, 'OriginLevel5': None, 'BrandOrigin': None, 'BottleCode': 'Helbutelj', 'BottleTypeGroup': 'Helflaska glas', 'IsWebLaunch': False, 'Seal': 'Skruvkapsyl', 'VatCode': 1, 'PriceExclVat': 1199.2, 'PriceInclVatExclRecycleFee': 1499.0, 'PriorPrice': 0.0, 'ComparisonPrice': 2141.43, 'SellStartDate': '2008-04-01T00:00:00', 'SellStartTime': '10:00:00', 'BottleTypes': None, 'IsSellStartDateHighlighted': False, 'SellStartSearchUrl': '/sok-dryck/?sellstartdatefrom=2008-04-01&sellstartdateto=2008-04-01', 'ProducerName': 'Lang Brothers Limited', 'ProducerDescription': 'Familjen Edmonstone erhöll licens att destillera 1833. 1851 såldes destilleriet, under namnet Burnfoot, till MacLelleand som säljer det till Lang Brothers 1876, då under namnet Glen Guin. \n1905 blir det officiella namnet Glengoyne. 1965 blir Langs en del av Robertson & Baxter Group, som senare blir Edrington. 2003 köper företaget Ian Macleod & Co. destilleriet och varumärket Langs. Samtidigt byter man namn till Ian Macleod Distillers.', 'TasteAndUsage': 'Komplex, smakrik whisky med tydlig karaktär av sherryfat, inslag av valnötter, torkad frukt, kakao, lakrits och honung. Serveras rumstempererad som avec.', 'Production': None, 'CultivationArea': 'Glengoyne ligger i Western Highlands, alltså de västra delarna av Skottland. Gränsen för vad som räknas till de norra och västra högländerna brukar gå vid destillerier som ligger i nordvästlig riktning räknat från Staden Inverness.', 'Harvest': None, 'Soil': None, 'SupplierName': 'Cask Sweden AB', 'IsManufacturingCountry': True, 'IsSupplierTemporaryNotAvailable': False, 'IsSupplierNotAvailable': False, 'BackInStockAtSupplier': None, 'IsDiscontinued': False, 'IsCompletelyOutOfStock': False, 'IsTemporaryOutOfStock': False, 'RestrictedParcelQuantity': 0, 'IsRegionalRestricted': False, 'IsNewInAssortment': False, 'IsLimitedEdition': False, 'IsFsAssortment': True, 'IsTseAssortment': False, 'IsTsLsAssortment': False, 'IsHidden': False, 'IsSearchable': True, 'IsInAnyStoreSearchAssortment': True, 'IsStoreOrderApplicable': True, 'IsHomeOrderApplicable': True, 'IsAgentOrderApplicable': True, 'SeasonName': None, 'IsDishMatchable': False, 'IsDKI': False, 'AllergenStatement': 'Inga Allergener', 'IngredientStatement': None, 'AlcoholPercentage': 43.0, 'TasteSymbols': 'Avec/digestif;', 'TasteClockGroup': 'Ingen rökighet', 'TasteClockBitter': None, 'TasteClockFruitacid': None, 'TasteClockBody': None, 'TasteClockRoughness': None, 'TasteClockSweetness': None, 'TasteClockCasque': 8, 'TasteClockSmokiness': 1, 'IsCategoryBeer': False, 'IsCategoryBeerOrWhiskey': False, 'IsNewsIconVisible': False, 'Grapes': None, 'RawMaterial': 'Mältat korn av typen golden promise.', 'SugarContent': '<3', 'Additives': None, 'Storage': None, 'Preservable': '', 'HasInbounddeliveries': False, 'IsGlutenFree': False, 'IsEthical': False, 'EthicalLabel': None, 'IsKosher': False, 'Created': '2014-04-23T10:47:03', 'Modified': '2020-04-24T02:09:06', 'ShowAdditionalBottleTypes': False, 'OriginLevels': ['Skottland', 'Highlands', 'Western Highlands'], 'TasteSymbolsList': ['Avec/digestif'], 'IsTasteAndUsageAlone': True, 'ImageItem': [{'ImageUrl': 'https://static.systembolaget.se/imagelibrary/publishedmedia/rdxofqidiov294hwwqxz/303987.jpg', 'ImageAltAttribute': '303987'}], 'WebLaunch': None, 'ProductNutritionHeaders': [], 'HasProductImage': True, 'HasAnyTaste': True, 'HasSymbolsOrRecycleFee': False, 'HasTasteAndRestrictions': False, 'HasRestrictions': False, 'HasSymbols': False, 'HasAnyTasteClocks': True, 'HasAnyTasteSymbols': True, 'ProductNumber': '2048801', 'ProductNameBold': 'Glengoyne', 'ProductNameThin': '21 Years', 'PriceInclVat': 1499.0, 'IsOrganic': False, 'IsLightWeightBottle': False, 'Volume': 700.0, 'Vintage': 0, 'Country': 'Storbritannien', 'Category': 'Sprit', 'SubCategory': 'Whisky', 'Type': 'Maltwhisky', 'Style': None, 'BeverageDescriptionShort': 'Maltwhisky', 'StyleDescription': None, 'RecycleFee': 0.0, 'RecycleFeeIndicator': '', 'BottleTextShort': 'Flaska', 'IsAddableToBasket': True, 'IsFsTsAssortment': True, 'IsBSAssortment': False, 'IsPaAssortment': False, 'ShowAdditionalBsInformation': False, 'Usage': 'Serveras rumstempererad som avec.', 'Color': 'Brungul färg.', 'Aroma': 'Komplex, harmonisk doft med tydlig karaktär av sherryfat, inslag av torkad frukt, valnötter, lakritsfudge, pomerans och mörk choklad.', 'Taste': 'Komplex, smakrik whisky med tydlig karaktär av sherryfat, inslag av valnötter, torkad frukt, kakao, lakrits och honung.', 'AdditionalInformation': "Avec är drycker som konsumeras efter middagen till kaffet. Vanliga exempel på avec är whisky, cognac, mörk rom eller likörer. Ordet är franskt, betyder 'med' och är en kortform av uttrycket 'du café avec le petit verre' som betyder kaffe med det lilla glaset.  "}], 'StockBalances': []}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...