簡體   English   中英

如何抓取網站中的所有頁面

[英]How to scrape all the pages in the website

https://www.bestbuy.com/site/promo/health-fitness-deals

在此處輸入圖像描述

我想遍歷這 10 個頁面並抓取它們的名稱和 href 下面是我的代碼,它只連續抓取第一頁 10 次:

def name():
    for i in range(1, 11):
        tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
        for a in tag:
            for name in a.find_elements_by_tag_name('a'):
                links = name.get_attribute("href")
                names = name.get_attribute('text')
                watches_name.append(names)
                watches_link.append(links)
                # print(watches_name)
                # print(watches_link)


name()

如果你想從下一頁獲取元素,那么你必須在鏈接上click() >

driver.find_element_by_css_selector('.sku-list-page-next').click()

具有其他更改的最少工作代碼。

我將 xpath 簡化為更簡單的東西。 我保留名稱,鏈接成對,因為在文件 CSV 或數據庫中寫入或過濾和排序更簡單。

我不得不使用更長的sleep時間——有時我的瀏覽器需要更多時間來更新頁面上的元素。

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

for page in range(1, 11):

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    print('\n[DEBUG] click next\n')
    driver.find_element_by_css_selector('.sku-list-page-next').click()
    
#print(items)

順便提一句:

此方法可以使用while True和一些方法來識別是否存在鏈接> - 並在沒有>時退出循環。 這樣它就可以處理任意數量的頁面。


其他方法。

當您手動訪問幾個頁面時,您應該看到第二頁有 url 和?cp=2 ,第三個有?cp=3等,所以你可以用它來加載頁面

driver.get(url + '?cp=' + str(page+1) )

最少的工作代碼。

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

for page in range(1, 11):

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    print('\n[DEBUG] load next url\n')
    driver.get(url + '?cp=' + str(page+1) )
    
#print(items)

此方法還可以使用while True和可變page來獲取任意數量的頁面。


編輯:

帶有while True的版本

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

page = 1

while True:

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    page += 1

    print('\n[DEBUG] load next url\n')
    driver.get(url + '?cp=' + str(page) )

    if driver.title == 'Best Buy: Page Not Found':
        print('\n[DEBUG] exit loop\n')
        break
    
#print(items)

from selenium import webdriver
import time

url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'

driver = webdriver.Firefox()
driver.get(url)

time.sleep(2)

# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()

items = []

page = 1

while True:

    print('\n[DEBUG] wait 15 seconds to update page\n')
    time.sleep(15)

    print('\n--- page', page, '---\n')

    all_links = driver.find_elements_by_css_selector('#main-results h4 a')
    for a in all_links:
        link = a.get_attribute("href")
        name = a.get_attribute('text')
        items.append( [name, link] )
        print(name)

    page += 1
    
    print('\n[DEBUG] click next\n')
    item = driver.find_element_by_css_selector('.sku-list-page-next')
    if item.get_attribute("href"):
        item.click()
    else:
        print('\n[DEBUG] exit loop\n')
        break        
    
#print(items)

我想如果你的代碼工作正常,你只需要點擊分頁按鈕。 我發現它可以在 css 選擇器('#Caret_Right_Line_Sm')的幫助下找到。 嘗試將此行添加到您的 function:

def name():
    for i in range(1, 11):
        tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
        for a in tag:
            for name in a.find_elements_by_tag_name('a'):
                links = name.get_attribute("href")
                names = name.get_attribute('text')
                watches_name.append(names)
                watches_link.append(links)
                # print(watches_name)
                # print(watches_link)
        driver.find_elements_by_css_selector('#Caret_Right_Line_Sm')[1].click()

name()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM