1.先附上效果图(我偷懒只爬了4页)

 2.京东的网址https://www.jd.com/

3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式

options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
#不加载图片
browser = webdriver.Chrome(options=options)
wait =WebDriverWait(browser,50)#设置等待时间
url = 'https://www.jd.com/'
data_list = []#设置全局变量用来存储数据
keyword="python爬虫"#关键词

4.先找到搜索框并用selenium模拟点击(这里发现京东不需要登录就能看到商品信息)

def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) #等到搜索框加载出来
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
)#等到搜索按钮可以被点击
input[0].send_keys(keyword)#向搜索框内输入关键词
submit.click()#点击
total = wait.until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')
)
)#记录一下总页码,等到总页码加载出来
html = browser.page_source#获取网页信息
prase_html(html)#调用提取数据的函数(后面才写到)
return total[0].text
except TimeoutError:
search()

5.进入了第一页,先写好翻页的函数,需要滑动到底部才能加载后30个商品,总共有60个商品

def next_page(page_number):
try:
# 滑动到底部
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(random.randint(1, 3))#设置随机延迟
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
)#翻页按钮
button.click()# 翻页动作
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
)#等到30个商品都加载出来
# 滑动到底部,加载出后三十个货物信息
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)#等到60个商品都加载出来
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number))
)# 判断翻页成功,高亮的按钮数字与设置的页码一样
html = browser.page_source#获取网页信息
prase_html(html)#调用提取数据的函数
except TimeoutError:
return next_page(page_number)

6.能正常翻页就简单很多了,开始抽取需要的商品信息,搜索不同的关键词,页面的布局会有变化,需要重新写定位商品信息

def prase_html(html):
html = etree.HTML(html)
# 开始提取信息,找到ul标签下的全部li标签
try:
lis = browser.find_elements_by_class_name('gl-item')
# 遍历
for li in lis:
# 名字
title = li.find_element_by_xpath('.//div[@class="p-name p-name-type-2"]//em').text
# 价格
price = li.find_element_by_xpath('.//div[@class="p-price"]//i').text
# 评论数
comment = li.find_elements_by_xpath('.//div[@class="p-commit"]//a')
# 商铺名字
shop_name = li.find_elements_by_xpath('.//div[@class="p-shop"]//a')
if comment:
comment = comment[0].text
else:
comment = None
if shop_name:
shop_name = shop_name[0].text
else:
shop_name = None
data_dict ={}#写入字典
data_dict["title"] = title
data_dict["price"] = price
data_dict["shop_name"] = shop_name
data_dict["comment"] = comment
print(data_dict)
data_list.append(data_dict)#写入全局变量
except TimeoutError:
prase_html(html)

7.存储方法

def save_html():
content = json.dumps(data_list, ensure_ascii=False, indent=2)
#把全局变量转化为json数据
with open("jingdong.json", "a+", encoding="utf-8") as f:
f.write(content)
print("json文件写入成功") with open('jingdong.csv', 'w', encoding='utf-8', newline='') as f:
# 表头
title = data_list[0].keys()
# 声明writer
writer = csv.DictWriter(f, title)
# 写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
print('csv文件写入完成')

8.开始调用  

def main():
print("第", 1, "页:")
total = int(search())
for i in range(2, 5):
# for i in range(2, total + 1):#想全爬的就用这个循环
time.sleep(random.randint(1, 3))#设置随机延迟
print("第", i, "页:")
next_page(i)
save_html() if __name__ == "__main__":
main()

 

9.附上完整代码

import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import random
import json
import csv
from lxml import etree options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
#不加载图片
browser = webdriver.Chrome(options=options)
wait =WebDriverWait(browser,50)#设置等待时间
url = 'https://www.jd.com/'
data_list= []#设置全局变量用来存储数据
keyword ="python爬虫"#关键词 def search():
browser.get('https://www.jd.com/')
try:
input = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))
) #等到搜索框加载出来
submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))
)#等到搜索按钮可以被点击
input[0].send_keys(keyword)#向搜索框内输入关键词
submit.click()#点击
total = wait.until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')
)
)#记录一下总页码,等到总页码加载出来
# # 滑动到底部,加载出后三十个货物信息
# browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# wait.until(
# EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
# )
html = browser.page_source#获取网页信息
prase_html(html)#调用提取数据的函数
return total[0].text#返回总页数
except TimeoutError:
search() def next_page(page_number):
try:
# 滑动到底部
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(random.randint(1, 3))#设置随机延迟
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
)#翻页按钮
button.click()# 翻页动作
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
)#等到30个商品都加载出来
# 滑动到底部,加载出后三十个货物信息
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)#等到60个商品都加载出来
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number))
)# 判断翻页成功,高亮的按钮数字与设置的页码一样
html = browser.page_source#获取网页信息
prase_html(html)#调用提取数据的函数
except TimeoutError:
return next_page(page_number) def prase_html(html):
html = etree.HTML(html)
# 开始提取信息,找到ul标签下的全部li标签
try:
lis = browser.find_elements_by_class_name('gl-item')
# 遍历
for li in lis:
# 名字
title = li.find_element_by_xpath('.//div[@class="p-name p-name-type-2"]//em').text
# 价格
price = li.find_element_by_xpath('.//div[@class="p-price"]//i').text
# 评论数
comment = li.find_elements_by_xpath('.//div[@class="p-commit"]//a')
# 商铺名字
shop_name = li.find_elements_by_xpath('.//div[@class="p-shop"]//a')
if comment:
comment = comment[0].text
else:
comment = None
if shop_name:
shop_name = shop_name[0].text
else:
shop_name = None
data_dict ={}#写入字典
data_dict["title"] = title
data_dict["price"] = price
data_dict["shop_name"] = shop_name
data_dict["comment"] = comment
print(data_dict)
data_list.append(data_dict)#写入全局变量
except TimeoutError:
prase_html(html) def save_html():
content = json.dumps(data_list, ensure_ascii=False, indent=2)
#把全局变量转化为json数据
with open("jingdong1.json", "a+", encoding="utf-8") as f:
f.write(content)
print("json文件写入成功") with open('jingdong1.csv', 'w', encoding='utf-8', newline='') as f:
# 表头
title = data_list[0].keys()
# 声明writer
writer = csv.DictWriter(f, title)
# 写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
print('csv文件写入完成') def main():
print("第", 1, "页:")
total = int(search())
for i in range(2, 5):
# for i in range(2, total + 1):
time.sleep(random.randint(1, 3)) # 设置随机延迟
print("第", i, "页:")
next_page(i)
save_html() if __name__ == "__main__":
main()

  最后再分享一些小福利

