python使用selenium模拟浏览器抓取淘宝信息

目的:

使用 selenium 模拟浏览器抓取淘宝商品信息

(推荐教程:Python入门教程)

实现功能:

1、创建driver对象

2、请求淘宝商品信息

3、实现翻页

4、通过driver对象,解析商品页面内容,获取需要的数据

5、保存数据到MongoDB数据库

代码示例:

# 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参数,以开发者模式
        option = ChromeOptions()
        option.add_experimental_option("excludeSwitches", ["enable-automation"])

        # 连接MongoDB并创建数据库
        client = MongoClient(host="127.0.0.1", port=27017)
        self.collection = client["taobao"]["products"]

        # 创建一个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/")

            # 确认网页加载完成后,找到淘宝搜索输入框
            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"))
            )
            # 输入参数 查询
            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()
            # 等待页面数据特别是图片加载完成
            time.sleep(2)
            # 等待商品页数加载完成
            total_page = self.wait.until(
                ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
            )

            # 解析页面数据
            self.parse_data()
            return total_page.text
        except TimeoutException:
            return self.search()

    def turn_pages(self, page_number):
        # 实现翻页操作
        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)
            # 解析页面数据
            self.parse_data()
        except TimeoutException:
            self.turn_pages(page_number)

    def parse_data(self):
        # 解析商品数据
        # 等待所有商品加载成功
        self.wait.until(
            ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist .items .item"))
        )
        html = self.driver.page_source
        # 通过pyquery解析数据
        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')
            }
            # 去掉数据中的 

            for key, value in product.items():
                value = re.sub(r'¥|
', '', value)
                # print(value)
                product[key] = value
            print(product)
            # 将数据保存到MongoDB
            self.save_to_mongodb(product)

    def save_to_mongodb(self, result):
        # 保存数据到MongoDB数据库
        try:
            if self.collection.insert(result):
                print("数据存储到MongoDB数据库成功")
        except Exception:
            print("数据保存到MongoDB数据库失败")

    def save_to_mysql(self):
        # 保存到MySQL数据库
        pass


def main():
    spider = TaobaoSpider()
    try:
        data = spider.search()
        # 获取总页数
        # 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()

测试:

db24ab3cf3e0e7bf6c5db7960470784.png

来源:PY学习网:原文地址:https://www.py.cn/article.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » python使用selenium模拟浏览器抓取淘宝信息