Парсинг веб-страниц с использованием ChatGPT — полное руководство с примерами
Парсинг — это процесс автоматического извлечения данных с веб-сайтов с использованием кода. ChatGPT стал мощным инструментом дляпарсинга благодаря своим способностям в области естественного языка. В этой статье представлено исчерпывающее руководство по парсингу с использованием ChatGPT, охватывающее основные концепции, подходы, примеры и фрагменты кода.
Введение
ChatGPT открывает новые возможности для автоматизации парсинга без написания сложного кода. В основе парсинга с ChatGPT лежит следующее:
- Инспектирование элементов страницы для выявления данных, которые необходимо извлечь.
- Предоставление подробных инструкций для парсинга на естественном языке.
- Получение сгенерированного ChatGPT кода для извлечения необходимых данных.
- Проверка и экспорт извлеченных данных.
Главное преимущество заключается в возможности создавать парсеры с минимальными знаниями программирования. Однако важно предоставить правильные инструкции, чтобы ChatGPT генерировал точные ответы.
В этой статье рассматриваются различные методики с использованием ChatGPT на примерах парсинга статических и динамических веб-сайтов.
Минимальные требования
Перед тем как приступить, убедитесь в следующем:
- Доступ к ChatGPT (рекомендуется использовать платный план для неограниченных запросов).
- Базовые знания HTML и CSS для инспектирования элементов.
- Установлен Python и библиотеки, такие как Beautiful Soup, Selenium, Pandas.
- CSV-просмотрщик или Python/Jupyter Notebook для проверки результатов.
Начнем с простого
Для известных веб-сайтов парсинг довольно прост. Возьмем, например, сайт IMDB. Мы просто используем эту команду:
web scrape https://www.imdb.com/chart/moviemeter/ and get all the movie names using python and beautifulsoup
ChatGPT отвечает следующим образом:
import requests
from bs4 import BeautifulSoup
url = "https://www.imdb.com/chart/moviemeter/"
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Находим все столбцы с заголовками, содержащими названия фильмов
title_columns = soup.find_all('td', class_='titleColumn')
movies = []
for title_column in title_columns:
# Извлекаем названия фильмов из заголовков
movie_name = title_column.a.get_text(strip=True)
movies.append(movie_name)
# Вывод списка названий фильмов
for i, movie in enumerate(movies, start=1):
print(f"{i}. {movie}")
else:
print("Не удалось получить веб-страницу. Код состояния:", response.status_code)
Когда вы запускаете этот скрипт, к сожалению, он не работает…
Failed to retrieve the webpage. Status Code: 403
Теперь мы переходим к более сложным задачам. Давайте немного модифицируем скрипт. IMDB требует видеть «подпись» браузера, чтобы ответить на запрос. Поэтому мы добавляем заголовок User-Agent. Вот новый скрипт:
import requests
from bs4 import BeautifulSoup
url = "https://www.imdb.com/chart/moviemeter/"
# Определяем заголовки для имитации запроса браузера
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
title_columns = soup.find_all('td', class_='titleColumn')
movies = []
for title_column in title_columns:
movie_name = title_column.a.get_text(strip=True)
movies.append(movie_name)
for i, movie in enumerate(movies, start=1):
print(f"{i}. {movie}")
else:
print("Не удалось получить веб-страницу. Код состояния:", response.status_code)
Этот код работает. Когда вы его запускаете, он выводит результаты…
Парсинг динамических веб-сайтов
Динамические веб-сайты имеют контент, который меняется без перезагрузки страницы, такие как бесконечная прокрутка, вкладки, всплывающие окна и т. д. Для парсинга таких сайтов требуются автоматизированные браузеры, такие как Selenium.
Вот пример сбора данных о продуктах с сайта электронной торговли:
инструкции
Extract product titles and pricing from amazon.com using Python and Selenium
Wait for 10 seconds for page load
Locate elements with:
- Tag: div
- Class: product
Within each element:
- Find <h3> tag and extract text for title
- Find <p> tag and extract text for price
Click on 'Next Page' button to load more products
Export scraped data to CSV file
Инструкции
Извлеките названия продуктов и цены с сайта amazon.com с использованием Python и Selenium.
Подождите 10 секунд для загрузки страницы.
Найдите элементы с:
Тег: div
Класс: product Внутри каждого элемента:
Найдите тег <h3> и извлеките текст для заголовка.
Найдите тег <p> и извлеките текст для цены. Нажмите на кнопку 'Следующая страница', чтобы загрузить больше продуктов. Экспортируйте извлеченные данные в CSV-файл.
Сгенерированный код ChatGPT
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv
driver = webdriver.Chrome()
driver.get("https://amazon.com")
driver.implicitly_wait(10)
products = driver.find_elements(By.CSS_SELECTOR, "div.product")
titles = []
prices = []
for product in products:
title = product.find_element(By.TAG_NAME, "h3").text
price = product.find_element(By.TAG_NAME, "p").text
titles.append(title)
prices.append(price)
next_button = driver.find_element(By.ID, "next_page")
next_button.click()
# Извлечение данных с последующих страниц
with open('output.csv', 'w') as file:
writer = csv.writer(file)
writer.writerow(['Заголовок', 'Цена'])
writer.writerows(zip(titles, prices))
Этот код использует Selenium для загрузки динамического контента, извлечения данных и обработки пагинации. Данные экспортируются в CSV для анализа. В следующем разделе объясняется, как установить Selenium, если у вас его нет в системе.
Установка Selenium
Для использования Selenium для скрапинга динамических веб-сайтов, необходимо установить его вместе с драйвером браузера.
Шаги
Установите Селен:
pip install selenium
Установите драйвер браузера:
Для Хрома:
pip install chromedriver-autoinstaller
Для Фаерфокс:
pip install geckodriver-autoinstaller
Импортировать селен:
from selenium import webdriver
driver = webdriver.Chrome() # For Chrome
# driver = webdriver.Firefox() # For Firefox
Передайте драйвер в код ChatGPT:
Предоставьте объект драйвера ChatGPT для динамического очистки:
Use the provided driver object for dynamic scraping:
driver = webdriver.Chrome()
Затем ChatGPT сгенерирует код с использованием этого драйвера для очистки динамических страниц.
Здесь рассматриваются основы настройки Selenium для парсинга веб-страниц с помощью ChatGPT. Драйвер автоматически обрабатывает JavaScript, вызовы AJAX, бесконечную прокрутку и т. д., что обеспечивает беспрепятственный процесс очистки.
Основные выводы
- Для динамических сайтов используйте Selenium и добавьте действия, такие как ожидание, клик и т. д.
- Предоставляйте атрибуты элементов, такие как ID, класс, имя тега, для поиска данных. Обрабатывайте пагинацию или прокрутку страниц.
- Проверяйте извлеченные данные перед экспортом.
Альтернативный подход — использование ChatGPT «Расширенный анализ данных»
Альтернативный подход, предоставляемый ChatGPT, — использование его интерпретатора кода или расширенного анализа данных . Здесь вместо предоставления инструкций по очистке можно напрямую загрузить HTML-код целевой страницы.
Предположим, мы хотим очистить страницу результатов поиска Amazon…
Просто сохраните страницу в формате HTML на своем диске.
Затем просто перетащите его в раздел GPT4 — Расширенный анализ данных.
ChatGPT может понадобиться помощь в поиске заголовка… Используя элемент Chrome Inspect, мы замечаем, что заголовок находится в теге H2. Вставляем все это в ChatGPT
Вот подсказка…
Extract product title and price from the attached page HTML using Python and BeautifulSoup. Export results to CSV. Tht Title tag is in H2 like this... <h2 class="a-size-mini a-spacing-none a-color-base s-line-clamp-2">
Несмотря на то, что ему удалось получить названия, вы можете видеть, что он изо всех сил пытается получить цены… Итак, мы снова помогаем ChatGPT…
Успех! ChatGPT предоставляет нам данные…
Но давайте не будем останавливаться на достигнутом. Давайте запросим у него код, который сделал возможным получение данных. Используйте эту подсказку…
give me the code that makes this possible
ChatGPT с радостью вернет такой код…
import re
import csv
from bs4 import BeautifulSoup
# Define the path to the HTML file
file_path = 'path_to_your_html_file.html'
# Read the HTML file and create a BeautifulSoup object
with open(file_path, 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file.read(), 'html.parser')
# Function to extract price from a specific section of the HTML
def extract_price(section):
# Look for span tags with class 'a-price' which usually contains the price
price_tag = section.find('span', class_='a-price')
# If a price tag is found, extract the price value from it
if price_tag:
# Extract the whole and fraction parts of the price and concatenate them
whole_part_tag = price_tag.find('span', class_='a-price-whole')
fraction_part_tag = price_tag.find('span', class_='a-price-fraction')
if whole_part_tag and fraction_part_tag:
# Concatenate the whole part, decimal point, and fraction part to form the full price
whole_part = whole_part_tag.get_text(strip=True).replace(',', '') # Remove commas in whole part
fraction_part = fraction_part_tag.get_text(strip=True)
return f"${whole_part}.{fraction_part}"
return None # Return None if no price is found
# List to hold the extracted product title and price pairs
products = []
# Loop through each product title tag to extract title and price pairs
for title_tag in soup.find_all('h2', class_='a-size-mini a-spacing-none a-color-base s-line-clamp-2'):
title = title_tag.get_text(strip=True) # Extract the product title
# Get the parent section of the title tag which likely contains the price tag as well
section = title_tag.find_parent('div', recursive=True)
if section: # Check if a parent div is found
price = extract_price(section) # Extract the price from the section
products.append({'Title': title, 'Price': price})
# Define the path to the CSV file
csv_file_path = 'path_where_you_want_to_save_csv_file.csv'
# Write the extracted data to the CSV file
with open(csv_file_path, 'w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=['Title', 'Price'])
writer.writeheader()
writer.writerows(products)
print(f"Data has been written to {csv_file_path}")
Когда использовать интерпретатор кода ChatGPT?
Некоторые преимущества использования интерпретатора кода: HTML-анализ вместо ручной проверки элементов Автоматически обрабатывает макет и структуру страницы. Может легче очистить несколько страниц
Используйте это, если на целевом сайте есть: Сложная или вложенная структура HTML. Трудно вручную определить атрибуты элемента. Пагинация, требующая автоматической обработки
Однако подход с использованием инструкций кода обеспечивает больший контроль над логикой очистки.
Полные примеры кода
Вот полные примеры кода, созданные выше для справки:
Статический парсинг сайта
import requests
from bs4 import BeautifulSoup
url = "https://www.imdb.com/chart/moviemeter/"
# Define headers to mimic a browser request
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
title_columns = soup.find_all('td', class_='titleColumn')
movies = []
for title_column in title_columns:
movie_name = title_column.a.get_text(strip=True)
movies.append(movie_name)
for i, movie in enumerate(movies, start=1):
print(f"{i}. {movie}")
else:
print("Failed to retrieve the webpage. Status Code:", response.status_code)
Динамический парсинг сайта
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv
driver = webdriver.Chrome()
driver.get("<https://ecomsite.com>")
driver.implicitly_wait(10)
products = driver.find_elements(By.CSS_SELECTOR, "div.product")
titles = []
prices = []
for product in products:
title = product.find_element(By.TAG_NAME, "h3").text
price = product.find_element(By.TAG_NAME, "p").text
titles.append(title)
prices.append(price)
next_button = driver.find_element(By.ID, "next_page")
next_button.click()
with open('output.csv', 'w') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Price'])
writer.writerows(zip(titles, prices))
Парсинг интерпретатора кода
import re
import csv
from bs4 import BeautifulSoup
# Define the path to the HTML file
file_path = 'path_to_your_html_file.html'
# Read the HTML file and create a BeautifulSoup object
with open(file_path, 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file.read(), 'html.parser')
# Function to extract price from a specific section of the HTML
def extract_price(section):
# Look for span tags with class 'a-price' which usually contains the price
price_tag = section.find('span', class_='a-price')
# If a price tag is found, extract the price value from it
if price_tag:
# Extract the whole and fraction parts of the price and concatenate them
whole_part_tag = price_tag.find('span', class_='a-price-whole')
fraction_part_tag = price_tag.find('span', class_='a-price-fraction')
if whole_part_tag and fraction_part_tag:
# Concatenate the whole part, decimal point, and fraction part to form the full price
whole_part = whole_part_tag.get_text(strip=True).replace(',', '') # Remove commas in whole part
fraction_part = fraction_part_tag.get_text(strip=True)
return f"${whole_part}.{fraction_part}"
return None # Return None if no price is found
# List to hold the extracted product title and price pairs
products = []
# Loop through each product title tag to extract title and price pairs
for title_tag in soup.find_all('h2', class_='a-size-mini a-spacing-none a-color-base s-line-clamp-2'):
title = title_tag.get_text(strip=True) # Extract the product title
# Get the parent section of the title tag which likely contains the price tag as well
section = title_tag.find_parent('div', recursive=True)
if section: # Check if a parent div is found
price = extract_price(section) # Extract the price from the section
products.append({'Title': title, 'Price': price})
# Define the path to the CSV file
csv_file_path = 'path_where_you_want_to_save_csv_file.csv'
# Write the extracted data to the CSV file
with open(csv_file_path, 'w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=['Title', 'Price'])
writer.writeheader()
writer.writerows(products)
print(f"Data has been written to {csv_file_path}")
Вопросы, которые могут возникнуть
Разрешает ли ChatGPT парсинг веб-страниц?
Да. Это законно с точки зрения условий ChatGPT.
Как заставить чатгпт читать сайт?
Вы можете использовать инструмент расширенного анализа данных, чтобы просто загрузить HTML-код веб-страницы, а затем попросить его очистить его, используя различные методы, описанные выше.
Откуда ChatGPT собирает данные?
На данный момент он не может самостоятельно парсить Интернет.
Может ли ChatGPT читать веб-страницу?
В данный момент он не может просматривать Интернет, но вы можете использовать инструмент расширенного анализа данных, чтобы просто загрузить HTML-код веб-страницы, а затем попросить его очистить его, используя различные методы, описанные выше.
Заключение
В этой статье представлен подробный обзор парсинга веб-страниц с использованием ChatGPT с различными примерами и образцами кода. Ключевые выводы:
- Проверьте элементы, чтобы определить данные, которые необходимо извлечь.
- Предоставьте подробные инструкции на естественном языке.
- Используйте искусственный интеллект ChatGPT для создания точных парсеров
- Проверка и уточнение результатов с помощью итеративных подсказок
- Рассмотрите такие инструменты, как интерпретатор кода или визуальные парсеры, в зависимости от варианта использования.
Парсинг веб-страниц можно автоматизировать без сложного кодирования, если стратегически использовать возможности ChatGPT. При использовании правильных методов можно извлечь данные практически с любого веб-сайта.
ChatGPT знаменует новую захватывающую эру интеллектуальной автоматизации!
Однако этот подход также имеет некоторые ограничения: Парсинговый код должен обрабатывать CAPTCHA, IP-блоки и другие меры защиты от парсинга. Запуск парсеров в вашей собственной инфраструктуре может привести к блокировке IP-адресов. Динамический контент требует специальной обработки