链接:https://pan.baidu.com/s/1sMxwTn7P2lhvzvWRwBjFrQ

提取码:kt2v

链接容易被举报过期,如果失效了就在这里领取吧

python爬虫——用selenium爬取京东商品信息的更多相关文章

  1. 爬虫之selenium爬取京东商品信息

    import json import time from selenium import webdriver """ 发送请求 1.1生成driver对象 2.1窗口最大 ...

  2. selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装

    今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...

  3. 利用selenium爬取京东商品信息存放到mongodb

    利用selenium爬取京东商城的商品信息思路: 1.首先进入京东的搜索页面,分析搜索页面信息可以得到路由结构 2.根据页面信息可以看到京东在搜索页面使用了懒加载,所以为了解决这个问题,使用递归.等待 ...

  4. 爬虫系列(十三) 用selenium爬取京东商品

    这篇文章,我们将通过 selenium 模拟用户使用浏览器的行为,爬取京东商品信息,还是先放上最终的效果图: 1.网页分析 (1)初步分析 原本博主打算写一个能够爬取所有商品信息的爬虫,可是在分析过程 ...

  5. Python爬虫-爬取京东商品信息-按给定关键词

    目的:按给定关键词爬取京东商品信息,并保存至mongodb. 字段:title.url.store.store_url.item_id.price.comments_count.comments 工具 ...

  6. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  7. 爬虫—Selenium爬取JD商品信息

    一,抓取分析 本次目标是爬取京东商品信息,包括商品的图片,名称,价格,评价人数,店铺名称.抓取入口就是京东的搜索页面,这个链接可以通过直接构造参数访问https://search.jd.com/Sea ...

  8. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  9. 八个commit让你学会爬取京东商品信息

    我发现现在不用标题党的套路还真不好吸引人,最近在做相关的事情,从而稍微总结出了一些文字.我一贯的想法吧,虽然才疏学浅,但是还是希望能帮助需要的人.博客园实在不适合这种章回体的文章.这里,我贴出正文的前 ...

随机推荐

  1. .Net平台技术栈?不止于此

    首先援引一名工友几年前的文章:http://csharper.blog.51cto.com/3052247/1330022,结合当前微软技术领域及平台工具现状,文章有增改. .NET是个很大.很宽.很 ...

  2. NKOJ 1353 图形面积

    时间限制 : 10000 MS   空间限制 : 65536 KB 问题描述 桌面上放了N个矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积.(矩形的边都与坐标轴平行) 输入格式 输入第一 ...

  3. new FileReader()

    一.调用FileReader对象的方法 方法名 参数 描述abort none 中断读取readAsBinaryString file 将文件读取为二进制码readAsDataURL file 将文件 ...

  4. Spring 中使用 WebSocket 笔记

    编写 WebSocket 消息处理类,比较简单的方式就是直接继承AbstractWebSocketHandler,并覆写其中的处理方法,下面为一个简单的 demo public class WebSo ...

  5. PTA | 1010 一元多项式求导 (25分)

    设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: ...

  6. IO 模型知多少

    1. 引言 同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题.比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型,分 ...

  7. (js描述的)数据结构[集合结构](6)

    (js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1 ...

  8. Flask 入门(五)

    jinjia2模板传参 在html中调用python代码中传入的参数规则己经在上文中说明白了,下面,我们来实用一下: 1.编辑index.py中的代码如下: from flask import Fla ...

  9. 28.4 Calendar 日历

    /* * Calendar:日历,提供了一些操作年月日时的方法 * 获取 * 修改 * 添加 */ public class CalendarDemo { public static void mai ...

  10. 22.3 Extends 构造方法的执行顺序

    /** 1.有子父类继承关系的类中,创建父类对象未调用,执行父类无参构造* 2.有子父类继承关系的类中,创建子类对象未调用,执行顺序:默认先调用 父类无参构造---子类无参构造* 在子类的构造方法的第 ...