溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python使用selenium模擬瀏覽器抓取淘寶信息的方法是什么

發(fā)布時間:2020-08-31 09:25:57 來源:億速云 閱讀:133 作者:小新 欄目:編程語言

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模擬瀏覽器抓取淘寶信息的方法是什么

感謝各位的閱讀!看完上述內容,你們對python使用selenium模擬瀏覽器抓取淘寶信息的方法是什么大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI