利用Python自动搜索指定京东商品并爬取商品信息
Posted Z.Q.Feng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python自动搜索指定京东商品并爬取商品信息相关的知识,希望对你有一定的参考价值。
文章目录
前言
环境: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自动搜索指定京东商品并爬取商品信息的主要内容,如果未能解决你的问题,请参考以下文章