xpath helper 可以获取到但是打印不出来_使用selenium自动化获取京东商品

1、目标

目标url:https://search.jd.com/

使用Selenium,在京东网站搜索一商品,并逐页爬取商品信息(注意向下拖动鼠标,才能进一步显示所有商品),将信息汇总,并用pandas保存为csv文件

2、网

5543c434080e2a5bed75a856e2b9ad4d.png

站分析

首先我们打开url进行网站分析,发现京东网站存在一个细节,即商品需要下滚才可以显示,所以我们需要模拟下滚操作,这里我们需要用到驱动的execute_script方法来实现效果。

即,driver.execute_script('document.documentElement.scrollTop=10000')

该代码目的在于将网页下滚到最底部

但是不同商品的结构也不相同,所以具体情况具体分析

5f646247439f9231c37c13d2527df4a9.png

我们可以通过构造 URL 来获取每一个网页的内容,这里我们还是选择使用 selenium 模拟浏览器进行翻页的效果

下拉网页至底部可以发现有一个下一页的按钮,我们只需获取并点击该元素即可实现翻页,代码如下:

 next=driver.find_element_by_css_selector('#J_bottomPage > span.p-num > a.pn-next')

3、爬虫实现

首先我们使用驱动打开浏览器,具体操作代码如下:

5543c434080e2a5bed75a856e2b9ad4d.png

接下来我们需要打开url,相当于我们人为输入网址,可以看到驱动得到了输入的网址,在人为输入网址后,会弹出相应的网页,但在 selenium 也需要等待,这里等的是网页加载出来,只要此元素出来了,那网页就代表打开了,所以编写代码等待元素加载。

因为不同商品的结构不同,所以这里我们提取名字、价格、商品、评论的信息展开具体的分析,具体代码如下。

65c1a8834d46d611411a04575071868f.png

其中我们是在网站下找到所有的商品框架进行所有的elements获取,得到的是得到的是很多的数组,这个和lxmlxpath爬取返回的多个列表是一个道理,然后我们再做遍历就好了。

我们通过对HTML源码检查可以发现商品名的xpath如下:

//*[@id="J_goodsList"]/ul/li[36]/div/div[3]/a

b985aa77c5701c8b6bdd86a86123c242.png

商品介绍的xpath如下:

//*[@id="J_AD_2655595"]

1ec26430f3584fd57c707dd2cce3d4d4.png

商品价格如下:

//*[@id="J_goodsList"]/ul/li[38]/div/div[2]/strong

796b3edbbe15146e4e34e07581f5c161.png

爬取数据形式如下:

b9536bb81d2ad68c6004b06fa04cdf21.png

代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time
url="https://www.jd.com"
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id('key').send_keys('三只松鼠')
driver.find_element_by_css_selector('#search > div > div.form > button').click()
# pages = eval(driver.find_element_by_css_selector('#J_bottomPage > span.p-skip > em:nth-child(1) > b').text)
# count = 0
names=[]
prices=[]
comments=[]
shopnames=[]
while True:
    #等待所有商品显示完成
    WebDriverWait(driver, 1000).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'gl-item')))
    driver.execute_script('document.documentElement.scrollTop=10000')
    lis = driver.find_elements_by_class_name('gl-item')
    try:
        count+=1
        for li in lis:
            names.append(li.find_element_by_xpath('.//div[@class="p-name p-name-type-2"]//em').text.replace('n',''))    # 名字
            prices.append(li.find_element_by_xpath('.//div[@class="p-price"]//i').text)                 # 价格
            comments.append(li.find_elements_by_xpath('.//div[@class="p-commit"]//a')[0].text)          # 评论数
            shopnames.append(li.find_elements_by_class_name('J_im_icon')[0].text)                       # 商铺名字
    except:
        continue
    next=driver.find_element_by_xpath('//div[@class="pn-next"]')
    if next==[]:
        break
    else:
        next.click()

欢迎大家加入人工智能圈参与交流

人工智能学习圈 - 知乎​www.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值