利用Python自动搜索指定京东商品并爬取商品信息

Posted Z.Q.Feng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python自动搜索指定京东商品并爬取商品信息相关的知识,希望对你有一定的参考价值。

文章目录

前言

一、准备工作

1. 安装相关Python库

2. 安装Chrome和ChromeDriver 

二、代码说明

1. 模块引入

2. 网页分析

三、代码

四、输出示例


前言

环境:Ubuntu20.04、Python3.8.10、Spyder4.2.0

目标:通过 Python 自动打开浏览器,搜索指定搜商品,并爬取对应商品信息(评论数、好评率、商品名称等)------以搜索“程序员”相关商品为例

注:完整代码在文末给出,请不要跳过前面的准备工作哦


一、准备工作

1. 安装相关Python库

跟普通的 Python 库安装方法一致,本文使用的库为 selenium 库

pip3 install selenium -i https://pypi.mirrors.ustc.edu.cn/simple

2. 安装Chrome和ChromeDriver 

可参考作者的这篇博客:Ubuntu和Windows下ChromeDriver的安装与配置


二、代码说明

1. 模块引入

# 导入驱动webdriver,即浏览器控制器
from selenium import webdriver
# 判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,
# 在selenium的expected_conditions模块收集了一系列的场景判断方法
from selenium.webdriver.support import expected_conditions as EC
# By是selenium中内置的一个class,在这个class中有各种方法来定位元素
from selenium.webdriver.common.by import By
# 设置浏览器驱动休眠等待,避免频繁操作封ip
from selenium.webdriver.support.ui import WebDriverWait

2. 网页分析

本案例选择CSS_SELECTOR和ID来选择元素,

其中各参考元素位置如下:

  • #key:商品搜索输入栏;
  • #search button.button:商品搜索确认按钮;
  • #li.gl-item:页面中60个商品的标签;
  • #J_goodsList ul li:nth-child(40):页面中的第40个商品;
  • #a:当前页面单个商品标签;
  • #comment-count a:商品的评价总数;
  • #.sku-name:商品的标题;
  • #comment .percent-con:商品的好评率;
  • #a.pn-next:下一页所在按钮;
  • #J_bottomPage a.curr:翻页后的页码。

完成上述分析后,就可以实现我们的代码了。


三、代码

话不多说,直接copy:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 28 17:44:13 2021

通过selenium模拟人为操作浏览器,搜索指定商品,爬取京东商品信息

