python 面向对象利用selenium【获取某东商品信息】

news2024/9/23 19:24:41

用python程序和谷歌selenium插件获取某东商品详细信息【商品名称、商品简介,超链接】

利用selenium自动化程序 中的css页面结构索取来获取详细数据

关于谷歌selenium的安装方法和使用方法

第一步检查自己谷歌浏览器的版本

1.1 找到设置:并鼠标点击进入

1.2进入设置选项后,下滑到最底部找到“关于Chrome”鼠标点击进入

1.3查看谷歌浏览器的版本号

第二步:进入selenium谷歌驱动网址下载对应版本号的驱动

(不要过分追求一致性,只要110.05481.xxx)xxx不一致没关系

查找对应操作系统的版本(一般是win32.zip,除非你会用虚拟机,或者你用的是iphone操作系统可以选择对应的)我们的电脑不是64位操作系统吗为什么安装32位的,这我也不知道,反正大家都是这样弄的。

点击下载:

将下载完成后的“chromedriver.exe“运行文件 复制到python运行的直系文件中

在python的第三方库中安装好selenium

安装第三方库或者模块的方法有两种:

第一种:pycharm

第二种:命令提示符cmd的方式输入 pip install selenium

CMD全称command。即命令提示符,是在OS / 2 , Windows为基础的操作系统下的DOS 方式

第三部分代码详解:

3.1在pycharm中导入第三方模块(selenium)

时间模块
import time
网页请求模块
import requests
新版本selenium库的导入方法
from selenium.webdriver.common.by import By

3.2主函数方法的调用 :

if __name__ == '__main__':
    spider('https://www.jd.com/?',keyword='python数据结构')

3.3

spider()方法的执行模块

作用向网页发起请求,并且利用selenium方法将谷歌浏览其控制起来

def spider(url,keyword):  #构造一个方法
    # 通过运行程序打开浏览器
    open_Chrome = webdriver.Chrome()
    open_Chrome.get(url=url)
    #open_Chrome.implicitly_wait(3) #隐式等待
    input_date = open_Chrome.find_element(by=By.ID, value='key')
    input_date.send_keys(keyword)
     # 这种写法是不被允许的,input_date = open_Chrome.find_element(by=By.ID,value='key').send_keys(keyword)
    #不是input_date = open_Chrome.find_element(by=By.ID,value='').send_keys()这种方法不被允许,而是,要写都写成这样不要一个写成这样一个有进行方法的调用
    #比如:
    input_date.send_keys(Keys.ENTER) #用Keys中的点击方法
    open_Chrome.implicitly_wait(10)
    drop_down(open_Chrome)
    get_gods(open_Chrome)

执行结果:

这都是程序自己干的我只是运行了一下程序

3.2让自动化程序控制谷歌浏览器在商品页界面最右侧的黑灰色滑块进行滑动

def drop_down(open_Chrome):
    for x  in range(1,12,2):
        time.sleep(1)
        j = x / 9
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        open_Chrome.execute_script(js)
    buttons(open_Chrome)

3.3当前数据页面解析:

使用的方法是:通过css选择器来定位标签元素。

