爬虫笔记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数据库信息如下:

相关推荐
Komorebi.py2 分钟前
【Linux】-学习笔记05
linux·笔记·学习
亦枫Leonlew11 分钟前
微积分复习笔记 Calculus Volume 1 - 6.5 Physical Applications
笔记·数学·微积分
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
wusong9999 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
猫爪笔记9 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
Resurgence039 小时前
【计组笔记】习题
笔记
pq113_610 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
爱米的前端小笔记10 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
Tech Synapse11 小时前
Python网络爬虫实践案例:爬取猫眼电影Top100
开发语言·爬虫·python