不知從何時起,開始享受上了爬取成千上萬條數據的感覺!
本文將運用Python反反爬技術講解如何獲取某寶成千上萬條公開商業數據。
目錄
1 前期準備
Python環境:Python 3.8.2
Python編譯器:JetBrains PyCharm 2018.1.2 x64
第三方庫及模塊:selenium、time、csv、re
此外,還需要一個瀏覽器驅動器:webDriver
其中,selenium是一個第三方庫,需要另外安裝,就在終端輸入下述命令行即可
pip install 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/
以谷歌瀏覽器爲例,需要首先知道瀏覽器的版本號
只需要前面的對應好就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
值得注意的是,上述代碼的頁面地址是根據查看多頁地址數據獲得規律總結出來的
很顯然,從第頁數據地址開始,其值從,以數字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版權協議。
轉載請附上原文出處鏈接及本聲明。
歡迎留言,一起學習交流~~~
感謝閱讀