zoukankan      html  css  js  c++  java
  • python爬虫10 b站爬取使用 selenium+ phantomJS

    但有时候

     

    我们不想要让它打开浏览器去执行

     

    能不能直接在代码里面运行呢

     

    也就是说

     

    有没有一个无形的浏览器呢

     

     

    phantomJS 就是

     

    它是一个基于 WebKit 的浏览器引擎

     

    可以做到无声无息的操作各种动态网站

     

    比如 js,css选择器,dom操作的

     

    所以对于市面上大多通过 js 渲染的动态网站

     

    难以解析的网站

     

    想要爬取的话

     

    就会使用到

     

    selenium + phantomjs

     

    那么怎么玩呢

    在这个页面可以看到

     

    我们需要的数据有

     

    名称

    视频地址

    描述

    观看次数

    弹幕数量

    发布时间

     

    待会我们就把这些数据都爬下来

     

    分析完之后

     

    就开始撸代码了

     

    首先我们要拿到浏览器的对象

     

    browser = webdriver.Chrome()

     

    接着开始访问 b 站

     

      browser.get("https://www.bilibili.com/")

     

    获取到b站首页的输入框和搜索按钮

     

     input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#banner_link > div > div > form > input"))) submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="banner_link"]/div/div/form/button')))

     

    在这里的 

     

    WAIT.until(EC.presence_of_element_located...

     

    就是等到这个元素可操作的时候才会继续执行下一步

     

    获取到输入框元素后输入「蔡徐坤 篮球」

     

    接着点击搜索

     

     input.send_keys('蔡徐坤 篮球') submit.click()

     

    然而

     

    不妙的事情发生了

     

    b站弹出了一个登录框

     

    正好挡住了我们要操作的搜索

     

    浏览器自动点击搜索之后

     

    这个时候会弹出一个新的窗口

     

    这个窗口里的内容

     

    就是我们要的搜索结果

     

    所以我们要让我们当前的浏览器对象获取到当前的窗口

     

    接着获取到第一页的所有数据

     

    # 跳转到新的窗口print('跳转到新窗口')all_h = browser.window_handlesbrowser.switch_to.window(all_h[1])get_source()

     

    我们还要获取总页数

     

    因为每一页的内容

     

    我们都是要抓取的

     

     

     

    total = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.last > button")))return int(total.text)

     

    获取到总页数之后

     

    我们就开始循环

     

    for i in range(2,int(total+1)):     next_page(i)

     

    如何获取下一页呢

     

    当然是模拟点击「下一页按钮」的操作

     

    我们获取「下一页按钮」的元素

     

    然后点击

     

    点击之后判断一下是否在我们当前的页数

     

    然后获取数据

     

     print('获取下一页数据')next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.next > button')))next_btn.click()WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.active > button'),str(page_num)))get_source()

     

     

    有时候可能网速卡

     

    在刷到某一页的时候数据加载不出来

     

    可以来个异常捕获

     

    刷新一下

     

    再递归一下嘿嘿

     

        except TimeoutException:        browser.refresh()        return next_page(page_num)

     

     

    获取资源很简单

     

    我们已经用 selenium 跳转到我们要的页面了

     

    那么就拿下当前页面的源码

     

    然后用

     

     

     

    来解析一下

     

    最后把数据放到 excel 中

     

    WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix')))html = browser.page_sourcesoup = BeautifulSoup(html,'lxml')save_to_excel(soup)

     

    解析爬取

     


    def save_to_excel(soup): list = soup.find(class_='all-contain').find_all(class_='info')
    for item in list: item_title = item.find('a').get('title') item_link = item.find('a').get('href') item_dec = item.find(class_='des hide').text item_view = item.find(class_='so-icon watch-num').text item_biubiu = item.find(class_='so-icon hide').text item_date = item.find(class_='so-icon time').text
    print('爬取:' + item_title)
    global n
    sheet.write(n, 0, item_title) sheet.write(n, 1, item_link) sheet.write(n, 2, item_dec) sheet.write(n, 3, item_view) sheet.write(n, 4, item_biubiu) sheet.write(n, 5, item_date)
    n = n + 1

     

    最后别忘了关闭浏览器哦

     

     finally:        browser.close()

     

    来运行一下项目吧

     

     

    数据到手

     

     

     

     

    哦~ 对了

     

    不是说还有一个叫做 phantomjs 的么?

     

    简单简单

     

    接下来我们就利用它来打造一个无痕的浏览器

     

    首先我们要下载phantomjs 

     

    你可以到

     

    http://phantomjs.org/download.html

     

    这里去下载

     

    下载完之后你需要配置一下环境变量哦

     

     

     

     

    接着回到我们的代码

     

    将 Chrome 换成 phantomjs

     

    browser = webdriver.PhantomJS()

     

    这次我们再来运行项目

     

     

    这次就是真正的不会打开任何有界面的浏览器了

     

    看下我们抓到的数据

     

     

     

     

     

    ok~

     

     

     

  • 相关阅读:
    P2634 [国家集训队]聪聪可可
    P2051 [AHOI2009]中国象棋
    java集成工具的简单总结
    java-web中的web.xml中的servlet和servlet-mapping标签,及网页处理流程
    ecplist中快速添加set get方法
    Spring创建容器之new ClassPathXmlApplicationContext错误
    设计模式之工厂模式
    java-web项目的eclipse里面引入jar包
    DES原理及代码实现
    Linux网络篇,ssh原理及应用
  • 原文地址:https://www.cnblogs.com/hrnn/p/13307485.html
Copyright © 2011-2022 走看看