Problem Description:

该网站https://www.asos.com/us/women/dresses/cat/?cid=8799上的每个产品具有若干图像.例如,这是一个黑色连衣裙https://www.asos.com/us/asos-design/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/prd/204910824#colourWayId-204910828的产品URL,如果你点击它,你可以看到这个黑色连衣裙有4个图像.此外,还有两个其他 colored颜色 版本的这件衣服(驼色和粉红色).对于每一种 colored颜色 ,还有另外3-4个图像.我想收集所有这些图像(每个图像的黑色,驼色,和粉红色版本的这个产品).

What I tried (code below):到目前为止,我已经设法从主页收集了所有的产品URL,例如上面提供的第二个链接.但是,一旦我访问了每个产品URL,我就不知道如何访问该URL中的所有图像.在实现这一下一步的过程中,如果有任何指导,我将不胜感激.

来自谷歌Colab的代码:


# Upload google drive files
from google.colab import drive
drive.mount('/content/drive')
# Import libraries
import urllib
import urllib.request
from bs4 import BeautifulSoup
import re
import requests
import matplotlib.pyplot as plt
from io import BytesIO 
# Make Soup function
user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

headers={'User-Agent':user_agent,} 

def make_soup(url):
    request= urllib.request.Request(url, None,headers) 
    thepage = urllib.request.urlopen(request)
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata
# Find total page #s
site = 'https://www.asos.com/us/women/dresses/cat/?cid=8799'
soup = make_soup(site)
element = soup.find('p', class_='label_Ph1fi')
element = element.text

numbers = re.findall(r'\d{1,3}(?:,\d{3})*', element)

if len(numbers) >= 2:
    offset = int(numbers[0].replace(',', ''))
    num_images = int(numbers[1].replace(',', ''))
    num_pages = int(num_images / offset)
    print(f"Images Per Page: {offset}")
    print(f"Total Images: {num_images}")
    print(f"Total Pages:{num_pages}")
else:
    print("Numbers not found")
#num_images = int(element.replace(',', '').split(' ')[0])
# Get all product urls 

product_urls = []
for i in range(num_pages):
    site = 'https://www.asos.com/us/women/dresses/cat/?cid=8799&page='
    site = site + str(i)
    soup = make_soup(site)
    a = soup.find_all('a',class_='productLink_E9Lfb',href=True)
    for link in soup.find_all('a', class_='productLink_E9Lfb', href=True):
                href = link.get('href')
                if href:
                    product_urls.append(href)
    print('Page ', i, ' done')

print(product_urls)

# Get all images per product url

推荐答案

您可以try :

import json
import re

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0"
}


def get_data(html_source):
    data = re.search(r"window\.asos\.pdp\.config\.product = (.*);", html_source)
    data = json.loads(data.group(1))
    return data


def get_images(url):
    data = get_data(requests.get(url, headers=headers).text)

    for i in data["images"]:
        print(f'{i["colour"]:<15} {i["url"]}')


base_url = "https://www.asos.com/us/asos-design/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/prd/204910824"
data = get_data(requests.get(base_url, headers=headers).text)

u = "https://www.asos.com/us/prd/"
for p in data["facetGroup"]["facets"][0]["products"]:
    get_images(u + str(p["productId"]))

打印:

PINK            https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-light-pink/204910765-1-pink
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-light-pink/204910765-2
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-light-pink/204910765-3
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-light-pink/204910765-4
CAMEL           https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-camel/204910786-1-camel
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-camel/204910786-2
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-camel/204910786-3
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-camel/204910786-4
BLACK           https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/204910824-1-black
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/204910824-2
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/204910824-3
                https://images.asos-media.com/products/asos-design-super-soft-volume-sleeve-turtle-neck-mini-sweater-dress-in-black/204910824-4

Python相关问答推荐

这些变量是否相等,因为它们引用相同的实例,尽管它们看起来应该具有不同的值?

Python:根据创建时间合并两个收件箱

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

将numpy数组与空数组相加

Python中两个矩阵的自定义Hadamard风格产物

pyautogui.locateOnScreen在Linux上的工作方式有所不同

遵循轮廓中对象方向的计算线

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

查找两极rame中组之间的所有差异

如果值不存在,列表理解返回列表

如何在虚拟Python环境中运行Python程序?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

将pandas Dataframe转换为3D numpy矩阵

如何获取numpy数组的特定索引值?

如何在Python脚本中附加一个Google tab(已经打开)

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

在含噪声的3D点网格中识别4连通点模式

形状弃用警告与组合多边形和多边形如何解决

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像