Как собирать данные с нескольких страниц в одной сети, я использую Python и BeautifulSoup - PullRequest
0 голосов
/ 29 июня 2018
   # -*- coding: utf-8 -*-
"""
Created on Fri Jun 29 10:38:46 2018

@author: Cinthia
"""

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
array = ['146-face', '153-palettes-sets', 'https://www.sociolla.com/147-eyes', 'https://www.sociolla.com/150-lips', 'https://www.sociolla.com/149-brows', 'https://www.sociolla.com/148-lashes']
base_url='https://www.sociolla.com/142-face'
uClient = uReq(base_url)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html, "html.parser")

#grab the product
kosmetik = page_soup.findAll("div", {"class":"col-md-3 col-sm-6 ipad-grid col-xs-12 productitem"})
print(len(kosmetik))

Я хочу почистить данные с этого веб-сайта, этот код, приведенный выше, просто берет сколько продукта на базовом URL. Я не знаю, как будет работать этот массив, поэтому он может получать данные из продукта, такие как описание, изображение, цена со всех страниц, которые я создаю в массиве.

Я новичок в Python и пока мало что знаю о циклах.

1 Ответ

0 голосов
/ 01 июля 2018

Здесь вы можете найти корневой элемент вашей таблицы / сетки, который равен id=product-list-grid, и извлечь атрибуты, в которых содержится вся необходимая информация (бренд, ссылка, категория) и первый тег <img>.

Для разбивки на страницы, кажется, вы можете перейти на следующую страницу, добавив p=<page number>, а когда страница не существует, она перенаправляет на первую. Обходной путь здесь состоит в том, чтобы проверить URL-адрес ответа и проверить, совпадает ли он с тем, который вы запрашивали. Если это то же самое, вы можете увеличить номер страницы, в противном случае вы удалили все страницы

from bs4 import BeautifulSoup
import urllib.request

count = 1
url = "https://www.sociolla.com/142-nails?p=%d"

def get_url(url):
    req = urllib.request.Request(url)
    return urllib.request.urlopen(req)

expected_url = url % count
response = get_url(expected_url)

results = []

while (response.url == expected_url):
    print("GET {0}".format(expected_url))
    soup = BeautifulSoup(response.read(), "html.parser")

    products = soup.find("div", attrs = {"id" : "product-list-grid"})

    results.append([
        (
            t["data-eec-brand"],    #brand
            t["data-eec-category"], #category
            t["data-eec-href"],     #product link
            t["data-eec-name"],     #product name
            t["data-eec-price"],    #price
            t.find("img")["src"]    #image link
        ) 
        for t in products.find_all("div", attrs = {"class" : "product-item"})
        if t
    ])

    count += 1
    expected_url = url % count
    response = get_url(expected_url)

print(results)

Здесь результаты хранятся в results, который является массивом кортежей

...