使用方法:find_elements(By.####,'.xxxxx') ####表示使用那种方法,xxxxx表示该页面css的值

def get_gods(open_Chrome):
    #css选择器中#键表示id选择器,.表示class选择器
    #labels 获取的是每一个商品数据
    labels = open_Chrome.find_elements(By.CSS_SELECTOR,'.goods-list-v2 .gl-item')  #find_elements 获取的是多个数据,find_element只能获取一个
    print(labels)
    for label in labels:
         em_txt= label.find_element(By.CSS_SELECTOR,'.p-name em').text
         money_txt = label.find_element(By.CSS_SELECTOR,'.p-price strong i').text
         Release_txt = label.find_element(By.CSS_SELECTOR, '.hd-shopname').text
         hyper_link = label.find_element(By.CSS_SELECTOR,'.p-name a').get_attribute('href') #get_attribute 获取标签的属性
         print(em_txt,f"{money_txt}:元",Release_txt,hyper_link)

关于selenium页面解析的其他方法,有很多那个效率更高,比较简单就去使用那个:具体方法要去学习,如何简单调用我将写在下方

新版本 find_element()的使用方法

selenium的页面元素定位方法find_element

感谢这两位作者提供关于selenium的简介和最新使用方法,因为selenium已经更新了,如果在pcharm下载的selenium是2.0以上版本的要使用最新方法,如何进行简单调用请通过上方的连接地址进行访问阅读

3.4 进行多页面爬取(一个页面肯定不够)

这是一个自动点击“下一页”的按钮,click()就是自动点击的方法

def buttons(open_Chrome):
    button = open_Chrome.find_element(By.CSS_SELECTOR,'.page .p-num .pn-next em')
    button.click()
    time.sleep(2)
    get_gods(open_Chrome)

关于我为什么要加上下滑的方法,大家可以去某东网页去感受一下,现在某东将两张页面合并在了一起,本质上是一张页面,但是又包含了两页信息,所以我们需要通过滑块下滑的方法将完整的一页信息加载出来,要不然拿到的数据不完整。

完整代码:

import time
import requests
from selenium.webdriver.common.by import By
from selenium import webdriver
#这种写法已经被舍弃掉了
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys #模拟键盘点击
#打开浏览器
# 2.登录京东
#打开网页
def spider(url,keyword):  #构造一个方法
    # 通过运行程序打开浏览器
    open_Chrome = webdriver.Chrome()
    open_Chrome.get(url=url)
    #open_Chrome.implicitly_wait(3) #隐式等待
    input_date = open_Chrome.find_element(by=By.ID, value='key')
    input_date.send_keys(keyword)
     # 这种写法是不被允许的,input_date = open_Chrome.find_element(by=By.ID,value='key').send_keys(keyword)
    #不是input_date = open_Chrome.find_element(by=By.ID,value='').send_keys()这种方法不被允许,而是,要写都写成这样不要一个写成这样一个有进行方法的调用
    #比如:
    '''
    input_date = open_Chrome.find_element(by=By.ID, value='key').send_keys(keyword)
    input_date.send_keys(Keys.ENTER)
    '''
    input_date.send_keys(Keys.ENTER) #用Keys中的点击方法
    open_Chrome.implicitly_wait(10)
    drop_down(open_Chrome)
    get_gods(open_Chrome)
#这个自定义的方法就是让其右边的滑轮自动滑动
def drop_down(open_Chrome):
    for x  in range(1,12,2):
        time.sleep(1)
        j = x / 9
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        open_Chrome.execute_script(js)
    buttons(open_Chrome)
def buttons(open_Chrome):
    button = open_Chrome.find_element(By.CSS_SELECTOR,'.page .p-num .pn-next em')
    button.click()
    time.sleep(2)
    get_gods(open_Chrome)
def get_gods(open_Chrome):
    #css选择器中#键表示id选择器,.表示class选择器
    #labels 获取的是每一个商品数据
    labels = open_Chrome.find_elements(By.CSS_SELECTOR,'.goods-list-v2 .gl-item')  #find_elements 获取的是多个数据,find_element只能获取一个
    print(labels)
    for label in labels:
         em_txt= label.find_element(By.CSS_SELECTOR,'.p-name em').text
         money_txt = label.find_element(By.CSS_SELECTOR,'.p-price strong i').text
         Release_txt = label.find_element(By.CSS_SELECTOR, '.hd-shopname').text
         hyper_link = label.find_element(By.CSS_SELECTOR,'.p-name a').get_attribute('href') #get_attribute 获取标签的属性
         print(em_txt,f"{money_txt}:元",Release_txt,hyper_link)
    # for label in labels:
    #     name = label.find_element(By.XPATH,'./div[@class="gl-i-wrap"]//em/font/text()')
    #     print(name)

# input()



#主函数:方法调用
if __name__ == '__main__':
    spider('https://www.jd.com/?',keyword='python数据结构')

测试结果:

关于代码的解析太过于繁琐,我就不进行赘述了,大家哪里不懂可以留言私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序评估指标——NDCG和MAP

在搜索和推荐任务中,系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢? 例如,当我们检索【推荐排序】,网页返回了与推荐排序相关的链接列表。列表可能会是[A,B,C,G,D,E,F],也可能是[C,F,A,E,D],现在问题来了…

使用canvas写一个flappy bird小游戏

简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird(中文名:笨鸟先飞&am…

XSS注入进阶练习篇(一)XSS-LABS通关教程

XSS注入进阶练习篇1.常用标签整理2. XSS-LABS 练习2.1 level 1 无限制2.2 level 2 双引号闭合2.3 level 3 源码函数书写不全,单引号绕过2.4 level 4 无尖括号绕过2.5 level 5 a标签使用2.6 level 6 大小写绕过2.7 level 7 置空替换绕过2.8 level 8 URL编码绕过 - 重…

安全—07day

Tomcat AJP 文件包含漏洞(CVE-2020- 1938) 漏洞概述 Ghostcat(幽灵猫)是由长亭科技安全研究员发现的存在于Tomcat 中的安全漏洞,由于Tomcat AJP 协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含 Tomcat上所有…

Java岗面试题--Java并发(日积月累,每日三题)

目录面试题一:并行和并发有什么区别?面试题二:线程和进程的区别?追问:守护线程是什么?面试题三:创建线程的几种方式?1. 继承 Thread 类创建线程,重写 run() 方法2. 实现 …

详解垃圾回收算法,优缺点是什么?|金三银四系列

本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的,以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构,需要阅读请移步。本文主要…

Android 9.0系统源码_通知服务(二)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知,对于移动设备来说是很常见的一种功能需求,本篇文章我们将会结合Android9.0系统源码具体来分析一下,应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…

关于HDFS

目录 一、HDFS概述 二、HDFS架构与工作机制 三、HDFS的Shell操作 四、Hdfs的API操作 一、HDFS概述 HDFS:Hadoop Distributed File System;一种分布式文件管理系统,通过目录树定位文件。使用场景:一次写入,多次读出…

java 自定义注解

文章目录前言Annotation包自定义注解自定义注解示例参考文章:java 自定义注解 用处_java注解和自定义注解的简单使用参考文章:java中自定义注解的作用和写法前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十…

SpringAMQP消息队列(SpringBoot集成RabbitMQ)

一、初始配置1、导入maven坐标<!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2、yml配置spring:rabbitmq:host: 你的rabbitmq的ipport: …

4G模块DTU网关远程抄表方案(三):水表188协议

4G模块DTU网关远程抄表方案&#xff08;三&#xff09;&#xff1a;水气电表188协议 1 CTJ 188协议简介 CJ/T188协议规定了户用计量仪表(以下简称仪表)&#xff0c;包括水表、燃气表、热量表等仪表数据传输的基本原则&#xff0c;接口形式及物理性能、数据链路、数据标识及数…

目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

目标检测 回归损失函数1、Smooth L1 Loss2、 IoU Loss3、 GIoU Loss &#xff08;Generalized-IoU Loss&#xff09;4、 DIoU Loss &#xff08;Distance-IoU Loss&#xff09;5、 CIoU Loss &#xff08;Complete-IoU Loss&#xff09;总结&#xff1a;目标检测任务的损失函数…

【计算机网络】数据链路层(下)

文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…

1.1 硬件与micropython固件烧录及自编译固件

1.ESP32硬件和固件 淘宝搜ESP32模块,20-50元都有,自带usb口,即插即用. 固件下载地址:MicroPython - Python for microcontrollers 2.烧录方法 为简化入门难度,建议此处先使用带GUI的开发工具THonny,记得不是给你理发的tony老师. 烧录的入口是: 后期通过脚本一次型生成和烧…

[软件工程导论(第六版)]第3章 需求分析(课后习题详解)

文章目录1. 为什么要进行需求分析&#xff1f;通常对软件系统有哪些需求&#xff1f;2. 怎样与用户有效地沟通以获取用户的真实需求&#xff1f;3. 银行计算机储蓄系统的工作过程大致如下&#xff1a;储户填写的存款单或取款单由业务员输入系统&#xff0c;如果是存款则系统记录…

C语言经典编程题100例(81~100)

目录81、习题7-7 字符串替换82、习题8-10 输出学生成绩83、习题8-2 在数组中查找指定元素84、习题8-3 数组循环右移85、题8-9 分类统计各类字符个数86、习题9-2 计算两个复数之积87、习题9-6 按等级统计学生成绩88、习题11-1 输出月份英文名89、习题11-2 查找星期90、练习10-1 …

分享113个HTML娱乐休闲模板,总有一款适合您

分享113个HTML娱乐休闲模板&#xff0c;总有一款适合您 113个HTML娱乐休闲模板下载链接&#xff1a;https://pan.baidu.com/s/1aWYO2j2pSTjyqlQPHa0-Jw?pwdbium 提取码&#xff1a;bium Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 海上的沤鸟HTML网页模板…

(三十六)Vue解决Ajax跨域问题

文章目录环境准备vue的跨域问题vue跨域问题解决方案方式一方式二上一篇&#xff1a;&#xff08;三十五&#xff09;Vue之过渡与动画 环境准备 首先我们要借助axios发送Ajax&#xff0c;axios安装命令&#xff1a;npm i axios 其次准备两台服务器&#xff0c;这里使用node.j…

Linux | 网络通信 | 序列化和反序列化的讲解与实现

文章目录为什么要序列化&#xff1f;协议的实现服务端与客户端代码实现为什么要序列化&#xff1f; 由于默认对齐数的不同&#xff0c;不同的平台对相同数据进行内存对齐后&#xff0c;可能得到不同的数据。如果直接将这些数据进行网络传输&#xff0c;对方很可能无法正确的获…

【数据结构】单链表的接口实现(附图解和源码)

单链表的接口实现&#xff08;附图解和源码&#xff09; 文章目录单链表的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、接口实现&#xff08;附图解源码&#xff09;1.开辟新空间2.头插数据3.头删数据4.打印整个单链表5.尾删数据6.查找单链表中的数据7…