Target.com ialah salah satu pasaran e-dagang dan beli-belah terbesar di Amerika. Ia membolehkan pengguna membeli-belah dalam talian dan dalam kedai untuk segala-galanya daripada barangan runcit dan keperluan kepada pakaian dan elektronik. Mulai September 2024, menurut data daripada SimilarWeb, Target.com menarik trafik web bulanan lebih daripada 166 juta.
Tapak web Target.com menawarkan ulasan pelanggan, maklumat harga dinamik, perbandingan produk dan penilaian produk, antara lain. Ia merupakan sumber data yang berharga untuk penganalisis, pasukan pemasaran, perniagaan atau penyelidik yang ingin menjejaki arah aliran produk, memantau harga pesaing atau menganalisis sentimen pelanggan melalui ulasan.
Dalam artikel ini, anda akan belajar cara:
Menjelang akhir artikel ini, anda akan belajar cara mengumpulkan ulasan dan penilaian produk daripada Target.com menggunakan Python, Selenium dan ScraperAPI tanpa disekat. Anda juga akan belajar cara menggunakan data anda yang dikikis untuk analisis sentimen.
Jika anda teruja semasa saya menulis tutorial ini, mari selami terus. ?
Bagi mereka yang tergesa-gesa, berikut ialah coretan kod lengkap yang akan kami bina berdasarkan tutorial ini:
import os import time from bs4 import BeautifulSoup from dotenv import load_dotenv from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Load environment variables load_dotenv() def target_com_scraper(): """ SCRAPER SETTINGS - API_KEY: Your ScraperAPI key. Get your API Key ==> https://www.scraperapi.com/?fp_ref=eunit """ API_KEY = os.getenv("API_KEY", "yourapikey") # ScraperAPI proxy settings (with HTTP and HTTPS variants) scraper_api_proxies = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } # URLs to scrape url_list = [ "https://www.target.com/p/enclosed-cat-litter-box-xl-up-up/-/A-90310047?preselect=87059440#lnk=sametab", ] # Store scraped data scraped_data = [] # Setup Selenium options with proxy options = Options() # options.add_argument("--headless") # Uncomment for headless mode options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-in-process-stack-traces") options.add_argument("--window-size=1920,1080") options.add_argument("--log-level=3") options.add_argument("--disable-logging") options.add_argument("--start-maximized") # Initialize Selenium WebDriver driver = webdriver.Chrome(service=ChromeService( ChromeDriverManager().install()), options=options, seleniumwire_options=scraper_api_proxies) def scroll_down_page(distance=100, delay=0.2): """ Scroll down the page gradually until the end. Args: - distance: Number of pixels to scroll by in each step. - delay: Time (in seconds) to wait between scrolls. """ total_height = driver.execute_script( "return document.body.scrollHeight") scrolled_height = 0 while scrolled_height < total_height: # Scroll down by 'distance' pixels driver.execute_script(f"window.scrollBy(0, {distance});") scrolled_height += distance time.sleep(delay) # Pause between scrolls # Update the total page height after scrolling total_height = driver.execute_script( "return document.body.scrollHeight") print("Finished scrolling.") try: for url in url_list: # Use Selenium to load the page driver.get(url) time.sleep(5) # Give the page time to load # Scroll down the page scroll_down_page() # Extract single elements with Selenium def extract_element_text(selector, description): try: # Wait for the element and extract text element = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, selector)) ) text = element.text.strip() return text if text else None # Return None if the text is empty except TimeoutException: print(f"Timeout: Could not find {description}. Setting to None.") return None except NoSuchElementException: print(f"Element not found: {description}. Setting to None.") return None # Extract single elements reviews_data = {} reviews_data["secondary_rating"] = extract_element_text("div[data-test='secondary-rating']", "secondary_rating") reviews_data["rating_count"] = extract_element_text( "div[data-test='rating-count']", "rating_count") reviews_data["rating_histogram"] = extract_element_text("div[data-test='rating-histogram']", "rating_histogram") reviews_data["percent_recommended"] = extract_element_text("div[data-test='percent-recommended']", "percent_recommended") reviews_data["total_recommendations"] = extract_element_text("div[data-test='total-recommendations']", "total_recommendations") # Extract reviews from 'reviews-list' scraped_reviews = [] # Use Beautiful Soup to extract other content soup = BeautifulSoup(driver.page_source, 'html.parser') # Select all reviews in the list using BeautifulSoup reviews_list = soup.select("div[data-test='reviews-list'] > div") for review in reviews_list: # Create a dictionary to store each review's data ratings = {} # Extract title title_element = review.select_one( "h4[data-test='review-card--title']") ratings['title'] = title_element.text.strip( ) if title_element else None # Extract rating rating_element = review.select_one("span[data-test='ratings']") ratings['rating'] = rating_element.text.strip( ) if rating_element else None # Extract time time_element = review.select_one( "span[data-test='review-card--reviewTime']") ratings['time'] = time_element.text.strip( ) if time_element else None # Extract review text text_element = review.select_one( "div[data-test='review-card--text']") ratings['text'] = text_element.text.strip( ) if text_element else None # Append each review to the list of reviews scraped_reviews.append(ratings) # Append the list of reviews to the main product data reviews_data["reviews"] = scraped_reviews # Append the overall data to the scraped_data list scraped_data.append(reviews_data) # Output the scraped data print(f"Scraped data: {scraped_data}") except Exception as e: print(f"Error: {e}") finally: # Ensure driver quits after scraping driver.quit() if __name__ == "__main__": target_com_scraper()
Lihat kod lengkap di GitHub: https://github.com/Eunit99/target_com_scraper. Ingin memahami setiap baris kod? Mari kita bina pengikis web dari awal bersama-sama!
Dalam artikel terdahulu, kami membincangkan semua yang anda perlu ketahui untuk mengikis data produk Target.com. Walau bagaimanapun, dalam artikel ini, saya akan menumpukan pada memandu anda melalui cara mengikis Target.com untuk penilaian dan ulasan produk dengan Python dan ScraperAPI.
Untuk mengikuti tutorial ini dan mula mengikis Target.com, anda perlu melakukan beberapa perkara dahulu.
Mulakan dengan akaun percuma di ScraperAPI. ScraperAPI membolehkan anda mula mengumpul data daripada berjuta-juta sumber web tanpa penyelesaian yang rumit dan mahal dengan API kami yang mudah digunakan untuk mengikis web.
ScraperAPI membuka kunci walaupun tapak yang paling sukar, mengurangkan kos infrastruktur dan pembangunan, membolehkan anda menggunakan pengikis web dengan lebih pantas, dan juga memberi anda 1,000 kredit API percuma untuk mencuba sesuatu dahulu dan banyak lagi.
Gunakan editor kod seperti Visual Studio Code. Pilihan lain termasuk Teks Sublime atau PyCharm.
Sebelum bermula dengan mengikis ulasan Target.com, pastikan anda mempunyai perkara berikut:
Adalah amalan terbaik untuk menggunakan persekitaran maya untuk projek Python untuk mengurus kebergantungan dan mengelakkan konflik.
Untuk mencipta persekitaran maya, jalankan arahan ini dalam terminal anda:
import os import time from bs4 import BeautifulSoup from dotenv import load_dotenv from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Load environment variables load_dotenv() def target_com_scraper(): """ SCRAPER SETTINGS - API_KEY: Your ScraperAPI key. Get your API Key ==> https://www.scraperapi.com/?fp_ref=eunit """ API_KEY = os.getenv("API_KEY", "yourapikey") # ScraperAPI proxy settings (with HTTP and HTTPS variants) scraper_api_proxies = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } # URLs to scrape url_list = [ "https://www.target.com/p/enclosed-cat-litter-box-xl-up-up/-/A-90310047?preselect=87059440#lnk=sametab", ] # Store scraped data scraped_data = [] # Setup Selenium options with proxy options = Options() # options.add_argument("--headless") # Uncomment for headless mode options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-in-process-stack-traces") options.add_argument("--window-size=1920,1080") options.add_argument("--log-level=3") options.add_argument("--disable-logging") options.add_argument("--start-maximized") # Initialize Selenium WebDriver driver = webdriver.Chrome(service=ChromeService( ChromeDriverManager().install()), options=options, seleniumwire_options=scraper_api_proxies) def scroll_down_page(distance=100, delay=0.2): """ Scroll down the page gradually until the end. Args: - distance: Number of pixels to scroll by in each step. - delay: Time (in seconds) to wait between scrolls. """ total_height = driver.execute_script( "return document.body.scrollHeight") scrolled_height = 0 while scrolled_height < total_height: # Scroll down by 'distance' pixels driver.execute_script(f"window.scrollBy(0, {distance});") scrolled_height += distance time.sleep(delay) # Pause between scrolls # Update the total page height after scrolling total_height = driver.execute_script( "return document.body.scrollHeight") print("Finished scrolling.") try: for url in url_list: # Use Selenium to load the page driver.get(url) time.sleep(5) # Give the page time to load # Scroll down the page scroll_down_page() # Extract single elements with Selenium def extract_element_text(selector, description): try: # Wait for the element and extract text element = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, selector)) ) text = element.text.strip() return text if text else None # Return None if the text is empty except TimeoutException: print(f"Timeout: Could not find {description}. Setting to None.") return None except NoSuchElementException: print(f"Element not found: {description}. Setting to None.") return None # Extract single elements reviews_data = {} reviews_data["secondary_rating"] = extract_element_text("div[data-test='secondary-rating']", "secondary_rating") reviews_data["rating_count"] = extract_element_text( "div[data-test='rating-count']", "rating_count") reviews_data["rating_histogram"] = extract_element_text("div[data-test='rating-histogram']", "rating_histogram") reviews_data["percent_recommended"] = extract_element_text("div[data-test='percent-recommended']", "percent_recommended") reviews_data["total_recommendations"] = extract_element_text("div[data-test='total-recommendations']", "total_recommendations") # Extract reviews from 'reviews-list' scraped_reviews = [] # Use Beautiful Soup to extract other content soup = BeautifulSoup(driver.page_source, 'html.parser') # Select all reviews in the list using BeautifulSoup reviews_list = soup.select("div[data-test='reviews-list'] > div") for review in reviews_list: # Create a dictionary to store each review's data ratings = {} # Extract title title_element = review.select_one( "h4[data-test='review-card--title']") ratings['title'] = title_element.text.strip( ) if title_element else None # Extract rating rating_element = review.select_one("span[data-test='ratings']") ratings['rating'] = rating_element.text.strip( ) if rating_element else None # Extract time time_element = review.select_one( "span[data-test='review-card--reviewTime']") ratings['time'] = time_element.text.strip( ) if time_element else None # Extract review text text_element = review.select_one( "div[data-test='review-card--text']") ratings['text'] = text_element.text.strip( ) if text_element else None # Append each review to the list of reviews scraped_reviews.append(ratings) # Append the list of reviews to the main product data reviews_data["reviews"] = scraped_reviews # Append the overall data to the scraped_data list scraped_data.append(reviews_data) # Output the scraped data print(f"Scraped data: {scraped_data}") except Exception as e: print(f"Error: {e}") finally: # Ensure driver quits after scraping driver.quit() if __name__ == "__main__": target_com_scraper()
Aktifkan persekitaran maya berdasarkan sistem pengendalian anda:
python3 -m venv env
Sesetengah IDE boleh mengaktifkan persekitaran maya secara automatik.
Untuk mengikuti artikel ini dengan berkesan, anda perlu mempunyai pemahaman asas tentang pemilih CSS. Pemilih CSS digunakan untuk menyasarkan elemen HTML tertentu pada halaman web, yang membolehkan anda mengekstrak maklumat yang anda perlukan.
Selain itu, selesa dengan penyemak imbas DevTools adalah penting untuk memeriksa dan mengenal pasti struktur halaman web.
Setelah memenuhi prasyarat di atas, tiba masanya untuk menyediakan projek anda. Mulakan dengan mencipta folder yang akan mengandungi kod sumber pengikis Target.com. Dalam kes ini, saya akan menamakan folder python-target-dot-com-scraper saya.
Jalankan arahan berikut untuk mencipta folder bernama python-target-dot-com-scraper:
# On Unix or MacOS (bash shell): /path/to/venv/bin/activate # On Unix or MacOS (csh shell): /path/to/venv/bin/activate.csh # On Unix or MacOS (fish shell): /path/to/venv/bin/activate.fish # On Windows (command prompt): \path\to\venv\Scripts\activate.bat # On Windows (PowerShell): \path\to\venv\Scripts\Activate.ps1
Masukkan folder dan buat fail Python main.py baharu dengan menjalankan arahan ini:
mkdir python-target-dot-com-scraper
Buat fail requirements.txt dengan menjalankan arahan berikut:
cd python-target-dot-com-scraper && touch main.py
Untuk artikel ini, saya akan menggunakan Selenium dan Sup Cantik, dan Pengurus Webdriver untuk perpustakaan Python untuk membina pengikis web. Selenium akan mengendalikan automasi penyemak imbas, dan perpustakaan Beautiful Soup akan mengekstrak data daripada kandungan HTML tapak web Target.com. Pada masa yang sama, Pengurus Webdriver untuk Python menyediakan cara untuk mengurus pemacu untuk penyemak imbas yang berbeza secara automatik.
Tambah baris berikut pada fail requirements.txt anda untuk menentukan pakej yang diperlukan:
touch requirements.txt
Untuk memasang pakej, jalankan arahan berikut:
selenium~=4.25.0 bs4~=0.0.2 python-dotenv~=1.0.1 webdriver_manager selenium-wire blinker==1.7.0 python-dotenv==1.0.1
Dalam bahagian ini, saya akan membimbing anda melalui panduan langkah demi langkah untuk mendapatkan penilaian dan ulasan produk daripada halaman produk seperti ini daripada Target.com.
Saya akan menumpukan pada ulasan dan penilaian daripada bahagian tapak web ini yang diserlahkan dalam tangkapan skrin ini di bawah:
Sebelum mendalami lebih lanjut, anda perlu memahami struktur HTML dan mengenal pasti pemilih DOM yang dikaitkan dengan tag HTML yang membungkus maklumat yang ingin kami ekstrak. Dalam bahagian seterusnya ini, saya akan membimbing anda menggunakan Chrome DevTools untuk memahami struktur tapak Target.com.
Buka Chrome DevTools dengan menekan F12 atau mengklik kanan di mana-mana pada halaman dan memilih Inspect. Memeriksa halaman daripada URL di atas mendedahkan perkara berikut:
Daripada gambar di atas, berikut adalah semua pemilih DOM yang akan disasarkan oleh pengikis web untuk mengekstrak maklumat:
Information | DOM selector | Value |
---|---|---|
Product ratings | ||
Rating value | div[data-test='rating-value'] | 4.7 |
Rating count | div[data-test='rating-count'] | 683 star ratings |
Secondary rating | div[data-test='secondary-rating'] | 683 star ratings |
Rating histogram | div[data-test='rating-histogram'] | 5 stars 85%4 stars 8%3 stars 3%2 stars 1%1 star 2% |
Percent recommended | div[data-test='percent-recommended'] | 89% would recommend |
Total recommendations | div[data-test='total-recommendations'] | 125 recommendations |
Product reviews | ||
Reviews list | div[data-test='reviews-list'] | Returns children elements corresponding to individual product review |
Review card title | h4[data-test='review-card--title'] | Perfect litter box for cats |
Ratings | span[data-test='ratings'] | 4.7 out of 5 stars with 683 reviews |
Review time | span[data-test='review-card--reviewTime'] | 23 days ago |
Review card text | div[data-test='review-card--text'] | My cats love it. Doesn't take up much space either |
Sekarang kami telah menggariskan semua keperluan dan telah menemui elemen berbeza yang kami minati di halaman semakan produk Target.com. Kami akan beralih ke langkah seterusnya yang memerlukan pengimportan modul yang diperlukan:
import os import time from bs4 import BeautifulSoup from dotenv import load_dotenv from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Load environment variables load_dotenv() def target_com_scraper(): """ SCRAPER SETTINGS - API_KEY: Your ScraperAPI key. Get your API Key ==> https://www.scraperapi.com/?fp_ref=eunit """ API_KEY = os.getenv("API_KEY", "yourapikey") # ScraperAPI proxy settings (with HTTP and HTTPS variants) scraper_api_proxies = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } # URLs to scrape url_list = [ "https://www.target.com/p/enclosed-cat-litter-box-xl-up-up/-/A-90310047?preselect=87059440#lnk=sametab", ] # Store scraped data scraped_data = [] # Setup Selenium options with proxy options = Options() # options.add_argument("--headless") # Uncomment for headless mode options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-in-process-stack-traces") options.add_argument("--window-size=1920,1080") options.add_argument("--log-level=3") options.add_argument("--disable-logging") options.add_argument("--start-maximized") # Initialize Selenium WebDriver driver = webdriver.Chrome(service=ChromeService( ChromeDriverManager().install()), options=options, seleniumwire_options=scraper_api_proxies) def scroll_down_page(distance=100, delay=0.2): """ Scroll down the page gradually until the end. Args: - distance: Number of pixels to scroll by in each step. - delay: Time (in seconds) to wait between scrolls. """ total_height = driver.execute_script( "return document.body.scrollHeight") scrolled_height = 0 while scrolled_height < total_height: # Scroll down by 'distance' pixels driver.execute_script(f"window.scrollBy(0, {distance});") scrolled_height += distance time.sleep(delay) # Pause between scrolls # Update the total page height after scrolling total_height = driver.execute_script( "return document.body.scrollHeight") print("Finished scrolling.") try: for url in url_list: # Use Selenium to load the page driver.get(url) time.sleep(5) # Give the page time to load # Scroll down the page scroll_down_page() # Extract single elements with Selenium def extract_element_text(selector, description): try: # Wait for the element and extract text element = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, selector)) ) text = element.text.strip() return text if text else None # Return None if the text is empty except TimeoutException: print(f"Timeout: Could not find {description}. Setting to None.") return None except NoSuchElementException: print(f"Element not found: {description}. Setting to None.") return None # Extract single elements reviews_data = {} reviews_data["secondary_rating"] = extract_element_text("div[data-test='secondary-rating']", "secondary_rating") reviews_data["rating_count"] = extract_element_text( "div[data-test='rating-count']", "rating_count") reviews_data["rating_histogram"] = extract_element_text("div[data-test='rating-histogram']", "rating_histogram") reviews_data["percent_recommended"] = extract_element_text("div[data-test='percent-recommended']", "percent_recommended") reviews_data["total_recommendations"] = extract_element_text("div[data-test='total-recommendations']", "total_recommendations") # Extract reviews from 'reviews-list' scraped_reviews = [] # Use Beautiful Soup to extract other content soup = BeautifulSoup(driver.page_source, 'html.parser') # Select all reviews in the list using BeautifulSoup reviews_list = soup.select("div[data-test='reviews-list'] > div") for review in reviews_list: # Create a dictionary to store each review's data ratings = {} # Extract title title_element = review.select_one( "h4[data-test='review-card--title']") ratings['title'] = title_element.text.strip( ) if title_element else None # Extract rating rating_element = review.select_one("span[data-test='ratings']") ratings['rating'] = rating_element.text.strip( ) if rating_element else None # Extract time time_element = review.select_one( "span[data-test='review-card--reviewTime']") ratings['time'] = time_element.text.strip( ) if time_element else None # Extract review text text_element = review.select_one( "div[data-test='review-card--text']") ratings['text'] = text_element.text.strip( ) if text_element else None # Append each review to the list of reviews scraped_reviews.append(ratings) # Append the list of reviews to the main product data reviews_data["reviews"] = scraped_reviews # Append the overall data to the scraped_data list scraped_data.append(reviews_data) # Output the scraped data print(f"Scraped data: {scraped_data}") except Exception as e: print(f"Error: {e}") finally: # Ensure driver quits after scraping driver.quit() if __name__ == "__main__": target_com_scraper()
Dalam kod ini, setiap modul mempunyai tujuan khusus untuk membina pengikis web kami:
Dalam langkah ini, anda akan memulakan Pemacu Web Chrome Selenium dan mengkonfigurasi pilihan penyemak imbas yang penting. Pilihan ini termasuk melumpuhkan ciri yang tidak diperlukan untuk meningkatkan prestasi, menetapkan saiz tetingkap dan mengurus log. Anda akan membuat instantiate WebDriver menggunakan webdriver.Chrome() untuk mengawal penyemak imbas sepanjang proses mengikis.
python3 -m venv env
Dalam bahagian ini, kami mencipta fungsi untuk menatal seluruh halaman. Tapak web Target.com memuatkan kandungan tambahan (seperti ulasan) secara dinamik apabila pengguna menatal ke bawah.
# On Unix or MacOS (bash shell): /path/to/venv/bin/activate # On Unix or MacOS (csh shell): /path/to/venv/bin/activate.csh # On Unix or MacOS (fish shell): /path/to/venv/bin/activate.fish # On Windows (command prompt): \path\to\venv\Scripts\activate.bat # On Windows (PowerShell): \path\to\venv\Scripts\Activate.ps1
Fungsi scroll_down_page() menatal halaman web secara beransur-ansur mengikut bilangan piksel (jarak) yang ditetapkan dengan jeda singkat (kelewatan) antara setiap skrol. Ia mula-mula mengira jumlah ketinggian halaman dan tatal ke bawah sehingga mencapai bahagian bawah. Semasa ia menatal, jumlah ketinggian halaman dikemas kini secara dinamik untuk menampung kandungan baharu yang mungkin dimuatkan semasa proses.
Dalam bahagian ini, kami menggabungkan kekuatan Selenium dan BeautifulSoup untuk mencipta persediaan mengikis web yang cekap dan boleh dipercayai. Walaupun Selenium digunakan untuk berinteraksi dengan kandungan dinamik seperti memuatkan halaman dan mengendalikan elemen yang diberikan JavaScript, BeautifulSoup lebih berkesan untuk menghuraikan dan mengekstrak elemen HTML statik. Kami mula-mula menggunakan Selenium untuk menavigasi halaman web dan menunggu elemen tertentu, seperti penilaian produk dan kiraan ulasan, dimuatkan. Elemen ini diekstrak dengan fungsi WebDriverWait Selenium, yang memastikan data kelihatan sebelum menangkapnya. Walau bagaimanapun, pengendalian ulasan individu melalui Selenium sahaja boleh menjadi rumit dan tidak cekap.
Menggunakan BeautifulSoup, kami memudahkan proses penggulungan melalui berbilang ulasan pada halaman. Setelah Selenium memuatkan halaman sepenuhnya, BeautifulSoup menghuraikan kandungan HTML untuk mengekstrak ulasan dengan cekap. Menggunakan kaedah select() dan select_one() BeautifulSoup, kami boleh menavigasi struktur halaman dan mengumpulkan tajuk, penilaian, masa dan teks untuk setiap ulasan. Pendekatan ini membolehkan pengikisan elemen berulang yang lebih bersih dan lebih berstruktur (seperti senarai ulasan) dan menawarkan fleksibiliti yang lebih besar dalam mengendalikan HTML, berbanding mengurus segala-galanya melalui Selenium sahaja.
import os import time from bs4 import BeautifulSoup from dotenv import load_dotenv from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Load environment variables load_dotenv() def target_com_scraper(): """ SCRAPER SETTINGS - API_KEY: Your ScraperAPI key. Get your API Key ==> https://www.scraperapi.com/?fp_ref=eunit """ API_KEY = os.getenv("API_KEY", "yourapikey") # ScraperAPI proxy settings (with HTTP and HTTPS variants) scraper_api_proxies = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } # URLs to scrape url_list = [ "https://www.target.com/p/enclosed-cat-litter-box-xl-up-up/-/A-90310047?preselect=87059440#lnk=sametab", ] # Store scraped data scraped_data = [] # Setup Selenium options with proxy options = Options() # options.add_argument("--headless") # Uncomment for headless mode options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-in-process-stack-traces") options.add_argument("--window-size=1920,1080") options.add_argument("--log-level=3") options.add_argument("--disable-logging") options.add_argument("--start-maximized") # Initialize Selenium WebDriver driver = webdriver.Chrome(service=ChromeService( ChromeDriverManager().install()), options=options, seleniumwire_options=scraper_api_proxies) def scroll_down_page(distance=100, delay=0.2): """ Scroll down the page gradually until the end. Args: - distance: Number of pixels to scroll by in each step. - delay: Time (in seconds) to wait between scrolls. """ total_height = driver.execute_script( "return document.body.scrollHeight") scrolled_height = 0 while scrolled_height < total_height: # Scroll down by 'distance' pixels driver.execute_script(f"window.scrollBy(0, {distance});") scrolled_height += distance time.sleep(delay) # Pause between scrolls # Update the total page height after scrolling total_height = driver.execute_script( "return document.body.scrollHeight") print("Finished scrolling.") try: for url in url_list: # Use Selenium to load the page driver.get(url) time.sleep(5) # Give the page time to load # Scroll down the page scroll_down_page() # Extract single elements with Selenium def extract_element_text(selector, description): try: # Wait for the element and extract text element = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, selector)) ) text = element.text.strip() return text if text else None # Return None if the text is empty except TimeoutException: print(f"Timeout: Could not find {description}. Setting to None.") return None except NoSuchElementException: print(f"Element not found: {description}. Setting to None.") return None # Extract single elements reviews_data = {} reviews_data["secondary_rating"] = extract_element_text("div[data-test='secondary-rating']", "secondary_rating") reviews_data["rating_count"] = extract_element_text( "div[data-test='rating-count']", "rating_count") reviews_data["rating_histogram"] = extract_element_text("div[data-test='rating-histogram']", "rating_histogram") reviews_data["percent_recommended"] = extract_element_text("div[data-test='percent-recommended']", "percent_recommended") reviews_data["total_recommendations"] = extract_element_text("div[data-test='total-recommendations']", "total_recommendations") # Extract reviews from 'reviews-list' scraped_reviews = [] # Use Beautiful Soup to extract other content soup = BeautifulSoup(driver.page_source, 'html.parser') # Select all reviews in the list using BeautifulSoup reviews_list = soup.select("div[data-test='reviews-list'] > div") for review in reviews_list: # Create a dictionary to store each review's data ratings = {} # Extract title title_element = review.select_one( "h4[data-test='review-card--title']") ratings['title'] = title_element.text.strip( ) if title_element else None # Extract rating rating_element = review.select_one("span[data-test='ratings']") ratings['rating'] = rating_element.text.strip( ) if rating_element else None # Extract time time_element = review.select_one( "span[data-test='review-card--reviewTime']") ratings['time'] = time_element.text.strip( ) if time_element else None # Extract review text text_element = review.select_one( "div[data-test='review-card--text']") ratings['text'] = text_element.text.strip( ) if text_element else None # Append each review to the list of reviews scraped_reviews.append(ratings) # Append the list of reviews to the main product data reviews_data["reviews"] = scraped_reviews # Append the overall data to the scraped_data list scraped_data.append(reviews_data) # Output the scraped data print(f"Scraped data: {scraped_data}") except Exception as e: print(f"Error: {e}") finally: # Ensure driver quits after scraping driver.quit() if __name__ == "__main__": target_com_scraper()
Apabila mengikis tapak web yang kompleks, terutamanya yang mempunyai langkah anti-bot yang teguh seperti Target.com, cabaran seperti larangan IP, had kadar atau sekatan akses sering timbul. Menggunakan Selenium untuk tugasan sedemikian menjadi rumit, terutamanya apabila menggunakan penyemak imbas tanpa kepala. Pelayar tanpa kepala membenarkan interaksi tanpa GUI, tetapi mengurus proksi secara manual dalam persekitaran ini menjadi mencabar. Anda perlu mengkonfigurasi tetapan proksi, memutar IP dan mengendalikan interaksi lain seperti pemaparan JavaScript, menjadikan pengikisan lebih perlahan dan terdedah kepada kegagalan.
Sebaliknya, ScraperAPI menyelaraskan proses ini dengan ketara dengan menguruskan proksi secara automatik. Daripada menangani konfigurasi manual dalam Selenium, mod proksi ScraperAPI mengedarkan permintaan merentasi berbilang alamat IP, memastikan pengikisan lebih lancar tanpa perlu risau tentang larangan IP, had kadar atau sekatan geografi. Ini menjadi amat berguna apabila bekerja dengan penyemak imbas tanpa kepala, di mana pengendalian kandungan dinamik dan interaksi tapak yang kompleks memerlukan pengekodan tambahan.
Mengintegrasikan mod proksi ScraperAPI dengan Selenium, dipermudahkan dengan menggunakan Selenium Wire, alat yang membolehkan konfigurasi proksi mudah. Berikut ialah persediaan pantas:
Setelah disepadukan, konfigurasi ini membolehkan interaksi yang lebih lancar dengan halaman dinamik, alamat IP berputar secara automatik dan melangkau had kadar tanpa kerumitan manual mengurus proksi dalam persekitaran penyemak imbas tanpa kepala.
Coretan di bawah menunjukkan cara mengkonfigurasi proksi ScraperAPI dalam Python:
import os import time from bs4 import BeautifulSoup from dotenv import load_dotenv from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Load environment variables load_dotenv() def target_com_scraper(): """ SCRAPER SETTINGS - API_KEY: Your ScraperAPI key. Get your API Key ==> https://www.scraperapi.com/?fp_ref=eunit """ API_KEY = os.getenv("API_KEY", "yourapikey") # ScraperAPI proxy settings (with HTTP and HTTPS variants) scraper_api_proxies = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' } } # URLs to scrape url_list = [ "https://www.target.com/p/enclosed-cat-litter-box-xl-up-up/-/A-90310047?preselect=87059440#lnk=sametab", ] # Store scraped data scraped_data = [] # Setup Selenium options with proxy options = Options() # options.add_argument("--headless") # Uncomment for headless mode options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-extensions") options.add_argument("--disable-in-process-stack-traces") options.add_argument("--window-size=1920,1080") options.add_argument("--log-level=3") options.add_argument("--disable-logging") options.add_argument("--start-maximized") # Initialize Selenium WebDriver driver = webdriver.Chrome(service=ChromeService( ChromeDriverManager().install()), options=options, seleniumwire_options=scraper_api_proxies) def scroll_down_page(distance=100, delay=0.2): """ Scroll down the page gradually until the end. Args: - distance: Number of pixels to scroll by in each step. - delay: Time (in seconds) to wait between scrolls. """ total_height = driver.execute_script( "return document.body.scrollHeight") scrolled_height = 0 while scrolled_height < total_height: # Scroll down by 'distance' pixels driver.execute_script(f"window.scrollBy(0, {distance});") scrolled_height += distance time.sleep(delay) # Pause between scrolls # Update the total page height after scrolling total_height = driver.execute_script( "return document.body.scrollHeight") print("Finished scrolling.") try: for url in url_list: # Use Selenium to load the page driver.get(url) time.sleep(5) # Give the page time to load # Scroll down the page scroll_down_page() # Extract single elements with Selenium def extract_element_text(selector, description): try: # Wait for the element and extract text element = WebDriverWait(driver, 5).until( EC.visibility_of_element_located( (By.CSS_SELECTOR, selector)) ) text = element.text.strip() return text if text else None # Return None if the text is empty except TimeoutException: print(f"Timeout: Could not find {description}. Setting to None.") return None except NoSuchElementException: print(f"Element not found: {description}. Setting to None.") return None # Extract single elements reviews_data = {} reviews_data["secondary_rating"] = extract_element_text("div[data-test='secondary-rating']", "secondary_rating") reviews_data["rating_count"] = extract_element_text( "div[data-test='rating-count']", "rating_count") reviews_data["rating_histogram"] = extract_element_text("div[data-test='rating-histogram']", "rating_histogram") reviews_data["percent_recommended"] = extract_element_text("div[data-test='percent-recommended']", "percent_recommended") reviews_data["total_recommendations"] = extract_element_text("div[data-test='total-recommendations']", "total_recommendations") # Extract reviews from 'reviews-list' scraped_reviews = [] # Use Beautiful Soup to extract other content soup = BeautifulSoup(driver.page_source, 'html.parser') # Select all reviews in the list using BeautifulSoup reviews_list = soup.select("div[data-test='reviews-list'] > div") for review in reviews_list: # Create a dictionary to store each review's data ratings = {} # Extract title title_element = review.select_one( "h4[data-test='review-card--title']") ratings['title'] = title_element.text.strip( ) if title_element else None # Extract rating rating_element = review.select_one("span[data-test='ratings']") ratings['rating'] = rating_element.text.strip( ) if rating_element else None # Extract time time_element = review.select_one( "span[data-test='review-card--reviewTime']") ratings['time'] = time_element.text.strip( ) if time_element else None # Extract review text text_element = review.select_one( "div[data-test='review-card--text']") ratings['text'] = text_element.text.strip( ) if text_element else None # Append each review to the list of reviews scraped_reviews.append(ratings) # Append the list of reviews to the main product data reviews_data["reviews"] = scraped_reviews # Append the overall data to the scraped_data list scraped_data.append(reviews_data) # Output the scraped data print(f"Scraped data: {scraped_data}") except Exception as e: print(f"Error: {e}") finally: # Ensure driver quits after scraping driver.quit() if __name__ == "__main__": target_com_scraper()
Dengan persediaan ini, permintaan yang dihantar ke pelayan proksi ScraperAPI dialihkan ke tapak web Target.com, memastikan IP sebenar anda tersembunyi dan menyediakan pertahanan yang teguh terhadap mekanisme anti-mengikis tapak web Target.com. Proksi juga boleh disesuaikan dengan memasukkan parameter seperti render=true untuk pemaparan JavaScript atau menentukan country_code untuk geolokasi.
Kod JSON di bawah ialah contoh respons menggunakan Pengikis Ulasan Sasaran:
python3 -m venv env
Jika anda ingin mendapatkan ulasan Target.com anda dengan cepat tanpa menyediakan persekitaran anda, mengetahui cara mengekod atau menyediakan proksi, anda boleh menggunakan API Pengikis Sasaran kami untuk mendapatkan data yang anda perlukan secara percuma. API Pengikis Sasaran dihoskan pada platform Apify dan sedia untuk digunakan tanpa sebarang persediaan diperlukan.
Pergi ke Apify dan klik pada "Cuba secara percuma" untuk bermula sekarang.
Sekarang anda mempunyai data ulasan dan penilaian Target.com anda, tiba masanya untuk memahami data ini. Data ulasan dan penilaian ini boleh memberikan cerapan berharga tentang pendapat pelanggan tentang produk atau perkhidmatan tertentu. Dengan menganalisis ulasan ini, anda boleh mengenal pasti pujian dan aduan biasa, mengukur kepuasan pelanggan, meramalkan gelagat masa hadapan dan mengubah ulasan ini menjadi cerapan yang boleh diambil tindakan.
Sebagai profesional pemasaran atau pemilik perniagaan yang mencari cara untuk memahami khalayak utama anda dengan lebih baik dan meningkatkan strategi pemasaran dan produk anda. Di bawah ialah beberapa cara anda boleh mengubah data ini menjadi cerapan yang boleh diambil tindakan untuk mengoptimumkan usaha pemasaran, menambah baik strategi produk dan meningkatkan penglibatan pelanggan:
Dengan menggunakan ScraperAPI untuk mengumpulkan data semakan berskala besar pada skala, anda boleh mengautomasikan dan menskalakan analisis sentimen, membolehkan membuat keputusan dan pertumbuhan yang lebih baik.
Ya, adalah sah untuk melarikan diri dari Target.com untuk mendapatkan maklumat yang tersedia secara umum, seperti penilaian dan ulasan produk. Tetapi penting untuk diingat bahawa maklumat awam ini mungkin masih termasuk butiran peribadi.
Kami menulis catatan blog tentang aspek undang-undang pengikisan web dan pertimbangan etika. Anda boleh mengetahui lebih lanjut di sana.
Ya, Target.com melaksanakan pelbagai langkah anti-mengikis untuk menyekat pengikis automatik. Ini termasuk cabaran penyekatan IP, pengehadan kadar dan CAPTCHA, semuanya direka untuk mengesan dan menghentikan permintaan automatik yang berlebihan daripada pengikis atau bot.
Untuk mengelak daripada disekat oleh Target.com, anda harus memperlahankan kadar permintaan, menggilirkan ejen pengguna, menggunakan teknik penyelesaian CAPTCHA dan elakkan membuat permintaan berulang atau frekuensi tinggi. Menggabungkan kaedah ini dengan proksi boleh membantu mengurangkan kemungkinan pengesanan.
Selain itu, pertimbangkan untuk menggunakan pengikis khusus seperti Target Scraper API atau Scraping API untuk memintas pengehadan Target.com ini.
Ya, menggunakan proksi adalah penting untuk mengikis Target.com dengan berkesan. Proksi membantu mengedarkan permintaan merentas berbilang alamat IP, meminimumkan peluang untuk disekat. Proksi ScraperAPI menyembunyikan IP anda, menjadikannya lebih sukar bagi sistem anti-mengikis untuk mengesan aktiviti anda.
Dalam artikel ini, anda mempelajari cara membina pengikis penilaian dan ulasan Target.com menggunakan Python, Selenium dan menggunakan ScraperAPI untuk memintas mekanisme anti-mengikis Target.com dengan berkesan, dan untuk mengelakkan larangan IP dan meningkatkan prestasi mengikis.
Dengan alat ini, anda boleh mengumpul maklum balas pelanggan yang berharga dengan cekap dan boleh dipercayai.
Setelah anda mengumpulkan data ini, langkah seterusnya ialah menggunakan analisis sentimen untuk mendedahkan cerapan utama. Dengan menganalisis ulasan pelanggan, anda sebagai perniagaan boleh mengenal pasti kekuatan produk, menangani titik kesakitan dan mengoptimumkan strategi pemasaran anda untuk memenuhi keperluan pelanggan anda dengan lebih baik.
Dengan menggunakan API Pengikis Sasaran untuk pengumpulan data berskala besar, anda boleh memantau ulasan secara berterusan dan kekal di hadapan dalam memahami sentimen pelanggan, membolehkan anda memperhalusi pembangunan produk dan mencipta lebih banyak kempen pemasaran yang disasarkan.
Cuba ScraperAPI sekarang untuk pengekstrakan data berskala besar yang lancar atau gunakan Pengikis Ulasan Cloud Target.com kami!
Untuk lebih banyak tutorial dan kandungan yang hebat, sila ikuti saya di Twitter (X) @eunit99
Atas ialah kandungan terperinci Cara Mengikis Ulasan Target.com dengan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!