爬虫笔记18——selenium自动加载并存储vip(唯品会)网页数据

爬取唯品会的商品数据信息

整体的流程就是在唯品会首页搜索栏搜索对应的商品,然后跳转到对应商品页面进行数据的爬取、筛选和存储。

  • 其实也有另外一个爬取方案,不用selenium也是可以爬取到相应的数据,通过分析,搜索结果的页面是一个动态网页。动态页面的话这就要找到页面数据对应的接口,然后请求接口获取数据,我测试的时候返回的是个回调函数数据,把回调函数这个参数去掉它会变成json数据,然后进行筛选提取即可。有兴趣的可以去试试。

目前这里主要用的是selenium操作并返回网页的源代码提取数据:

思路分析:

1、 用selenium自动加载对应的网页数据,然后使用浏览器对象的page_source获取网页的源代码。

2、通过源代码,我们可以使用xpath的方式提取网页的商品数据信息。

3、最后就是把提取到的信息存储进去MongoDB数据库。

4、另外,要提取多页数据可以用格式化的方式改一下网页的参数,更改页面继续上面的操作即可。

代码示例:

python 复制代码
# -*- coding: utf-8 -*-
# @Time:      2024/06/29 11:59
# @File:       selenium爬取唯品会.py
#仅供学习参考

import pymongo
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
import time


class SpiderVIP:
    def __init__(self, goods):
        # 商品关键词
        self.goods = goods
        # 数据库连接对象
        self.mongoDB = pymongo.MongoClient()
        self.connect = self.mongoDB['py_spider']['vip_data']
        # 创建浏览器驱动对象
        self.browser = webdriver.Chrome()
        # 创建等待操作对象
        self.wait_ob = WebDriverWait(self.browser, 10)
        self.url = 'https://category.vip.com'

    # 获取唯品会首页并搜索商品获取网页源代码
    def start(self):
        self.browser.get(self.url)

        # 如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,
        # 这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错。
        # presence_of_element_located:判定符合查询条件的一个元素是否存在
        search_input = self.wait_ob.until(EC.presence_of_element_located(
            (By.XPATH, "//input[@class='c-search-input  J-search-input']"))
        )
        search_input.send_keys(self.goods)

        search_button = self.wait_ob.until(EC.presence_of_element_located(
            (By.XPATH, "//a[@class='c-search-button  J-search-button  J_fake_a']")
        ))
        # 让检索框有充足的时间写入数据,程序休眠并加载完搜索按钮后点击
        time.sleep(2)
        search_button.click()
        time.sleep(2)

        self.roll_page()
        self.parse_page()

    def parse_page(self):
        div_list = self.browser.find_elements(
            By.XPATH,
            '//section[@id="J_searchCatList"]/div[@class="c-goods-item  J-goods-item c-goods-item--auto-width"]'
        )

        for div in div_list:
            price = div.find_element(
                By.XPATH,
                './/div[@class="c-goods-item__sale-price J-goods-item__sale-price"]'
            ).text

            title = div.find_element(
                By.XPATH,
                './/div[2]/div[2]'
            ).text

            item = {
                'title': title,
                'price': price
            }
            print(item)
            self.insert_mongo(item)
        self.click_next_page()

    # 页面滚动
    def roll_page(self):
        for i in range(1, 12):
            js_code = f"document.documentElement.scrollTop = {i * 1000}"
            self.browser.execute_script(js_code)
            time.sleep(1)

    def click_next_page(self):
        try:
            click_button = self.browser.find_element(By.XPATH, "//*[@id='J_page_special']/a[2]")
            if click_button:
                click_button.click()
                time.sleep(2)
                # 进入下一页解析页面
                self.roll_page()
                self.parse_page()
            else:
                self.browser.close()
        except Exception as e:
            print('没有下一页了', e)

    # 数据存储
    def insert_mongo(self, item):
        self.connect.insert_one(item)
        print('该条数据插入成功!')

    def main(self):
        self.start()


if __name__ == '__main__':
    search_value = input('输入要搜索的商品:')
    vip = SpiderVIP(search_value)
    vip.main()

MongoDB数据库信息如下:

相关推荐
API快乐传递者1 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
aloha_7893 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
dsywws4 小时前
Linux学习笔记之vim入门
linux·笔记·学习
A-超7 小时前
vue3展示pag格式动态图
笔记
u0101526587 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
weixin_518285057 小时前
深度学习笔记10-多分类
人工智能·笔记·深度学习
丘狸尾7 小时前
ubuntu【桌面】 配置NAT模式固定IP
笔记
王俊山IT8 小时前
C++学习笔记----10、模块、头文件及各种主题(二)---- 预处理指令
开发语言·c++·笔记·学习
慕卿扬8 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
齐 飞10 小时前
MongoDB笔记02-MongoDB基本常用命令
前端·数据库·笔记·后端·mongodb