@author: zq
"""

# 导入驱动webdriver,即浏览器控制器
from selenium import webdriver
# 判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,
# 在selenium的expected_conditions模块收集了一系列的场景判断方法
from selenium.webdriver.support import expected_conditions as EC
# By是selenium中内置的一个class,在这个class中有各种方法来定位元素
from selenium.webdriver.common.by import By
# 设置浏览器驱动休眠等待,避免频繁操作封ip
from selenium.webdriver.support.ui import WebDriverWait

# 实例化一个用于控制Chrome的控制器(selenium还可以控制其他浏览器)
driver = webdriver.Chrome()
# 访问该网站
driver.get('https://www.jd.com')
# 窗口最大化,防止小弹窗阻挡
driver.maximize_window()

# 获取搜索输入框和搜索确认框
search_input = driver.find_element_by_id("key")
search_btn = driver.find_element_by_css_selector("#search button.button")

# 向搜索输入框内键入搜索内容,这里我们搜索“程序员”相关商品
search_input.send_keys("程序员")
# 点击搜索确认按钮
search_btn.click()

# 定义一个等待对象,设置最长等待时长为120s
wait = WebDriverWait(driver, 120)

def crawl_page():
    # 等待CSS_SELECTOR选择器指定的内容完成加载
    wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, "li.gl-item")
        )
    )
    # 模拟滚动页面到最后的过程
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    # 等待第40个商品加载出来以确保二次加载完成
    wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, '#J_goodsList ul li:nth-child(40)')
        )
    )
    # 记录当前页面商品数量
    count = 1
    books = driver.find_elements_by_css_selector("li.gl-item")
    for book in books:
        product = {}
        product['index'] = count

        # 点击商品标签
        book.find_element_by_css_selector('a').click()

        # 切换到浏览器的第二个标签页
        driver.switch_to.window(driver.window_handles[1])

        # 等待评论总数加载完成
        comment_cnt = wait.until(
            EC.presence_of_element_located(
                (By.CSS_SELECTOR, '#comment-count a')
            )
        )
        # 商品名称
        title = driver.find_element_by_css_selector(".sku-name")
        product['commit'] = comment_cnt.text
        product['name'] = title.text

        # 点击总评论数部分
        comment_cnt.click()
        # 等待好评率加载完成
        comment_good_ratio = wait.until(
            EC.presence_of_element_located(
                (By.CSS_SELECTOR, "#comment .percent-con")))
        product['FavoriteRate'] = comment_good_ratio.text

        # 关闭当前标签
        driver.close()
        # 回到初始标签
        driver.switch_to.window(driver.window_handles[0])
        # 商品数量加一
        count = count + 1
        print(product)

def main():
    for i in range(1, 10):
        if i != 1:
            wait.until(
                EC.presence_of_all_elements_located(
                    (By.CSS_SELECTOR, "li.gl-item")
                )
            )
            # 模拟点击下一页按钮
            next_btn = driver.find_element_by_css_selector("a.pn-next")
            next_btn.click()
            # 判断翻页成功的标准是当前页面标签的文本内容是翻页后的页码
            wait.until(
                EC.text_to_be_present_in_element(
                    (By.CSS_SELECTOR, '#J_bottomPage a.curr'), str(i)
                )
            )
            print('-------------------------------正在翻页-------------------------------')
        print("\\n\\n\\n start page %s \\n\\n\\n" % i)
        crawl_page()

if __name__ == "__main__":
    main()

四、输出示例

运行上述代码,我们得到的部分输出如下:

{'index': 1, 'commit': '5万+', 'name': '程序员的自我修养:链接、装载与库(博文视点出品)', 'FavoriteRate': '98%'}
{'index': 2, 'commit': '5万+', 'name': '程序员修炼之道:通向务实的最高境界(第2版)(博文视点出品)', 'FavoriteRate': '98%'}
{'index': 3, 'commit': '0', 'name': '程序员面试笔记C/C++、算法、数据结构篇 杨峰,吴波,王楠 编著【正版图书 放心购买】', 'FavoriteRate': '100%'}
{'index': 4, 'commit': '2000+', 'name': '架构师修炼之道', 'FavoriteRate': '98%'}
{'index': 5, 'commit': '2000+', 'name': '程序员的数学第2版+程序员的数学2 概率统计+程序员的数学3 线性代数(套装共3册,京东)(图灵出品)', 'FavoriteRate': '99%'}
{'index': 6, 'commit': '20万+', 'name': '软技能 代码之外的生存指南(异步图书出品)', 'FavoriteRate': '99%'}
{'index': 7, 'commit': '20', 'name': 'Java编程思想(第4版)为首的Java程序员的案头书 从入门到精通 java核心技术', 'FavoriteRate': '50%'}
{'index': 8, 'commit': '5万+', 'name': '技术人修炼之道:从程序员到百万高管的72项技能(博文视点出品)', 'FavoriteRate': '99%'}
{'index': 9, 'commit': '5万+', 'name': '程序员修炼之道:从小工到专家(博文视点出品)', 'FavoriteRate': '98%'}
{'index': 10, 'commit': '10万+', 'name': '【程序员小灰】漫画算法:小灰的算法之旅(全彩)(博文视点出品)', 'FavoriteRate': '99%'}
{'index': 11, 'commit': '2000+', 'name': '【清华】C语言从入门到精通 (第4版) c语言程序设计电脑编程入门零基础自学c ++软件教程教材书籍', 'FavoriteRate': '97%'}
{'index': 12, 'commit': '10万+', 'name': '【程序员小灰】漫画算法2:小灰的算法进阶(签名版随机发放)(全彩) (博文视点出品)', 'FavoriteRate': '99%'}
{'index': 13, 'commit': '200+', 'name': '代码整洁之道Clean Code/程序员的职业素养 软件开发人员技能培训教程书籍 之 程序员的职业素养', 'FavoriteRate': '98%'}
{'index': 14, 'commit': '2万+', 'name': '程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)(博文视点出品)', 'FavoriteRate': '98%'}

其中,我们搜索的商品名称为“程序员”,若我们要搜索其他商品,只需要更改代码中第33行的数据即可,运行后的数据爬取都是自动化的。


有帮助可以点赞哦,谢谢大家的支持~

以上是关于利用Python自动搜索指定京东商品并爬取商品信息的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫实践——爬取京东商品信息

如何利用CSS选择器抓取京东网商品信息

如何用爬虫抓取京东商品评价

python制作爬虫爬取京东商品评论教程

Spring Boot集成WebMagic爬取京东商品信息

python爬虫:爬取京东商品信息