selenium+phantomjs爬取京东商品信息
selenium+phantomjs爬取京东商品信息
今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618.html
打开 https://www.jd.com/ 首先不需要登陆就可搜索,淘宝不一样,所以淘宝我还没试过。
开启F12 定位一下搜索框和搜索按钮
input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
input.send_keys(goods)
submit.click()
接下来我们要的是按销量排名,那就要点击这个 onclick事件

发现使用click()还是无法进行点击,因为这是个js跳转 所以得用下面代码
submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
browser.execute_script("$(arguments[0]).click()", submit_js)
接下来就还是检测是否加载了下面的元素

开始分析各项 怎么获取里面的数据就不说了

这时候可能爬的不完全,因为京东是动态加载的 需要去模拟一下把页面拉到底部
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
按照这样子进行循环遍历,把每一个值添加到goods_data列表里去,但也保证不了可能会出现找不到对象的属性,抛出AttributeError异常,这里已经尝试过了,所以写下这个异常处理!
然后获取完一页就下一页,然后得写个代码来检查是否跳转到指定页面
WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))
再获取每一页当前页面源码进行解析提取内容,保存到 goods_data 列表中,最后写入xls文件!
Tips:里面sleep 时间视情况而定,太快会导致获取不全,但如果网速快能弥补这一点,目前测试情况来看是这样子的问题!
附上代码:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import xlwt
import time
goods = input('请输入你要爬取的商品名称:')
goods_data = []
browser = webdriver.PhantomJS()
WAIT = WebDriverWait(browser,10)
browser.set_window_size(1000,600)
def seach(goods):
try:
print('开始自动化爬取京东商品信息......')
browser.get('https://www.jd.com/')
input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
input.send_keys(goods)
submit.click()
submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
browser.execute_script("$(arguments[0]).click()", submit_js)
time.sleep(1)
get_source()
except TimeoutException:
return seach(goods)
def get_source():
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(1)
WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul')))
html = browser.page_source
soup = BeautifulSoup(html,'lxml')
save_data(soup)
def save_data(soup):
html = soup.find_all(class_='gl-i-wrap')
for item in html:
try:
goods_name = item.find(class_='p-name').find('em').text
goods_link = 'https:' + item.find(class_='p-img').find('a').get('href')
goods_evaluate = item.find(class_='p-commit').text
goods_store = item.find(class_='curr-shop').text
goods_money = item.find(class_='p-price').find('i').text
print(('爬取: ' + goods_name))
goods_data.append([goods_name,goods_link,goods_evaluate,goods_store,goods_money])
except AttributeError:
pass
def next_page(page_num):
try:
print('获取下一页数据')
next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.pn-next')))
next_btn.click()
WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))
get_source()
except TimeoutException:
browser.refresh()
return next_page(page_num)
def save_to_excel():
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet(goods, cell_overwrite_ok=True)
sheet.col(0).width = 256 * 80
sheet.col(1).width = 256 * 40
sheet.col(2).width = 256 * 20
sheet.col(3).width = 256 * 25
sheet.col(4).width = 256 * 20
sheet.write(0, 0, '商品名称')
sheet.write(0, 1, '商品链接')
sheet.write(0, 2, '评价人数')
sheet.write(0, 3, '店名')
sheet.write(0, 4, '价格')
for item in goods_data:
n = goods_data.index(item) + 1
sheet.write(n, 0, item[0])
sheet.write(n, 1, item[1])
sheet.write(n, 2, item[2])
sheet.write(n, 3, item[3])
sheet.write(n, 4, item[4])
book.save(str(goods) + u'.xls')
def main():
try:
seach(goods)
for i in range(2,11):
next_page(i)
print('-'*50)
print('数据爬取完毕,正在写入xls.....')
save_to_excel()
print('写入成功!!!')
finally:
browser.close()
browser.quit()
if __name__ == '__main__':
main()
selenium+phantomjs爬取京东商品信息的更多相关文章
- selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装
今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...
- Python爬虫-爬取京东商品信息-按给定关键词
目的:按给定关键词爬取京东商品信息,并保存至mongodb. 字段:title.url.store.store_url.item_id.price.comments_count.comments 工具 ...
- 利用selenium爬取京东商品信息存放到mongodb
利用selenium爬取京东商城的商品信息思路: 1.首先进入京东的搜索页面,分析搜索页面信息可以得到路由结构 2.根据页面信息可以看到京东在搜索页面使用了懒加载,所以为了解决这个问题,使用递归.等待 ...
- 八个commit让你学会爬取京东商品信息
我发现现在不用标题党的套路还真不好吸引人,最近在做相关的事情,从而稍微总结出了一些文字.我一贯的想法吧,虽然才疏学浅,但是还是希望能帮助需要的人.博客园实在不适合这种章回体的文章.这里,我贴出正文的前 ...
- 正则爬取京东商品信息并打包成.exe可执行程序。
本文爬取内容,输入要搜索的关键字可自动爬取京东网站上相关商品的店铺名称,商品名称,价格,爬取100页(共100页) 代码如下: import requests import re # 请求头 head ...
- 正则爬取京东商品信息并打包成.exe可执行程序
本文爬取内容,输入要搜索的关键字可自动爬取京东网站上相关商品的店铺名称,商品名称,价格,爬取100页(共100页) 代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...
- python爬虫——用selenium爬取京东商品信息
1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...
- 爬虫之selenium爬取京东商品信息
import json import time from selenium import webdriver """ 发送请求 1.1生成driver对象 2.1窗口最大 ...
- Java爬虫爬取京东商品信息
以下内容转载于<https://www.cnblogs.com/zhuangbiing/p/9194994.html>,在此仅供学习借鉴只用. Maven地址 <dependency ...
随机推荐
- hdu5709Claris Loves Painting主席树 奇妙的DFS序
先不考虑层数限制 一棵树上每个点有个颜色,问一棵子树的颜色数 感觉简单多了是吧 考虑每个点的贡献:自己到根的路径上的一个包含自己的连续段 观察最顶端的点的父亲: 它满足有了额外的同色孩子(咦) 这一条 ...
- 使用Zeppelin时出现sh interpreter not found错误的解决办法(图文详解)
不多说,直接上干货! 问题详解 http://192.168.80.145:8099/#/notebook/2CSV2VT5S 相关博客是 Zeppelin的入门使用系列之使用Zeppelin运行sh ...
- 使用一条sql语句查询多表的总数
SELECT sum(列名1) 列名1,sum(列名2) 列名2,sum(列名3) 列名3 FROM ( SELECT count(*) 列名1, 列名2, 列名3 FROM 表1 -- WHERE ...
- 2017年2月28日-----------乱码新手自学.net 之特性与验证
现在看asp.net MVC5自学已经到了第六章:数据注解与验证. 话得从以前看MVC music store(音乐商店项目)的源码说起, 最初看music store源码完全就是一脸懵逼,整个程序, ...
- 下一代的前端构建工具:parcel打包react
1. parcel很受欢迎,webpack太慢了,试试Parcel下一代的前端构建工具 2.Parcel很快,但缺少好多插件,没有base64,没有办法拆分打包文件.... 3.总结:适合小项目 4. ...
- [Java][Web] Servlet中转发和重定向比较
Servlet中页面跳转的两种方式 请求转发 使用requestDispatcher对象 request.getRequestDispatcher("path").forward( ...
- 20170405JDBC数据查询
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- springmvc学习经验
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...
- 数据库迁移后报错提示MySQL Error:Can''t find file errno: 13 - Permission denied的解决方法
用户MYSQL数据库迁移后,遇到报错MySQL Error:Can't find file (errno: 13 - Permission denied)使用以下指令重新设置所有者和权限,依然不能解决 ...
- 会写网页 就会写手机APP #2-- 范例修正 , Hybrid Mobile Apps for ASP.NET Developers (Apache Cordova)
原文出处:会写网页 就会写手机APP #2-- 范例修正 , Hybrid Mobile Apps for ASP.NET Developers (Apache Cordova) 这是我的文章备份 ...