资讯专栏INFORMATION COLUMN

selenium 自动化爬虫 5分钟爬取新浪李敖大师1751条微博.

zhichangterry / 611人阅读

摘要:是一个浏览器自动化测试框架可以模拟用户的所有操作很久以前就想把李敖大师的所有微博爬取下来一直没空前天看见群里有人推荐和就学了做了个你们想爬别人的只要把李敖大师的地址换成你要的就行了我还没学不过我猜他就是去掉功能的浏览器这样可以让爬虫更快如果

selenium 是一个浏览器自动化测试框架.可以模拟用户的所有操作.

很久以前就想把李敖大师的所有微博爬取下来.一直没空,前天看见群里有人推荐selenium和phantomjs 就学了selenium做了个demo.你们想爬别人的只要把李敖大师的地址换成你要的就行了.phantomjs我还没学,不过我猜他就是去掉ui功能的浏览器.这样可以让爬虫更快.如果专业做爬虫的可以看看.我做这个是玩的.

数据库结构

学习地址: 慕课网 selenium 教程
项目地址: spiderSina
环境:
ide:Netbeans
java包:非常多(在lib文件夹中)
浏览器驱动:ie,火狐,谷歌随便选(在res文件夹内)

爬虫思路:

打开新浪微博首页并登录

跳转到李敖大师主页

触发ajax将一个页面全部显示出来

对每一个微博进行判断解析 只获取大师本人的微博
如果有展开全文就点击点击一下.然后将微博内容插入数据库

判断是否有下一页,如果有就到下一页然后进入第四步

打开微博并登录 这里的css选择器就当jQuery用
baseUrl = "https://weibo.com";
//打开微博主页面
driver.get(baseUrl);
//设置窗口最大化
driver.manage().window().maximize();
 //输入用户名
 driver.findElement(By.cssSelector("#loginname")).clear();
 driver.findElement(By.cssSelector("#loginname")).sendKeys(sinaUsername);
 //输出密码
 driver.findElement(By.cssSelector("#pl_login_form .info_list.password input")).clear();
 driver.findElement(By.cssSelector("#pl_login_form .info_list.password input")).sendKeys(password);
 //点击登录
 driver.findElement(By.cssSelector("#pl_login_form.login_box div.login_innerwrap div.W_login_form .login_btn")).click();
 
触发ajax将一个页面全部显示出来
 //判断是否有下一页那个按钮 没的就向下拉
 for (int i = 0, scrollY = 5000; i < 20; i++, scrollY += 5000) {
      //判断是否有下一页那个div 如果有就表示到底了
      if (this.isElementPresent(By.cssSelector(".page.next.S_txt1.S_line1"))) {
           break;
          }
           String setscroll = "window.scrollTo(0," + scrollY + ")";
       //执行js代码 将页面向下拉
       jse.executeScript(setscroll);
  }       
对每一个微博进行判断解析 只获取大师本人的微博
//获取李大师所有的微博
List divs = driver.findElements(By.cssSelector("#Pl_Official_MyProfileFeed__23 div>.WB_cardwrap.WB_feed_type"));
//对每一条微博进行判断是否为正常微博(非别人的点赞) 并进行展开全文 然后插入数据库
divs.forEach((WebElement ele) -> {
String isZan = ele.findElement(By.cssSelector("div:first-of-type")).getAttribute("class");
if (!("WB_cardtitle_b S_line2".equals(isZan))) {
    String weiboContent;
    //如果要运行的快一点就把数值改小,数值越小等待的时间越少
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.MILLISECONDS);
    //判断是否微博中是否有超链接并且超链接内容为展开全文 如果是就点击
    if (this.isElementPresent(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a"), ele)
            && "展开全文".equals(ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a")).getText().trim())) {
        //这里获取全文应该是300ms之内 设置太久会浪费时间
        driver.manage().timeouts().implicitlyWait(300, TimeUnit.MILLISECONDS);
        //点击 展开全文按钮
        ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14 a")).click();
        //获取微博内容
        weiboContent = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>div:last-of-type")).getText();
    } else {
    //如果没有展开全文 获取微博 这两种内容不在一个div里
        weiboContent = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_text.W_f14")).getText();
    }
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    //获取大师发微博的时间
    String writeTime = ele.findElement(By.cssSelector(".WB_feed_detail>.WB_detail>.WB_from>a:first-of-type")).getText();
    //这里我想把微博中偶尔出现的零宽字符去掉但是失败了,可能是版本问题.不想搞
    //weiboContent = weiboContent.replaceAll("u200b", "");
    //将微博插入数据库
    this.insertToMysql(weiboContent, writeTime);
    //这个是获取到的微博内容调试时候可以打开看看在哪里出来问题
    // System.out.println(weiboContent + "
");
}

});

判断是否有下一页
//查看按钮的文本是否为"下一页" 如果是那就还有下一页
 WebElement nextPage = driver.findElement(By.cssSelector("#Pl_Official_MyProfileFeed__23 .WB_cardwrap.S_bg2>div>a:last-of-type"));
 String strNext = nextPage.getText();
 if ("下一页".equals(strNext)) {
      nextPage.click();
      this.getPage();
   }

没有了... 其实selenium普通玩家应该很快就能上手.高端玩法没试过.主要就是看一下他重要的几个api
如果不知道api 就百度还有写demo猜api用法.
本来想用php写的,但是php写得话可能比较麻烦.
我本人对李敖大师十分敬仰,一直就想把他的语录记下来.待他百年之后,有人在网上吹牛李敖说"xxx"
我能有勇气发这个图给他.

开个玩笑,我是为了学习.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67650.html

相关文章

  • 爬虫问题总结

    摘要:编码我们发现,中有时候存在中文,这是就需要对进行编码。可以先将中文转换成编码,然后使用方法对参数进行编码后传递。 本文档对日常学习中用 python 做数据爬取时所遇到的一些问题做简要记录,以便日后查阅,部分问题可能因为认识不到位会存在一些误解,敬请告知,万分感谢,共同进步。 估算网站规模 该小节主要针对于整站爬取的情况。爬取整站之前,肯定是要先对一个网站的规模进行估计。这是可以使用g...

    nanfeiyan 评论0 收藏0
  • 利用新浪API实现数据的抓取微博数据爬取微博爬虫

    摘要:本人长期出售超大量微博数据旅游网站评论数据,并提供各种指定数据爬取服务,。如果用户传入伪造的,则新浪微博会返回一个错误。 PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,这个代码已经不能用来爬数据了。如果只是为了收集数据可以咨询我的邮箱,如果是为了学习爬虫,...

    liuyix 评论0 收藏0
  • 利用新浪API实现数据的抓取微博数据爬取微博爬虫

    摘要:本人长期出售超大量微博数据旅游网站评论数据,并提供各种指定数据爬取服务,。如果用户传入伪造的,则新浪微博会返回一个错误。 PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,这个代码已经不能用来爬数据了。如果只是为了收集数据可以咨询我的邮箱,如果是为了学习爬虫,...

    Keagan 评论0 收藏0
  • 利用新浪API实现数据的抓取微博数据爬取微博爬虫

    摘要:本人长期出售超大量微博数据旅游网站评论数据,并提供各种指定数据爬取服务,。如果用户传入伪造的,则新浪微博会返回一个错误。 PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,这个代码已经不能用来爬数据了。如果只是为了收集数据可以咨询我的邮箱,如果是为了学习爬虫,...

    vslam 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0

发表评论

0条评论

zhichangterry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<