首页 > 其他分享 >03 Selenium 实战 爬取京东商品

03 Selenium 实战 爬取京东商品

时间:2023-05-13 15:01:03浏览次数:31  
标签:03 goods Selenium self driver li 爬取 element find

Selenium和Requests都是Python中常用的网络请求库,但是Selenium获取数据的方式与Requests有些差别,
Selenium可以直接模拟浏览器操作,获取数据更加方便,但是相应的速度也会慢一些。

下面是使用selenium获取京东商品数据的示例代码:

首先,导入selenium库中的webdriver模块,然后创建一个Edge浏览器对象

from selenium import webdriver

driver = webdriver.Edge()

接下来,使用get()方法请求网页并全屏打开,这里以京东首页为例:

driver.get("https://www.jd.com")
driver.maximize_window()

然后,使用find_element_by_xpath()方法获取搜索框的节点,再使用send_keys()方法输入要搜索的商品名称:

driver.find_element_by_xpath('//input[@id="key"]').send_keys('python')

接下来,使用click()方法点击搜索按钮:

driver.find_element_by_class_name('button').click()

然后,使用find_element_by_xpath()方法获取商品列表的节点,再获取所有商品的节点,
接下来,使用for循环遍历所有商品的节点,然后获取商品的名称、价格、链接等信息:
由于京东中有一个触底动态加载的功能,所以需要先将页面滚动到底部,等商品加载完成后再获取商品信息:

driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
lis = driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
for li in lis:
    goods['sku'] = li.get_attribute('data-sku')  # 获取商品的sku
    goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
    goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
    goods['commit'] = li.find_element_by_class_name('p-commit').text # 获取商品的评论数
    goods['shop'] = li.find_element_by_class_name('p-shop').text # 获取商品的店铺
    print(goods)

最后,使用quit()方法关闭浏览器:

driver.quit()

完整代码如下:

from selenium import webdriver

driver = webdriver.Edge()
driver.get("https://www.jd.com")
driver.maximize_window()
driver.find_element_by_xpath('//input[@id="key"]').send_keys('python')
driver.find_element_by_class_name('button').click()
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
lis = driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
for li in lis:
    goods = {}
    goods['sku'] = li.get_attribute('data-sku')  # 获取商品的sku
    goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
    goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
    goods['commit'] = li.find_element_by_class_name('p-commit').text # 获取商品的评论数
    goods['shop'] = li.find_element_by_class_name('p-shop').text # 获取商品的店铺
    print(goods)
driver.quit()

运行结果如下:

