本教程给出了一个使用WebCollector模拟登陆并爬取新浪微博的示例.登录过程中会出现验证码.如图所示:

1.依赖jar包:
本教程需要两套jar包,WebCollector核心jar包和selenium的jar包。
WebCollector最新jar包可在WebCollector github主页下载。
selenium的maven依赖:

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.44.0</version>
</dependency>

或者在百度网盘中链接:http://pan.baidu.com/s/1dE9af3z 密码:4z2d

2.代码:
(1)利用Selenium获取登陆新浪微博weibo.cn的cookie(WeiboCN.java)
(2)利用WebCollector和获取的cookie爬取新浪微博并抽取数据(WeiboCrawler.java)
WeiboCN.java

package cn.edu.hfut.dmic.contentextractor;
import cn.edu.hfut.dmic.webcollector.net.HttpRequest;
import cn.edu.hfut.dmic.webcollector.net.HttpResponse;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Set;
import javax.imageio.ImageIO;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;/*** 利用Selenium获取登陆新浪微博weibo.cn的cookie** @author hu*/
public class WeiboCN {/*** 获取新浪微博的cookie,这个方法针对weibo.cn有效,对weibo.com无效 weibo.cn以明文形式传输数据,请使用小号** @param username 新浪微博用户名* @param password 新浪微博密码* @return* @throws Exception*/public static String getSinaCookie(String username, String password) throws Exception {StringBuilder sb = new StringBuilder();HtmlUnitDriver driver = new HtmlUnitDriver();driver.setJavascriptEnabled(true);driver.get("http://login.weibo.cn/login/");WebElement ele = driver.findElementByCssSelector("img");String src = ele.getAttribute("src");String cookie = concatCookie(driver);HttpRequest request = new HttpRequest(src);request.setCookie(cookie);HttpResponse response = request.getResponse();ByteArrayInputStream is = new ByteArrayInputStream(response.getContent());BufferedImage img = ImageIO.read(is);is.close();ImageIO.write(img, "png", new File("result.png"));String userInput = new CaptchaFrame(img).getUserInput();WebElement mobile = driver.findElementByCssSelector("input[name=mobile]");mobile.sendKeys(username);WebElement pass = driver.findElementByCssSelector("input[name^=password]");pass.sendKeys(password);WebElement code = driver.findElementByCssSelector("input[name=code]");code.sendKeys(userInput);WebElement rem = driver.findElementByCssSelector("input[name=remember]");rem.click();WebElement submit = driver.findElementByCssSelector("input[name=submit]");submit.click();String result = concatCookie(driver);driver.close();if (result.contains("gsid_CTandWM")) {return result;} else {throw new Exception("weibo login failed");}}public static String concatCookie(HtmlUnitDriver driver) {Set<Cookie> cookieSet = driver.manage().getCookies();StringBuilder sb = new StringBuilder();for (Cookie cookie : cookieSet) {sb.append(cookie.getName() + "=" + cookie.getValue() + ";");}String result = sb.toString();return result;}public static class CaptchaFrame {JFrame frame;JPanel panel;JTextField input;int inputWidth = 100;BufferedImage img;String userInput = null;public CaptchaFrame(BufferedImage img) {this.img = img;}public String getUserInput() {frame = new JFrame("输入验证码");final int imgWidth = img.getWidth();final int imgHeight = img.getHeight();int width = imgWidth * 2 + inputWidth * 2;int height = imgHeight * 2+50;Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();int startx = (dim.width - width) / 2;int starty = (dim.height - height) / 2;frame.setBounds(startx, starty, width, height);Container container = frame.getContentPane();container.setLayout(new BorderLayout());panel = new JPanel() {@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);g.drawImage(img, 0, 0, imgWidth * 2, imgHeight * 2, null);}};panel.setLayout(null);container.add(panel);input = new JTextField(6);input.setBounds(imgWidth * 2, 0, inputWidth, imgHeight * 2);panel.add(input);JButton btn = new JButton("登录");btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {userInput = input.getText().trim();synchronized (CaptchaFrame.this) {CaptchaFrame.this.notify();}}});btn.setBounds(imgWidth * 2 + inputWidth, 0, inputWidth, imgHeight * 2);panel.add(btn);frame.setVisible(true);synchronized (this) {try {this.wait();} catch (InterruptedException ex) {ex.printStackTrace();}}frame.dispose();return userInput;}}}

WeiboCrawler.java

