您好,登錄后才能下訂單哦!
python使用selenium模擬瀏覽器抓取淘寶信息的方法是什么?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純热?,讓我們一起來看看吧?/p>
目的:
使用 selenium 模擬瀏覽器抓取淘寶商品信息
實現(xiàn)功能:
1、創(chuàng)建driver對象
2、請求淘寶商品信息
3、實現(xiàn)翻頁
4、通過driver對象,解析商品頁面內容,獲取需要的數(shù)據(jù)
5、保存數(shù)據(jù)到MongoDB數(shù)據(jù)庫
代碼示例:
# coding = utf-8 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.webdriver import ChromeOptions from selenium.common.exceptions import TimeoutException from pyquery import PyQuery as pq from pymongo import MongoClient import time import re class TaobaoSpider(object): """使用 selenium 模擬瀏覽器抓取淘寶商品信息""" def __init__(self): # 設置options參數(shù),以開發(fā)者模式 option = ChromeOptions() option.add_experimental_option("excludeSwitches", ["enable-automation"]) # 連接MongoDB并創(chuàng)建數(shù)據(jù)庫 client = MongoClient(host="127.0.0.1", port=27017) self.collection = client["taobao"]["products"] # 創(chuàng)建一個driver對象,模擬開啟一個瀏覽器 self.driver = webdriver.Chrome(options=option) # 請求登錄頁面 self.driver.get("https://login.taobao.com/member/login.jhtml") # 等待頁面 self.wait = WebDriverWait(self.driver, 10) def __del__(self): pass def login(self): # 通過掃描登錄淘寶 # 通過CSS選擇器找到切換二維碼登錄的按鈕: qr_code_login = self.wait.until( ec.element_to_be_clickable((By.CSS_SELECTOR, "#login > div.corner-icon-view.view-type-qrcode > i")) ) # 點擊掃描登錄 qr_code_login.click() time.sleep(5) def search(self): # 搜索淘寶商品 self.login() # 登錄后請求淘寶首頁 try: self.driver.get("https://www.taobao.com/") # 確認網(wǎng)頁加載完成后,找到淘寶搜索輸入框 search_input = self.wait.until( ec.presence_of_element_located((By.CSS_SELECTOR, "#q")) ) # 找到點擊按鈕 search_submit = self.wait.until( ec.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")) ) # 輸入?yún)?shù) 查詢 search_input.send_keys("魚皮") # 點擊按鈕提交 search_submit.click() # 商品按照銷量排序 sales_sort = self.wait.until( ec.element_to_be_clickable( (By.CSS_SELECTOR, "#J_relative > div.sort-row > div > ul > li:nth-child(2) > a")) ) sales_sort.click() # 等待頁面數(shù)據(jù)特別是圖片加載完成 time.sleep(2) # 等待商品頁數(shù)加載完成 total_page = self.wait.until( ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")) ) # 解析頁面數(shù)據(jù) self.parse_data() return total_page.text except TimeoutException: return self.search() def turn_pages(self, page_number): # 實現(xiàn)翻頁操作 try: # 等待 頁碼輸入框 和 提交確定按鈕 準備好 page_input = self.wait.until( ec.presence_of_element_located( (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input") ) ) page_submit = self.wait.until( ec.element_to_be_clickable( (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit") ) ) # 頁碼清空,然后輸入 page_input.clear() page_input.send_keys(page_number) # 提交頁碼 page_submit.click() # 判斷是否轉入到當前頁碼:高亮標記頁碼 self.wait.until( ec.text_to_be_present_in_element( (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"), str(page_number) ) ) time.sleep(1) # 解析頁面數(shù)據(jù) self.parse_data() except TimeoutException: self.turn_pages(page_number) def parse_data(self): # 解析商品數(shù)據(jù) # 等待所有商品加載成功 self.wait.until( ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist .items .item")) ) html = self.driver.page_source # 通過pyquery解析數(shù)據(jù) data = pq(html) # 選出單個商品 items = data("#mainsrp-itemlist .items .item").items() # 通過for遍歷每個商品信息,以字典的形式保存 for item in items: product = { 'title': item.find('.title').text(), 'price': item.find('.price').text(), 'deal': item.find('.deal-cnt').text()[:-3], 'shop': item.find('.shop').text(), 'location': item.find('.location').text(), 'image': item.find('.pic .img').attr('src') } # 去掉數(shù)據(jù)中的 \n for key, value in product.items(): value = re.sub(r'¥|\n', '', value) # print(value) product[key] = value print(product) # 將數(shù)據(jù)保存到MongoDB self.save_to_mongodb(product) def save_to_mongodb(self, result): # 保存數(shù)據(jù)到MongoDB數(shù)據(jù)庫 try: if self.collection.insert(result): print("數(shù)據(jù)存儲到MongoDB數(shù)據(jù)庫成功") except Exception: print("數(shù)據(jù)保存到MongoDB數(shù)據(jù)庫失敗") def save_to_mysql(self): # 保存到MySQL數(shù)據(jù)庫 pass def main(): spider = TaobaoSpider() try: data = spider.search() # 獲取總頁數(shù) # data = int(re.compile('(\d+)').search(data).group(1)) for i in range(2, 4): spider.turn_pages(i) time.sleep(2) finally: # 程序退出 spider.driver.quit() if __name__ == "__main__": main()
測試:
感謝各位的閱讀!看完上述內容,你們對python使用selenium模擬瀏覽器抓取淘寶信息的方法是什么大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。