1、目标
目标url:https://search.jd.com/
使用Selenium,在京东网站搜索一商品,并逐页爬取商品信息(注意向下拖动鼠标,才能进一步显示所有商品),将信息汇总,并用pandas保存为csv文件
2、网
站分析
首先我们打开url进行网站分析,发现京东网站存在一个细节,即商品需要下滚才可以显示,所以我们需要模拟下滚操作,这里我们需要用到驱动的execute_script方法来实现效果。
即,driver.execute_script('document.documentElement.scrollTop=10000')
该代码目的在于将网页下滚到最底部
但是不同商品的结构也不相同,所以具体情况具体分析
我们可以通过构造 URL 来获取每一个网页的内容,这里我们还是选择使用 selenium 模拟浏览器进行翻页的效果
下拉网页至底部可以发现有一个下一页的按钮,我们只需获取并点击该元素即可实现翻页,代码如下:
next=driver.find_element_by_css_selector('#J_bottomPage > span.p-num > a.pn-next')
3、爬虫实现
首先我们使用驱动打开浏览器,具体操作代码如下:
接下来我们需要打开url,相当于我们人为输入网址,可以看到驱动得到了输入的网址,在人为输入网址后,会弹出相应的网页,但在 selenium 也需要等待,这里等的是网页加载出来,只要此元素出来了,那网页就代表打开了,所以编写代码等待元素加载。
因为不同商品的结构不同,所以这里我们提取名字、价格、商品、评论的信息展开具体的分析,具体代码如下。
其中我们是在网站下找到所有的商品框架进行所有的elements获取,得到的是得到的是很多的数组,这个和lxmlxpath爬取返回的多个列表是一个道理,然后我们再做遍历就好了。
我们通过对HTML源码检查可以发现商品名的xpath如下:
//*[@id="J_goodsList"]/ul/li[36]/div/div[3]/a
商品介绍的xpath如下:
//*[@id="J_AD_2655595"]
商品价格如下:
//*[@id="J_goodsList"]/ul/li[38]/div/div[2]/strong
爬取数据形式如下:
代码如下:
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