package cn.edu.hfut.dmic.contentextractor;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.net.HttpRequest;
import cn.edu.hfut.dmic.webcollector.net.HttpResponse;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;/*** 利用WebCollector和获取的cookie爬取新浪微博并抽取数据* @author hu*/
public class WeiboCrawler extends BreadthCrawler {String cookie;public WeiboCrawler(String crawlPath, boolean autoParse) throws Exception {super(crawlPath, autoParse);/*获取新浪微博的cookie,账号密码以明文形式传输,请使用小号*/cookie = WeiboCN.getSinaCookie("小号的账号", "小号的密码");}@Overridepublic HttpResponse getResponse(CrawlDatum crawlDatum) throws Exception {HttpRequest request = new HttpRequest(crawlDatum);request.setCookie(cookie);return request.getResponse();}@Overridepublic void visit(Page page, CrawlDatums next) {int pageNum = Integer.valueOf(page.getMetaData("pageNum"));/*抽取微博*/Elements weibos = page.select("div.c");for (Element weibo : weibos) {System.out.println("第" + pageNum + "页\t" + weibo.text());}}public static void main(String[] args) throws Exception {WeiboCrawler crawler = new WeiboCrawler("weibo_crawler", false);crawler.setThreads(3);/*对某人微博前5页进行爬取*/for (int i = 1; i <= 50; i++) {crawler.addSeed(new CrawlDatum("http://weibo.cn/u/3865692567?vt=4&page=" + i).putMetaData("pageNum", i + ""));}crawler.start(1);}}

这是对@最强大脑微博的爬取,通过修改爬取的页数,获取对应微博数据。在爬取的过程需要用户修改微博账号和密码,最好使用小号进行爬取,因为爬取过程使用明文传输。
运行后结果如图所示:

与其对应的网页如图所示:

我们可以通过修改如图所示的地址来爬取对应微博数据:

至此关于新浪微博的爬取就讲完了,希望对大家有所帮助!

Java开源爬虫框架WebCollector—爬取新浪微博相关推荐

  1. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  2. 用WebCollector爬取新浪微博数据

    教程已转移:http://datahref.com/archives/28 WebCollector爬取新浪微博等完整演示样例project可加群250108697或345054141从群文件里下载. ...

  3. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  4. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  5. python爬虫scrapy爬取新闻标题及链接_python爬虫框架scrapy爬取梅花网资讯信息

    原标题:python爬虫框架scrapy爬取梅花网资讯信息 一.介绍 本例子用scrapy-splash爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息, ...

  6. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  7. JAVA爬虫框架WebMagic爬取ajax请求的页面数据

    查看WebMagic文档:http://webmagic.io/docs/zh/posts/ch1-overview/ 爬取网址需要翻墙: https://www.reddit.com/r/funny ...

  8. Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名

    经过一段时间的Python网络爬虫学习,今天自己摸索制作了一个能够爬取新浪微博实时热搜排名的小爬虫 1.效果: 2.制作过程中遇到的问题: (1)一开始研究微博热搜页面的源代码时忽略了<tbod ...

  9. Python-爬虫(Scrapy爬虫框架,爬取豆瓣读书和评分)

    文章目录 1.Scrapy注意点 2. Scrapy爬取豆瓣读书和评分 代码部分 数据定义items.py 爬虫部分spiders/book.py 数据存储部分pipelines.py 启动爬虫执行c ...

最新文章

  1. 生产者与消费者(三)---BlockingQueue
  2. 大作完成了一部分,陆续往上放吧
  3. 动手实现一个 LRU cache
  4. 叶明哲 | 数据中心空调文章集锦
  5. 支撑百亿级应用的 NewSQL——TiDB 在同程旅游的应用
  6. Linux异步之信号(signal)机制分析
  7. thinkphp josn mysql_ThinkPHP:JSON字段类型的使用(ORM)
  8. Visual C++ 设置适合自己的解决方案目录结构
  9. spark学习-63-源代码:schedulerBackend和taskScheduler的创建(1)-local
  10. verilog学习记(测试和验证)
  11. 【JSTL】<c:if test=“”>没有else的解决方法
  12. 王炸!!微软终于对 JDK 下手了…
  13. i686和x86_64的区别
  14. idea安装阿里巴巴Java开发规范插件
  15. 天池比赛实践——阿里云安全恶意程序检测(基于机器学习算法XGBoost)
  16. IPAM——IP地址管理
  17. 老有“美女”加你微信?大学生“艳遇”,结果吓一跳...
  18. 爬虫-东北林业大学校内-中国[哈尔滨]森林博物馆-爬取所有馆藏蝴蝶图片
  19. Spring-AOP术语
  20. JavaEE实现微博项目(含注册、登录、发表微博、评论微博、关注博主、阅读排行榜、评论排行榜等功能)

热门文章

  1. Lightroom CC 2019中文直装破解版v8.2
  2. 职称计算机考试 数量,全国职称计算机考试合格通过模块数量表.doc
  3. 微信小程序——标签wxml、样式wxss、js、json
  4. iOS swif5 轮播图
  5. 中国眼动追踪市场趋势报告、技术动态创新及市场预测
  6. Android.mk 详解剖析
  7. 转:理解CPU steal time
  8. 提供多种2D和3D图表类型以及组合图、仪表的图表控件CHARTING
  9. python接收键盘输入的值_Python代码中如何读取键盘录入的值
  10. 移通好闹钟源码(校园交互平台微信小程序)