Как я могу использовать Webscrape в python с веб-сайтом, который использует AngularJS ng-include - PullRequest
1 голос
/ 03 августа 2020

Я новичок в python и Webscraping, я пытаюсь получить список продуктов с веб-сайта- https://www.melaleuca.com/ProductStore/content/category?c=52, но у меня возникает проблема, когда я сталкиваюсь с некоторыми Angular JS. Я могу получить это раньше, используя простой код, например

from bs4 import BeautifulSoup
import requests

laundryUrl = "https://www.melaleuca.com/ProductStore/content/category?c=52"
r = requests.get(laundryUrl)
soup = BeautifulSoup(r.text, features="html.parser")
product = soup.find(class_="category-info-wrapper")
print(product)

. Но когда я сталкиваюсь с ng-include, я больше не могу получить доступ к классам под ними. Когда я использую код

from bs4 import BeautifulSoup
import requests

laundryUrl = "https://www.melaleuca.com/ProductStore/content/category?c=52"
r = requests.get(laundryUrl)
soup = BeautifulSoup(r.text, features="html.parser")
product = soup.find(class_="product-card ng-scope)
print(product)

, я получаю «нет»

Я никогда не использовал angularJS, но из того, что я исследовал, похоже, что в файле html есть еще один файл html, как мне получить к нему доступ и данные? Я пробовал использовать Selenium и столкнулся с той же проблемой.

HTML, когда я просматриваю страницу, выглядит так

<div class="category-info-wrapper"></div>
<ol class="mela-product-wrapper ng-scope" ng- 
include="'//cdnus.melaleuca.com/html/product-store/product-card-201905.html'">
<li id="_8219" class="product-card ng-scope" ng-repeat="product in products" 
ng-init="culture">

...

1 Ответ

0 голосов
/ 03 августа 2020

Данные, которые вы видите на странице, загружаются с внешнего URL. Этот скрипт использует модуль requests / json для его анализа:

import re
import json
import requests
from bs4 import BeautifulSoup


url = 'https://api-us.melaleuca.com/search/v3'
params = {
    'id': 'products_by_category_facets',
    'index': 'en_us',
    'params': json.dumps(
        {"sortField":"","sortDir":"","from":0,"size":1000,"categoryId":"52","filters":[]}
    )
}
headers = {
    'Referer': 'https://www.melaleuca.com/ProductStore/content/category?c=52'
}

data = requests.get(url, params=params, headers=headers).json()

# uncomment this to print all data:
print(json.dumps(data, indent=4))

# print some data to screen:
for h in data['hits']['hits']:
    s = BeautifulSoup(h['_source']['name']['enhanced'], 'html.parser')
    print(s.text)
    print(h['_source']['sku'])
    print('-' * 80)

Выводит:

EcoSense® Clean Home Pack Save over $38.00 
8219
--------------------------------------------------------------------------------
EcoSense Laundry Value 4-Pack with 96 Load bottles Save up to $10.00 
6012
--------------------------------------------------------------------------------
Limited Time EcoSense Laundry Regular 4-Pack with 48 Load bottles Save $4.75
6013
--------------------------------------------------------------------------------
EcoSense® Kitchen Pack Save up to $4.00  (Mixing Spray Bottle not included)
8220
--------------------------------------------------------------------------------
EcoSense® Bathroom Pack Save $4.00  (Mixing Spray Bottles not included)
5679
--------------------------------------------------------------------------------
MelaSoft® Fabric Softener 96 Load 2-Pack Save $2.00
2154
--------------------------------------------------------------------------------

...and so on.
...