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爬取京东商品信息的更多相关文章

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

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

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

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

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

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

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

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

  5. 正则爬取京东商品信息并打包成.exe可执行程序。

    本文爬取内容,输入要搜索的关键字可自动爬取京东网站上相关商品的店铺名称,商品名称,价格,爬取100页(共100页) 代码如下: import requests import re # 请求头 head ...

  6. 正则爬取京东商品信息并打包成.exe可执行程序

    本文爬取内容,输入要搜索的关键字可自动爬取京东网站上相关商品的店铺名称,商品名称,价格,爬取100页(共100页) 代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...

  7. python爬虫——用selenium爬取京东商品信息

    1.先附上效果图(我偷懒只爬了4页)  2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...

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

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

  9. Java爬虫爬取京东商品信息

    以下内容转载于<https://www.cnblogs.com/zhuangbiing/p/9194994.html>,在此仅供学习借鉴只用. Maven地址 <dependency ...

随机推荐

  1. 如何使用在Windows 下AspNetCore Api 和 consul

    在Windows 下如何使用 AspNetCore Api 和 consul https://blog.csdn.net/sD7O95O/article/details/80750803 一.概念:什 ...

  2. Java命令行实用工具jps和jstat 专题

    在Linux或其他UNIX和类UNIX环境下,ps命令想必大家都不陌生,我相信也有不少同学写过 ps aux | grep java | grep -v grep | awk '{print $2}' ...

  3. Unity3d发布apk文件并在Android虚拟机中运行的操作流程

    总的流程分为以下6个步骤: 1.安装java_jdk 2.配置java环境变量 3.更新android的sdk 4.从Unity3d中发布出apk文件 5.创建android虚拟机并运行 6.将apk ...

  4. ZR#331. 【18 提高 3】括号序列(栈)

    题意 挺神仙的.首先$60$分暴力是比较好打的. 就是枚举左端点,看右端点能否是$0$ 但是这样肯定是过不了的,假如我们只枚举一次,把得到的栈记录下来 那么若区间$(l, r)$是可行的,那么$s_{ ...

  5. 多线程-Thread-Runnable

    一.多线程     1.基本概念         进程:正在运行中的程序,一个进程中至少包含一个线程         线程:进程的任务,执行任务的一个通道,一个进程中可以包含多个线程     2.多线 ...

  6. JS根据选择的日期计算年龄

    本例中用的是easyUI的datebox $('#cal_birthday').datebox({ onSelect: function(date){ //根据选则的日期计算年龄 //alert(da ...

  7. 用jQuery实现jsonp跨域

    跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成“跨域访问”的工作,然后在浏览器端用AJAX获取本机服务器端“跨域访问”对应 ...

  8. WebView全面学习(二)-- Native与js双方通信

    WebView全面学习(二)-- Native与js双方通信 Native与js通信的本质 Native与js通信的核心在于WebView. 两端的通信主要还是单向的.假如要完成js->Nati ...

  9. js当前日期

    function CurentTime()    {         var now = new Date();               var year = now.getFullYear(); ...

  10. git的常用操作指令

    git学习网址: http://www.backlogtool.com/git-guide/cn/intro/intro2_3.html 廖雪峰的git教程 git的工作区和暂存区(描述git的工作流 ...