python3通过selenium爬虫获取到dj商品的实例代码


Posted in Python onApril 25, 2019

先给大家介绍下python3 selenium使用

其实这个就相当于模拟人的点击事件来连续的访问浏览器。如果你玩过王者荣耀的话在2016年一月份的版本里面就有一个bug。

安卓手机下载一个按键精灵就可以在冒险模式里面设置按键,让手机自动玩闯关,一局19个金币,一晚上就一个英雄了。不过

程序员也不是吃素的。给一个星期设置了大概4000金币上限。有兴趣的可以去试试。(注:手机需要root)

进入正题:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

在写之前需要下载selenium模块

brguge=webdriver.Chrome()#声明驱动对象
try:
  brguge.get('https://www.baidu.com')#发送get请求
  input=brguge.find_element_by_id('kw')#找到目标

  input.send_keys('python')#输入python关键字
  input.send_keys(Keys.ENTER)#敲入回车
  wait=WebDriverWait(brguge,10)#等待元素加载出来
  wait.until(EC.presence_of_element_located(By.ID,'content_left'))#加载
  print(brguge.current_url)#输出搜索的路径
  print(brguge.get_cookie())#输出cookie
  print(brguge.page_source)#输出结果源代码
finally:
  brguge.close()#关闭谷歌浏览器

下面是一些selenium模块的基本用法

查找元素

    单个元素  

(from selenium import webdriver)


    brguge.find_element_by_id('q')用这个元素找id是q的元素
    brguge.find_element_by_css_selector('#q')找css样式是q的
    brguge.find_element_by_xpath('//*[ @id="q"]')三个效果一样
    brguge.find_element_by_name()通过name来查找
    brguge.find_element_by_link_text()通过link来查找
    brguge.find_element_by_partial_link_text()
    brguge.find_element_by_tag_name()
    brguge.find_element_by_class_name()通过class查找
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    brguge.find_element(By.ID,'Q')通用查找方式

    多个元素(find_elements)加了个s
        他会以列表的形式打印出来
        brguge.find_elements_by_css_selector('.service-bd li')css样式为li的元素
        brguge.find_elements(By.css_selector,'.service-bd li')两个作用一样
        (利用索引就可以获取单个或多个元素了)
    元素交互操作(获取元素然后再给他指令)
        选择输入框 --》send_keys('输入文字')--》clear()清空输入框--在输入别的--》找到搜索--》click(点击)
        input.clear()清空按钮
    交互动作(将动作附加到动作链中串行执行)
        switch_to_frame('iframeResult')
        用css样式分别找到两个要交互
        调用ActionChains(调用谷歌的)
        drag_and_drop(source,target)第一个到第二个上面
        perform()

下面看下python3通过selenium爬虫获取到dj商品的实例代码。

具体代码如下所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
from lxml import etree
import time, json
JD_URL_Login = "https://www.jd.com/"
class CustomizeException(Exception):
  def __init__(self, status, msg):
    self.status = status
    self.msg = msg
