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

先给大家介绍下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商品的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Python selenium抓取微博内容的示例代码

    Selenium简介与安装 Selenium是什么? Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla Suite等. 安装 直接使用pip命令安装即可! pip install selenium Python抓取微博有两种方式,一是通过selenium自动登录后从页面直接爬取,二是通过api. 这里采用selenium的方式. 程序: from selen

  • 浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动态加载的图片该怎么爬取到. 分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. headers = { 'User-Agent':'Mozilla/5.0 (Win

  • python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧! 所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取. 运行效果: http://photo.hupu.com/nba/tag/马刺 http://photo.hupu.com/nba/tag/陈露 源代码: # -*- coding: utf

  • 使用selenium抓取淘宝的商品信息实例

    淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用. import re from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.suppor

  • 学习Python selenium自动化网页抓取器

    直接入正题---Python selenium自动控制浏览器对网页的数据进行抓取,其中包含按钮点击.跳转页面.搜索框的输入.页面的价值数据存储.mongodb自动id标识等等等. 1.首先介绍一下 Python selenium ---自动化测试工具,用来控制浏览器来对网页的操作,在爬虫中与BeautifulSoup结合那就是天衣无缝,除去国外的一些变态的验证网页,对于图片验证码我有自己写的破解图片验证码的源代码,成功率在85%. 详情请咨询QQ群--607021567(这不算广告,群里有好多P

  • python利用selenium进行浏览器爬虫

    前言 相信大家刚开始在做爬虫的时候,是不是requests和sound这两个库来使用,这样确实有助于我们学习爬虫的知识点,下面来介绍一个算事较复杂的爬虫案例selenium进形打开浏览器爬取网站的信息 导入第三方库 自执行函数 解析信息 保存文件信息 打开浏览器 获取链接信息 执行函数 运行结果 总结 以上所述是小编给大家介绍的python利用selenium进行浏览器爬虫,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持! 如果你觉得本

  • Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    1.引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一部分实验了用xslt方式一次性提取静态网页内容并转换成xml格式.留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题. 2.提取动态内容的技术部件 在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的.但是一些Aja

  • selenium+python设置爬虫代理IP的方法

    1. 背景 在使用selenium浏览器渲染技术,爬取网站信息时,一般来说,速度是很慢的.而且一般需要用到这种技术爬取的网站,反爬技术都比较厉害,对IP的访问频率应该有相当的限制.所以,如果想提升selenium抓取数据的速度,可以从两个方面出发: 第一,提高抓取频率,出现验证信息时进行破解,一般是验证码或者用户登录. 第二,使用多线程 + 代理IP, 这种方式,需要电脑有足够的内存和充足稳定的代理IP . 2. 为chrome设置代理IP from selenium import webdri

  • 利用selenium爬虫抓取数据的基础教程

    写在前面 本来这篇文章该几个月前写的,后来忙着忙着就给忘记了. ps:事多有时候反倒会耽误事. 几个月前,记得群里一朋友说想用selenium去爬数据,关于爬数据,一般是模拟访问某些固定网站,将自己关注的信息进行爬取,然后再将爬出的数据进行处理. 他的需求是将文章直接导入到富文本编辑器去发布,其实这也是爬虫中的一种. 其实这也并不难,就是UI自动化的过程,下面让我们开始吧. 准备工具/原料 1.java语言 2.IDEA开发工具 3.jdk1.8 4.selenium-server-standa

  • C#使用Selenium+PhantomJS抓取数据

    手头项目需要抓取一个用js渲染出来的网站中的数据.使用常用的httpclient抓回来的页面是没有数据.上网百度了一下,大家推荐的方案是使用PhantomJS.PhantomJS是一个没有界面的webkit浏览器,能够和浏览器效果一致的使用js渲染页面.Selenium是一个web测试框架.使用Selenium来操作PhantomJS绝配.但是网上的例子多是Python的.无奈,下载了python按照教程搞了一下,卡在了Selenium的导入问题上.遂放弃,还是用自己惯用的c#吧,就不信c#上没

随机推荐