#python #web-scraping #beautifulsoup
#python #очистка веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь извлечь различную информацию с веб-сайтов с помощью BeautifulSoup, такую как название продукта и цена.
Я делаю это с разными URL-адресами, просматривая URL-адреса с for...in...
помощью . Здесь я просто приведу фрагмент без цикла.
from bs4 import BeautifulSoup
import requests
import csv
url= 'https://www.mediamarkt.ch/fr/product/_lg-oled65gx6la-1991479.html'
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "lxml")
price = soup.find('meta', property="product:price:amount")
title = soup.find("div", {"class": "flix-model-name"})
title2 = soup.find('div', class_="flix-model-name")
title3 = soup.find("div", attrs={"class": "flix-model-name"})
print(price['content'])
print(title)
print(title2)
print(title3)
Итак, с этого URL https://www.mediamarkt.ch/fr/product/_lg-oled65gx6la-1991479.html Я не должен был извлекать номер продукта. единственное место, где я его нахожу, находится в div class="flix-model-name"
. Однако я совершенно не могу до него добраться. Я пробовал разные способы доступа к нему в title
, title2
, title3
, но у меня всегда есть результат none
.
Я немного новичок, поэтому, наверное, мне не хватает чего-то основного… Если да, пожалуйста, простите меня за это.
Любая помощь приветствуется! Заранее большое спасибо!
просто для информации, с каждым URL-адресом я думал о добавлении данных и записи их в файл CSV, подобный этому:
for url in urls:
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "lxml")
row=[]
try:
# title = YOUR VERY WELCOMED ANSWER
prices = soup.find('meta', property="product:price:amount")
row = (title.text ',' prices['content'] 'n')
data.append(row)
except:
pass
file = open('database.csv','w')
i = 0
while i < (len(data)):
file.write(data[i])
i =1
file.close()
Заранее большое спасибо за вашу помощь!
Дэвид
Комментарии:
1. Я полагаю, что искомое содержимое загружается кодом JavaScript (т. Е. AJAX) после загрузки основного документа, и именно поэтому вы не находите элементы, которые ищете, на загруженной странице. Я полагаю, вам нужно будет либо использовать такой инструмент, как Selenium, чтобы управлять браузером и получать из него содержимое, либо анализировать запросы на выборку JavaScript, выполняемые после загрузки страницы, с помощью инспектора браузера, чтобы выяснить, какие URL-адреса вам нужно будет запросить.
Ответ №1:
Попробуйте следующий подход с использованием python — запросы простые, понятные, надежные, быстрые и требуют меньше кода, когда дело доходит до запросов. Я извлек URL-адрес API с самого веб-сайта после проверки сетевого раздела браузера Google Chrome.
Что именно делает приведенный ниже скрипт:
Сначала он примет URL-адрес API, создаст URL-адрес на основе 2 динамических параметров (product и category), а затем выполнит запрос GET для получения данных.
После получения данных скрипт проанализирует данные JSON с помощью библиотеки json.loads. Наконец, он будет перебирать весь список продуктов один за другим и печатать детали, которые разделены на 2 категории «box1_ProductToProduct» и «box2_KategorieTopseller«, такие как бренд, название, номер продукта и цена за единицу. Таким же образом вы можете добавить больше деталей, заглянув в вызов API.
import json
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
def scrap_product_details():
PRODUCT = 'MMCH1991479' #Product number
CATEGORY = '680942' #Category number
URL = 'https://www.mediamarkt.ch/rde_server/res/MMCH/recomm/product_detail/sid/WACXyEbIf3khlu6FcHlh1B1?product=' PRODUCT 'amp;category=' CATEGORY # dynamic URL
response = requests.get(URL,verify = False) #GET request to fetch the data
result = json.loads(response.text) # Parse JSON data using json.loads
box1_ProductToProduct = result[0]['box1_ProductToProduct'] # Extracted data from API
box2_KategorieTopseller = result[1]['box2_KategorieTopseller']
for item in box1_ProductToProduct: # loop over extracted data
print('-' * 100)
print('Brand : ',item['brand'])
print('Name : ',item['name'])
print('Net Unit Price : ',item['netUnitPrice'])
print('Product Number : ',item['product_nr'])
print('-' * 100)
for item in box2_KategorieTopseller: # loop over extracted data
print('-' * 100)
print('Brand : ',item['brand'])
print('Name : ',item['name'])
print('Net Unit Price : ',item['netUnitPrice'])
print('Product Number : ',item['product_nr'])
print('-' * 100)
scrap_product_details()
Комментарии:
1. Ого, это впечатляет. Я вроде понимаю, какие шаги, но я не смогу его изменить. Как я понял, скрипт использует все телевизоры, помеченные как «TopSeller». Есть ли способ перехватить все телевизоры с веб-сайта? Еще раз большое спасибо за вашу помощь!
2. В этом случае вам нужно сначала проверить URL, где перечислены все телевизоры, а затем попробовать. Если это работает для вас, пожалуйста, примите и поддержите мой ответ, это поможет мне мотивироваться. Спасибо
3. Хорошо, я попробую это. Большое спасибо за вашу помощь!