首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >selenium+phantomjs爬取

selenium+phantomjs爬取

作者头像
py3study
发布于 2020-01-16 07:42:52
发布于 2020-01-16 07:42:52
66800
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

selenium+phantomjs爬取京东商品信息

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

打开 https://www.jd.com/ 首先不需要登陆就可搜索,淘宝不一样,所以淘宝我还没试过。

开启F12 定位一下搜索框和搜索按钮

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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跳转 所以得用下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

接下来就还是检测是否加载了下面的元素

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

这时候可能爬的不完全,因为京东是动态加载的 需要去模拟一下把页面拉到底部

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")

按照这样子进行循环遍历,把每一个值添加到goods_data列表里去,但也保证不了可能会出现找不到对象的属性,抛出AttributeError异常,这里已经尝试过了,所以写下这个异常处理!

然后获取完一页就下一页,然后得写个代码来检查是否跳转到指定页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 时间视情况而定,太快会导致获取不全,但如果网速快能弥补这一点,目前测试情况来看是这样子的问题!

附上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/06/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
公众号服务器搭建与交互原理
自此已经成功创建 http://1.maizi.applinzi.com 这个应用。
一粒小麦
2019/07/18
2.2K0
公众号服务器搭建与交互原理
教你搭建微信公众号自动答复机器人
昨天我们的文章中说到:使用图灵机器人作为应答机器人可以满足要求,但是每天的回复条数在不花钱的情况下只能有100条。对于我这样贫困线人口怎么可能每个月花费99元就为了自动回复呢。于是我就在想还有没有其它的方式能够快速做一个请求和应答表呢?
菜鸟小白的学习分享
2020/07/14
2.1K0
教你搭建微信公众号自动答复机器人
微信公众平台百度天气预报开发
1.登录百度ak申请: http://lbsyun.baidu.com/apiconsole/key
SmileNicky
2019/01/17
1.2K0
独立开发微信公众号服务的一次复盘
上篇文章主要分享了异步编程的一些经验。主要包括回调函数,发布订阅,Promise,async await以及yield关键字。
terrence386
2022/07/14
4630
独立开发微信公众号服务的一次复盘
微信公众平台开发(十) 消息回复总结
微信公众平台提供了三种消息回复的格式,即文本回复、音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用。
全栈程序员站长
2022/09/20
2.1K0
微信公众平台开发(十) 消息回复总结
巧用 Serverless,轻松搭建微信公众号的智能后台服务
一般来说,想给微信公众号增加更多的功能,需要有一台服务器,来进行公众号后台服务的搭建。那么在 Serverless 架构下,是否有更简便的方法来实现这么一个公众号后台呢?我们试试? 初步搭建 一、Serverless 原生开发 首先要有一个微信公众号! 接下来,我们要为我们的函数计算服务申请固定 IP: 点击白名单之后,我们可以填写表单,完成固定公网出口 IP 的申请。 接下来进行代码开发。 将函数绑定到公众号后台,并按照文档在函数中完成一个基本的鉴定功能: def checkSignature(
腾讯云serverless团队
2020/05/22
3.7K0
微信公众平台开发教程(二) 基本原理及消息接口
微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现)。
Java架构师必看
2021/05/19
1.1K0
微信公众号-开发者-自定义菜单-CLICK事件处理
  想点击菜单,推送消息。功能很简单,坑了我一天时间。在此笔记。 菜单代码: { "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "name":"菜单", "sub_button":[ { "t
deepcc
2018/05/16
1.6K0
微信公众平台开发接口PHP SDK完整版
官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0 2014-03-15 增加图片、视频、
joshua317
2018/04/10
2.7K0
微信公众号三方平台开发【代微信公众号接收消息事件并响应】
今天要讲的是代微信公众号接收消息并进行回复,这里要用到的就是咱们之前在微信公众号三方平台开发【帐号注册、平台创建】里写到的“公众号消息与事件接收URL”,在接收的目标方法里,我们首先要获取到微信推送过来post数据(xml格式),然后对其进行解密操作,从而得到消息内容。
用户2619822
2022/06/10
1.1K0
微信公众号三方平台开发【全网发布及全网发布接入检测】
今天开始之前,纠正下上期粗心犯的一个错,在完整代码部分把if(strtolower($postObj -> MsgType) == 'event')写了两次,由于推送的内容修改无法生效, 大伙自行删除多余的判断句即可,也可以看今天最后面的完整代码。
用户2619822
2022/06/10
1.4K0
微信公众号三方平台开发【全网发布及全网发布接入检测】
php实现自动回复消息(网上教程有大坑,慎用)
废话不多说,直接上代码 define("TOKEN", config("wx_token")); $wechatObj = new Wxapi(); if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class Wxapi { /** * 微信公众号验证 */ public function valid() { $echoStr = $_GET["ec
黄啊码
2022/05/10
8310
微信公众号推送消息笔记
根据业务需要,开发一个微信公众号的相关开发,根据相关开发和整理总结了一下相关的流程和需要,进行一些整理和总结分享给大家,最近都在加班和忙碌,博客已经很久未更新了,打气精神,再接再厉,申请、认证公众号的一系列流程就不在这里赘述了,主要进行的是技术的分享,要达到的效果如下图:
stark张宇
2024/07/23
3450
【黄啊码】php结合微信公众号实现裂变海报(基本技术点)
微信公众号裂变式营销代码实现,先讲下基础原理,先生成带有用户参数的二维码,然后用php自带的gd库处理,生成带有用户头像,昵称,参数二维码,营销信息的自定义图片,再将图片传入微信公众号临时素材,当其他用户扫描这个专属推荐码的时候,获取用户的昵称返回给推荐者,并存入数据库,以记录当前有多少人扫描了二维码。
黄啊码
2022/06/15
9780
相关推荐
公众号服务器搭建与交互原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档