1. 程式人生 > 程式設計 >Python進階之使用selenium爬取淘寶商品資訊功能示例

Python進階之使用selenium爬取淘寶商品資訊功能示例

本文例項講述了Python進階之使用selenium爬取淘寶商品資訊功能。分享給大家供大家參考,具體如下:

# encoding=utf-8
__author__ = 'Jonny'
__location__ = '西安'
__date__ = '2018-05-14'
'''
需要的基本開發庫檔案:
requests,pymongo,pyquery,selenium
開發流程:
  搜尋關鍵字:利用selenium驅動瀏覽器搜尋關鍵字,得到查詢後的商品列表
  分析頁碼並翻頁:得到商品頁碼數,模擬翻頁,得到後續頁面的商品列表
  分析提取商品內容:利用PyQuery分析頁面原始碼,解析獲得商品列表資訊
  儲存到MongDB中:將商品的資訊列表儲存到資料庫MongoDB。
'''
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
import pymongo
import re
import time
browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
client = pymongo.MongoClient('localhost',27017)
mongo = client['taobao']
def searcher():
  url = 'https://www.taobao.com/'
  browser.get(url=url)
  try:
    #判斷頁面載入是夠成功,設定等待時間
    #判斷位置1:搜尋輸入框是否載入完成
    input_kw = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
    )
    #判斷位置2:搜尋輸入框對應的搜尋按鍵是否載入完成
    submit = wait.until(EC.element_to_be_clickable(
      (By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button'))
    )
    input_kw.send_keys('男裝')
    submit.click()
    #等待頁面載入完成,便於準確判斷網頁的總頁數
    page_counts = wait.until(
      EC.presence_of_element_located(
        (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total'))
    )
    parse_page()
    return page_counts.text
  except TimeoutException as e:
    print(e.args)
    return searcher()
#實現翻頁
def next_page(page_number):
  try:
    # 判斷頁面載入是夠成功,設定等待時間
    # 判斷位置1:頁面跳轉輸入頁是否載入完成
    input_page = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input'))
    )
    # 判斷位置2:確認按鍵是否載入完成
    submit = wait.until(EC.element_to_be_clickable(
      (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
    )
    input_page.send_keys(page_number)
    submit.click()
    #判斷翻頁是否成功
    wait.until(EC.text_to_be_present_in_element(
      (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active'),str(page_number))
    )
    parse_page()
  except TimeoutException as e:
    print(e.args)
    next_page(page_number)
#對頁面進行資料處理
def parse_page():
  # wait.until(EC.presence_of_element_located(By.CSS_SELECTOR,'#mainsrp-itemlist > div > div'))
  wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
  html = browser.page_source
  doc = pq(html)
  items = doc('#mainsrp-itemlist .items .item').items()
  for item in items:
    goods = {
      'image':item.find('.pic .img').attr('src'),'price':item.find('.price').text(),'deal':item.find('.deal-cnt').text()[:-3],'title':item.find('.title').text(),'shop':item.find('.shop').text(),'location':item.find('.location').text()
    }
    print(goods)
    data_storage(goods)
#將資料存入資料庫
def data_storage(goods):
  try:
    if mongo['mongo_sheet'].insert(goods):
      print('Successfully storage!')
  except Exception as e:
    print('failedly storage!',goods)
def main():
  text = searcher()
  print(text)
  #獲取總頁數
  pages = int(re.compile('(\d+)').search(text).group(0))
  print(pages)
  for i in range(2,pages+1):
    next_page(i)
  browser.close()
if __name__ == '__main__':
  main()

更多關於Python相關內容可檢視本站專題:《Python Socket程式設計技巧總結》、《Python正則表示式用法總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。