class JD:
  def __init__(self):
    self.browser = None
    self.__init_browser()
  def __init_browser(self):
    options = Options()
    options.add_argument("--headless")
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 设置为无图模式
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    self.browser = webdriver.Chrome(options=options)
    # 设置浏览器最大化窗口
    self.browser.maximize_window()
    # 隐式等待时间为3s
    self.browser.implicitly_wait(3)
    self.browser.get(JD_URL_Login)
    self.wait = WebDriverWait(self.browser, 10)
  def __search_goods(self, goods):
    '''搜索商品的方法'''
    self.file = open("jd-{}.json".format(goods), "a", encoding="utf-8")
    self.wait.until(EC.presence_of_all_elements_located((By.ID, "key")))
    serach_input = self.browser.find_element_by_id("key")
    serach_input.clear()
    serach_input.send_keys(goods, Keys.ENTER)
  def __get_goods_info(self, page_source):
    '''从网页源码中获取到想要的数据'''
    selector_html = etree.HTML(page_source)
    # 商品名字 不要获取title属性,以后再改吧,最好是获取到商品名的文本内容
    goods_name = selector_html.xpath("//div[@class='gl-i-wrap']//div[contains(@class,'p-name')]/a/@title")
    # 商品价格
    goods_price = selector_html.xpath("//div[@class='gl-i-wrap']//div[@class='p-price']/strong/i/text()")
    # 商品评价数量
    comment_num_selector = selector_html.xpath("//div[@class='p-commit']/strong")
    comment_num = [selector.xpath("string(.)") for selector in comment_num_selector]
    # 商品店铺
    shop_name = selector_html.xpath("//a[@class='curr-shop']/text()")
    goods_zip = zip(goods_name, goods_price, comment_num, shop_name)
    for goods_info in goods_zip:
      dic = {}
      dic["goods_name"] = goods_info[0]
      dic["goods_price"] = goods_info[1]
      dic["comment_num"] = goods_info[2]
      dic["shop_name"] = goods_info[3]
      # print("商品名字>>:", goods_info[0])
      # print("商品价格>>:", goods_info[1])
      # print("商品评价数量>>:", goods_info[2])
      # print("商品店铺>>:", goods_info[3])
      # print("*" * 100)
      yield dic
  def __swipe_page(self):
    '''上下滑动页面,将完整的网页源码返回'''
    height = self.browser.execute_script("return document.body.scrollHeight;")
    js = "window.scrollTo(0, {});".format(height)
    self.browser.execute_script(js)
    while True:
      time.sleep(1)
      now_height = self.browser.execute_script("return document.body.scrollHeight;")
      if height == now_height:
        return self.browser.page_source
      js = "window.scrollTo({}, {});".format(height, now_height)
      self.browser.execute_script(js)
      height = now_height
  def __is_element_exists(self, xpath):
    '''检测一个xpath是否能够找到'''
    try:
      self.browser.find_element_by_xpath(xpath=xpath)
      return True
    except NoSuchElementException:
      return False
  def __click_next_page(self):
    '''点击下一页,实现翻页功能'''
    self.wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "pn-next")))
    xpath = "//a[@class='pn-next']"
    if not self.__is_element_exists(xpath):
      raise CustomizeException(10000, "该商品访问完毕")
    self.browser.find_element_by_xpath(xpath).click()
  def __write_to_json(self, dic: dict):
    data_json = json.dumps(dic, ensure_ascii=False)
    self.file.write(data_json + "\n")
  def run(self, goods):
    self.__search_goods(goods)
    n = 1
    while True:
      print("正在爬取商品 <{}>---第{}页......".format(goods, n))
      time.sleep(3)
      html = self.__swipe_page()
      for dic in self.__get_goods_info(html):
        self.__write_to_json(dic)
      try:
        self.__click_next_page()
      except CustomizeException:
        try:
          goods = goods_list.pop(0)
          self.run(goods)
        except IndexError:
          return
      n += 1
  def __del__(self):
    self.browser.close()
    self.file.close()
if __name__ == '__main__':
  jd = JD()
  goods_list = ["纯牛奶", "酸奶", "奶茶", "床上用品", "电磁炉", "电视", "小米笔记本", "华硕笔记本", "联想笔记本", "男士洗面奶", "女士洗面奶", "沐浴露", "洗发露",
         "牙刷", "牙膏", "拖鞋", "剃须刀", "水手服", "运动服", "红龙果", "苹果", "香蕉", "洗衣液", "电饭煲"]
  try:
    goods = goods_list.pop(0)
  except IndexError:
    raise CustomizeException(20000, "goods_list不能为空")
  try:
    jd.run(goods)
  finally:
    del jd

总结

以上所述是小编给大家介绍的python3通过selenium爬虫获取到dj商品的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python paramiko实现ssh远程访问的方法
Dec 03 Python
使用python实现省市三级菜单效果
Jan 20 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python装饰器知识点补充
May 28 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
python数据预处理 :数据抽样解析
Feb 24 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
NumPy 数组使用大全
Apr 25 #Python
Python+OpenCV采集本地摄像头的视频
Apr 25 #Python
python利用selenium进行浏览器爬虫
Apr 25 #Python
python3人脸识别的两种方法
Apr 25 #Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 #Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 #Python
利用Python查看微信共同好友功能的实现代码
Apr 24 #Python
You might like
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
PHP header()函数常用方法总结
2014/04/11 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
django富文本编辑器的实现示例
2019/04/10 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
暑期实习鉴定
2013/12/16 职场文书
黄金搭档广告词
2014/03/21 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
文明单位创建材料
2014/12/24 职场文书
青涩记忆观后感
2015/06/18 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
我的收音机情缘
2022/04/05 无线电
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技