{'sku': '10037672406859', 'title': 'Python编程实战100例 (微课视频版)chatg...'}
{'sku': '11993134', 'title': 'Python编程 从入门到实践 第3版(图灵出品) Pyth...'}
{'sku': '12842874', 'title': 'Python编程三剑客新版:Python编程从入门到实践第...'}
{'sku': '12353915', 'title': '零基础学Python(Python3.10全新升级)(基础入门 ...}

下面尝试用面向对象的方式来实现上面的代码:

from selenium import webdriver
import time

class JdSpider(object):
    def __init__(self):
        self.driver = webdriver.Edge()
        self.url = 'https://www.jd.com'

    def scroll_page_to_bottom(self):
        self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

    def get_page(self):
        self.driver.get(self.url)
        self.driver.maximize_window()
        self.driver.find_element_by_id('key').send_keys('python')
        self.driver.find_element_by_class_name('button').click()
        self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

        time.sleep(3)
        self.scroll_page_to_bottom()
        time.sleep(3)
        self.parse_page()

    def parse_page(self):
        lis = self.driver.find_elements_by_xpath('//ul[@class="gl-warp clearfix"]/li')
        for li in lis:
            goods = {}
            goods['sku'] = li.get_attribute('data-sku')  # 获取商品的sku
            goods['img'] = li.find_element_by_class_name('p-img').get_attribute('src') # 获取商品的图
            goods['title'] = li.find_element_by_class_name('p-name').text # 获取商品的标题
            goods['price'] = li.find_element_by_class_name('p-price').text # 获取商品的价格
            print(goods)

    def main(self):
        self.get_page()
        self.driver.quit()

if __name__ == '__main__':
    jd = JdSpider()
    jd.main()

标签:03,goods,Selenium,self,driver,li,爬取,element,find
From: https://www.cnblogs.com/primice/p/17397404.html

相关文章

  • G034-OP-COA-OPEN-04 OpenStack 发放云主机(图形化)
    1您需要了解本篇采用OpenStack图形化界面进行操作模拟弹性公网EIP地址段规划:采用和控制节点、计算节点同一网段即可,如:192.168.100.0/24模拟云主机私网IP地址段规划:自定义网段,如:192.168.88.0/24RedHatOpenStack环境可参考下方G033博文进行搭建文章中所提到的公网......
  • 03 加载模型
    一、AssimpAssimp可以将模型导成如下的格式:首先,该模型被打包成一个scene对象,是aiScene类型的,一般是导出为指向常量的指针。在scene中保存着三个对象:第一个是一个aiNode类型的指针,即根节点scene->mRootNode。第二个是一个aiMesh*类型的数组,即scene->mMeshes。保存着所有mesh......
  • 【五期邹昱夫】CCF-A(NeurIPS'21)Gradient inversion with generative image prior
    "JeonJ,LeeK,OhS,etal.Gradientinversionwithgenerativeimageprior[J].Advancesinneuralinformationprocessingsystems,2021,34:29898-29908."  本文提出了一种基于预训练模型的梯度反演方法。该方法通过使用潜在空间搜索优化维度较低的特征向量,减少......
  • 剑指 Offer 03. 数组中重复的数字
    剑指Offer03.数组中重复的数字题目描述找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。2=n<=100000解法1.先进行......
  • 1103.模版变量及模版过滤器
    一、模版路径总结在配置文件setting.py文件中找到TEMPLATES进行文件路径配置:1.DIRS定义一个目录列表,模板引擎按流标顺序搜索这些目录以查询模板源文件。将templates放在主项目目录下:2.APP_DIRS告诉模板引擎是否应该进入每个已安装的应用中查找模板,值为True则模板会去安装了......
  • 代码随想录算法训练营第三天|203.移除链表元素 、707.设计链表 、206.反转链表
    一.链表基础1.最后一个节点的指针域指向null(空指针的意思)。2.链表在内存中不是连续分布的。3.链表的长度可以是不固定的,并且可以动态增删,适合数据量不固定,频繁增删,较少查询的场景。1#链表节点的定义2classListNode:3def__init__(self,val,next=None):4......
  • fatal: detected dubious ownership in repository at 'D:/xxx'
     git的出现这个错误: 执行下面代码即可:gitconfig--global--addsafe.directory"*"; ......
  • target method '%s' found on bean target class '%s', but not found in any interf
    targetmethod'%s'foundonbeantargetclass'%s',butnotfoundinanyinterface(s)forbeanJDKproxy.Eitherpullthemethoduptoaninterfaceorswitchtosubclass(CGLIB)proxiesbysettingproxy-target-class/proxyTargetClass......
  • Mitsubishi/三菱SFC顺控大型程序模板 1:三菱Q03UDE,500个IO点(5个输
    Mitsubishi/三菱SFC顺控大型程序模板1:三菱Q03UDE,500个IO点(5个输入模块、3个输出模块),带16轴伺服(由两个QD70P8控制)。2:超完美威纶触摸屏画面。3:全新的编程思维,即使是初学者也可以了解。4:做大型程序,完美的简化程序。5:适合没有做大型设备的工程师,对比较资深的工程师也有很大的......
  • 彻底删除IDEA 2022.03.03
     rm-rf/Users/XXX/Library/Preferences/jetbrains.jetprofile.asset.plistrm-rf/Users/XXX/Library/Preferences/com.jetbrains.*rm-rf/Users/XXX/Library/Caches/JetBrainsrm-rf/Users/XXX/Library/Application\Support/JetBrainsrm-rf/Users/XXX/Library/Logs/......