從登陸到爬取:Python反反爬獲取某寶成千上萬條公開商業數據

不知從何時起,開始享受上了爬取成千上萬條數據的感覺!

本文將運用Python反反爬技術講解如何獲取某寶成千上萬條公開商業數據。

目錄

1 前期準備

2 案例詳解 

2.1 導入模塊

2.2 核心代碼

2.3 總觀代碼

3 總結聲明


1 前期準備

Python環境:Python 3.8.2

Python編譯器:JetBrains PyCharm 2018.1.2 x64

第三方庫及模塊:selenium、time、csv、re

此外,還需要一個瀏覽器驅動器:webDriver

其中,selenium是一個第三方庫,需要另外安裝,就在終端輸入下述命令行即可

pip install selenium

輸入Python 和 import\, selenium 若未報錯則證明第三方庫安裝成功。

 這裏再說一下瀏覽器驅動器如何安裝(以谷歌瀏覽器爲例介紹):

首先,下載瀏覽器驅動器WebDriver

chrom瀏覽器的驅動器下載地址:http://npm.taobao.org/mirrors/chromedriver/

firefox(火狐瀏覽器)的驅動器下載地址:https://github.com/mozilla/geckodriver/releases

Edge瀏覽器的驅動器下載地址:https://developer.microsoft.com/en-us/micrsosft-edage/tools/webdriver

Safari瀏覽器的驅動器下載地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

以谷歌瀏覽器爲例,需要首先知道瀏覽器的版本號

 只需要前面的83.0對應好就OK,大的方向對應了就行,然後找到相匹配的版本進行下載

 下載好以後測試一下

# 從 selenium 裏面導入 webdriver
from selenium import webdriver

# 指定 chrom 驅動(下載到本地的瀏覽器驅動器,地址定位到它)
driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')

# get 方法打開指定網址
driver.get('http://www.baidu.com')

至此,準備工作就緒,接下來正式進入爬蟲案例講解

2 案例詳解 

2.1 導入模塊

將前文所述的第三方庫及相關模塊進行導入

from selenium.webdriver import ActionChains # 導入動作鏈
from selenium import webdriver
import time
import csv
import re

2.2 核心代碼

確定目標網頁:淘寶網(官網)

編寫自動打開目標網頁代碼

# 傳入瀏覽器驅動本地地址
driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')
# 傳入目標頁面地址
driver.get('https://www.taobao.com/')

最大化瀏覽器

driver.maximize_window() # 最大化瀏覽器

傳入關鍵字並實現自動搜索商品

keyword = input('請輸入您要搜索的商品名字:')
driver.find_element_by_id('q').send_keys(keyword)  # 根據“檢查”的id值精確定位淘寶網搜索框並傳入關鍵字
driver.find_element_by_class_name('btn-search').click() # 根據class標籤'btn-search'定位到搜索按鈕並點擊

 這時我們發現,需要登錄才能查看搜索內容,那麼接下來解決登陸問題

傳入賬號密碼(這裏通過F12鍵定位其xpath值)

driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('賬號')
driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('密碼')

解決人機驗證問題(反反爬,實現滑塊向右滑動)

login = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') # 通過xpath找到滑塊
action = ActionChains(driver)  # 創造出一個動作鏈
action.click_and_hold(on_element=login) # 點擊不鬆開
action.move_by_offset(xoffset=300-42, yoffset=0) # 通過座標軸滑動
action.pause(0.5).release().perform() # 設置鏈式調用時間(滑動滑塊時間),並鬆開鼠標   perform()執行動作鏈

獲取整個頁面的目標數據值(for循環)

divs = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
for div in divs:
    info = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
    price = div.find_element_by_xpath('.//strong').text
    deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text
    shop = div.find_element_by_xpath('.//div[@class="shop"]/a').text

保存文件(以csv格式進行存儲)

with open('data.csv', mode='a', newline="") as csvfile:
    csvWriter = csv.writer(csvfile, delimiter=',')
    csvWriter.writerow([info, price, deal, shop])

以上是爬取一頁數據,那麼爬取多頁數據怎麼擼代碼呢

 獲取總頁數

page = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text # 獲取總頁數標籤
page_list = re.findall('(\d+)', page)  # 正則表達式獲取多個精確數字數據[返回的是列表]
page_num = page_list[0]   # 字符串類型數據

for循環遍歷所有頁面,獲取該商品的所有數據

driver.get('https://s.taobao.com/search?q={}&s={}'.format(keyword, page_num*44))
page_num += 1

值得注意的是,上述代碼的頁面地址是根據查看多頁地址數據獲得規律總結出來的

很顯然,從第2頁數據地址開始,其s值從44\rightarrow 88\rightarrow 132\rightarrow,以數字44疊加規律生成。

2.3 總觀代碼

from selenium.webdriver import ActionChains # 導入動作鏈
from selenium import webdriver
import time
import csv
import re

# 尋找關鍵字並登錄淘寶
def search_product(key):
    driver.get('https://www.taobao.com/')
    driver.find_element_by_id('q').send_keys(key)  # 根據“檢查”的id值精確定位淘寶網搜索框並傳入關鍵字
    driver.find_element_by_class_name('btn-search').click() # 根據class標籤'btn-search'定位到搜索按鈕並點擊

    driver.implicitly_wait(10) # 隱式等待(單位是秒) 等到頁面渲染完之後就不再等待
    driver.maximize_window() # 最大化瀏覽器

    # 解決登陸(登錄防爬:例如有滑塊)
    driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('這裏填寫賬戶名稱/手機號碼')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('這裏填寫賬戶密碼')
    time.sleep(2)

    # 解決滑塊
    login = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') # 通過xpath找到滑塊
    action = ActionChains(driver)  # 創造出一個動作鏈
    action.click_and_hold(on_element=login) # 點擊不鬆開
    action.move_by_offset(xoffset=300-42, yoffset=0) # 通過座標軸滑動
    action.pause(0.5).release().perform() # 設置鏈式調用時間(滑動滑塊時間),並鬆開鼠標   perform()執行動作鏈
    driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click() # 點擊登錄並重定向到前面的關鍵字
    driver.implicitly_wait(10) # 隱式等待

    page = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text # 獲取總頁數標籤
    page_list = re.findall('(\d+)', page)  # 正則表達式獲取多個精確數字數據[返回的是列表]
    page_num = page_list[0]   # 字符串類型數據

    return int(page_num)

# 爬取數據並保存
def get_data():
    divs = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
    for div in divs:
        info = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
        price = div.find_element_by_xpath('.//strong').text
        deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        shop = div.find_element_by_xpath('.//div[@class="shop"]/a').text
        print(info, price, deal, shop, sep='|')

        # 保存
        with open('data.csv', mode='a', newline="") as csvfile:
            csvWriter = csv.writer(csvfile, delimiter=',')
            csvWriter.writerow([info, price, deal, shop])

def main():
    print('正在爬取第1頁數據...')
    page = search_product(keyword)
    get_data()

    # 第2頁之後數據獲取
    page_num = 1   # page_num * 44
    while page_num != page:
        print('*' * 100)
        print('正在爬取第{}頁數據'.format(page_num+1))
        print('*' * 100)
        driver.get('https://s.taobao.com/search?q={}&s={}'.format(keyword, page_num*44))
        driver.implicitly_wait(10)  # 隱式等待
        get_data()
        page_num += 1

    driver.quit()

if __name__ == '__main__':
    driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')
    # keyword = '電腦'
    keyword = input('請輸入您要搜索的商品名字:')
    main()

總運行效果截圖展示

這是PyCharm運行效果截圖

 這是csv文件打開後的截圖

3 總結聲明

最近在複習準備期末考試,7月份後我將系統寫作爬蟲專欄:Python網絡數據爬取及分析「從入門到精通」
感興趣的叫夥伴們可以先關注一波!

更多原創文章及分類專欄請點擊此處→我的主頁

★版權聲明:本文爲CSDN博主「榮仔!最靚的仔!」的原創文章,遵循CC 4.0 BY-SA版權協議。
                  轉載請附上原文出處鏈接及本聲明


歡迎留言,一起學習交流~~~

感謝閱讀

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章