侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   207

先给大家介绍下python3 selenium使用

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

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

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

进入正题:

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.chrome.options import Optionsfrom selenium.common.exceptions import NoSuchElementExceptionfrom lxml import etreeimport time, jsonJD_URL_Login = "https://www.jd.com/"class CustomizeException(Exception):  def __init__(self, status, msg):    self.status = status    self.msg = msgclass 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基础教程之if判断,while循环,循环嵌套
    下一条:
    Python+OpenCV采集本地摄像头的视频
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客