需求分析

  • 最近新型肺炎肆虐寒假在家闲来无事就突发奇想,爬取新浪微博中与肺炎患者自救有关的帖子以texcel形式保存起来做一些分析。
  • 经过一番折腾,最终使用webMagic框架成功爬取了200个微博页面共3263条帖子。
  • 立图为证

环境搭建

  • 首先创建一个空的maven工程。
  • 在pom.xml文件引入相关依赖
<dependencies>
<!--        读写excel文件--><!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency>
<!--        webmagic--><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version></dependency><!-- 布隆过滤器--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>25.1-jre</version></dependency></dependencies>

实现步骤

  • 因为自己爬取的是肺炎患者自助相关帖子,爬虫的入口链接为 https://s.weibo.com/weibo?q=肺炎患者自助&Refer=index&page=1。
  • 我们知道微博必须要登录才能访问,如果直接爬取链接爬到的只是空页面。为了方便,这里直接伪装一个登录态。
  • 首先登录微博,然后在浏览器调试窗口抓取cookie信息。
  • 然后将cookie信息添加到请求头中,伪装一个登录态。
Site site = Site.me().setCharset("utf8")   //设置编码.setTimeOut(10*1000)  //设置超时时间.setRetrySleepTime(3000) //设置重试的间隔时间.setRetryTimes(3)  //设置重试的次数//添加抓包获取的cookie信息.addCookie("s.weibo.com", "ALF","1612149474").addCookie("s.weibo.com", "Apache","8262060252464.451.1580612613221").addCookie("s.weibo.com", "SINAGLOBAL","8262060252464.451.1580612613221").addCookie("s.weibo.com", "SSOLoginState","1580613475").addCookie("s.weibo.com", "SUB","_2A25zMk80DeRhGeNJ7FsT8ivOyT-IHXVQRif8rDV8PUNbmtAKLWfMkW9NS7UYSlen74ogE4N7bsE8rkiUf8KC-h9R").addCookie("s.weibo.com", "SUBP","0033WrSXqPxfM725Ws9jqgMF55529P9D9WWvS_evbaDmZal0ML-HEL_A5JpX5KzhUgL.Fo-NS0.Eeo-Eeoe2dJLoI05LxKnLBoqL1h-LxKMLB.2LBKMLxK-LB.BLBK.LxKnL1K.LBo.LxKMLBoeL1Kq7ehqt").addCookie("s.weibo.com", "SUHB","0u5RC7NpfZ1RL0").addCookie("s.weibo.com", "ULV","1580612613262:1:1:1:8262060252464.451.1580612613221:").addCookie("s.weibo.com", "UOR",",,graph.qq.com").addCookie("s.weibo.com", "_s_tentry","s.weibo.com").addCookie("s.weibo.com", "wb_view_log_5779225223","1920*10801").addCookie("s.weibo.com", "wvr","6").addCookie("weibo.com", "Ugrow-G0","589da022062e21d675f389ce54f2eae7").addCookie("weibo.com", "YF-Page-G0","70942dbd611eb265972add7bc1c85888|1580610997|1580610997").addCookie("weibo.com", "YF-V5-G0","99df5c1ecdf13307fb538c7e59e9bc9d")
  • 为了防止ip请求过于频繁被禁ip的风险,这里在每次请求之间随机间隔一定时间。
      //每请求一次 随机让线程休眠0-5秒Random random = new Random();int anInt = random.nextInt(5);try {Thread.sleep(anInt);} catch (InterruptedException e) {e.printStackTrace();}
  • 完整代码如下

/*** 爬取关键词搜索的帖子  1-200页 保存为txt文件*/
public class MyProcess implements PageProcessor {public static String url = "https://s.weibo.com/weibo?q=肺炎患者自助&Refer=index&page=";//请求urlpublic static int maxpage = 200; //标识最大页数public static FileWriter wr = null;public static BufferedWriter out = null;static {try {wr = new FileWriter("肺炎患者自助.txt");//文件保存路径} catch (IOException e) {e.printStackTrace();}out = new BufferedWriter(wr);}public static int count = 1; //当前获取了多少数据public static int thispage = 1; //标识当前请求到第几页public void process(Page page) {System.out.println(page.getHtml());List<Selectable> list = page.getHtml().css("#pl_feedlist_index div.card-wrap").nodes();//获取当前页面所有帖子for(Selectable crad:list){Document doc = Jsoup.parse(crad.toString());//获取编号 获取发帖人String persion = doc.select("a.name").first().attr("nick-name");System.out.println("编号:"+count+"发帖人:"+persion);//获取发帖人微博String weibo = crad.css("div[class=avator]").links().get();//获取帖子内容String text = doc.select("p[node-type=feed_list_content]").text();String text_full = doc.select("p[node-type=feed_list_content_full]").text();String content = text_full.equals("")?text:text_full;//获取时间String time = doc.select("p[class=from]").first().text();//获取String zan = doc.select("div[class=card-act]").text();try {out.write("编号:"+count);out.newLine();out.write("作者:"+persion);out.newLine();out.write("链接:"+weibo);out.newLine();out.write("内容:"+content);out.newLine();out.write("时间:"+time);out.newLine();out.write("相关:"+zan);out.newLine();out.flush();} catch (IOException e) {e.printStackTrace();}count++;}//在第一页请求完成后把第2-200页加入到任务队列if(thispage==1){for(int i =2;i<=maxpage;i++){page.addTargetRequest(url+i);}}System.out.println("第"+thispage+"页 请求完成");thispage++;//每请求一次 随机让线程休眠0-5秒Random random = new Random();int anInt = random.nextInt(5);try {Thread.sleep(anInt);} catch (InterruptedException e) {e.printStackTrace();}}private Site site = Site.me().setCharset("utf8")   //设置编码.setTimeOut(10*1000)  //设置超时时间.setRetrySleepTime(3000) //设置重试的间隔时间.setRetryTimes(3)  //设置重试的次数//添加抓包获取的cookie信息.addCookie("s.weibo.com", "ALF","1612149474").addCookie("s.weibo.com", "Apache","8262060252464.451.1580612613221").addCookie("s.weibo.com", "SINAGLOBAL","8262060252464.451.1580612613221").addCookie("s.weibo.com", "SSOLoginState","1580613475").addCookie("s.weibo.com", "SUB","_2A25zMk80DeRhGeNJ7FsT8ivOyT-IHXVQRif8rDV8PUNbmtAKLWfMkW9NS7UYSlen74ogE4N7bsE8rkiUf8KC-h9R").addCookie("s.weibo.com", "SUBP","0033WrSXqPxfM725Ws9jqgMF55529P9D9WWvS_evbaDmZal0ML-HEL_A5JpX5KzhUgL.Fo-NS0.Eeo-Eeoe2dJLoI05LxKnLBoqL1h-LxKMLB.2LBKMLxK-LB.BLBK.LxKnL1K.LBo.LxKMLBoeL1Kq7ehqt").addCookie("s.weibo.com", "SUHB","0u5RC7NpfZ1RL0").addCookie("s.weibo.com", "ULV","1580612613262:1:1:1:8262060252464.451.1580612613221:").addCookie("s.weibo.com", "UOR",",,graph.qq.com").addCookie("s.weibo.com", "_s_tentry","s.weibo.com").addCookie("s.weibo.com", "wb_view_log_5779225223","1920*10801").addCookie("s.weibo.com", "wvr","6").addCookie("weibo.com", "Ugrow-G0","589da022062e21d675f389ce54f2eae7").addCookie("weibo.com", "YF-Page-G0","70942dbd611eb265972add7bc1c85888|1580610997|1580610997").addCookie("weibo.com", "YF-V5-G0","99df5c1ecdf13307fb538c7e59e9bc9d")//添加请求头,伪装浏览器请求.addHeader("User-Agent","ozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80" +" Safari/537.36 Core/1.47.516.400 QQBrowser/9.4.8188.400").addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8").addHeader("Accept-Encoding", "gzip, deflate, sdch").addHeader("Accept-Language", "zh-CN,zh;q=0.8").addHeader("Connection", "keep-alive").addHeader("Referer", "https://s.weibo.com");;public Site getSite() {return site;}//主函数,执行爬虫public static void main(String[] args) {//请求微博关键词搜索界面第一页Spider.create(new MyProcess()).addUrl(url+1)// .addPipeline(new ExcelPipeline())// .thread(5)  //表示开启5个线程来完成任务.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(1000*1000)))//设置布隆过滤器,最多对100w数据进行去重.run();}
}
  • 因为业务逻辑比较简单,为了方便没有使用Pipeline,直接每解析一条帖子就写入到txt文件中。
  • 爬取结束后再将txt文件数据写入到excel文件即可。
//读取txt文件帖子 保存到excel文件public static void save() throws Exception {FileReader reader = new FileReader("关键词搜索.txt");BufferedReader in = new BufferedReader(reader);//创建工作簿Workbook wb = new HSSFWorkbook();//创建 Sheet页Sheet sheetA = wb.createSheet("A");FileOutputStream fos = new FileOutputStream("关键词搜索.xls");//当前excel文件行数int num=0;//6行 6行的读取数据  每6行表示一个帖子String line1 = in.readLine();String line2 = in.readLine();String line3 = in.readLine();String line4 = in.readLine();String line5 = in.readLine();String line6 = in.readLine();//创建单元行Row row = sheetA.createRow(num);//每行插入6列元素Cell cell0 = row.createCell(0);Cell cell1 = row.createCell(1);Cell cell2 = row.createCell(2);Cell cell3 = row.createCell(3);Cell cell4 = row.createCell(4);Cell cell5 = row.createCell(5);cell0.setCellValue(line1.substring(3));cell1.setCellValue(line2.substring(3));cell2.setCellValue(line3.substring(3));cell3.setCellValue(line4.substring(3));cell4.setCellValue(line5.substring(3));cell5.setCellValue(line6.substring(3));System.out.println("写数据结束!");while(line1!=null &&line2!=null &&line3!=null &&line4!=null &&line5!=null &&line6!=null){System.out.println(num);num++;line1 = in.readLine();line2 = in.readLine();line3 = in.readLine();line4 = in.readLine();line5 = in.readLine();line6 = in.readLine();//创建单元行row = sheetA.createRow(num);//每行插入6列元素cell0 = row.createCell(0);cell1 = row.createCell(1);cell2 = row.createCell(2);cell3 = row.createCell(3);cell4 = row.createCell(4);cell5 = row.createCell(5);if(line1==null){break;}cell0.setCellValue(line1.substring(3));cell1.setCellValue(line2.substring(3));cell2.setCellValue(line3.substring(3));cell3.setCellValue(line4.substring(3));cell4.setCellValue(line5.substring(3));cell5.setCellValue(line6.substring(3));}wb.write(fos);fos.close();wb.close();}

Java爬虫新浪微博的帖子相关推荐

  1. Java爬虫框架调研

    Python中大的爬虫框架有scrapy(风格类似django),pyspider(国产python爬虫框架). 除了Python,Java中也有许多爬虫框架. nutch apache下的开源爬虫程 ...

  2. java爬虫写一个百度图片下载器

    文章目录 img_download 1.0 看看效果吧 2.0 了解一下 "图片下载器软件" 目录结构 3.0 如何使用? 4.0 源码剖析 5.0 项目地址 6.0 写在最后的话 ...

  3. java爬虫系列(二)——爬取动态网页

    准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...

  4. java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  5. Java爬虫--json数据处理:JSONObject的使用

    Java爬虫,拿到了JSON格式的数据包,通过JSONObject可以比较容易得处理. 在Maven中添加依赖: <dependency><groupId>org.json&l ...

  6. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  7. java爬虫下载图片到磁盘_java入门爬虫(爬取网页的图片下载到本地磁盘)

    java爬虫入门技术 我们需要用到http协议 从而建立java程序和网页的连接 URL url = new URL("https://www.ivsky.com/tupian/ziranf ...

  8. JAVA爬虫https_java爬虫问题一:解决使用htmlunit 时候ssl认证失败问题

    java爬虫问题一:解决使用htmlunit 时候ssl认证失败问题 凯哥Java 凯哥java 前言: 在使用htmlunit 爬取其他网站信息的时候,提示错误信息:unable to find v ...

  9. 大数据互联网架构阶段 Java爬虫

    Java爬虫 一 . 爬虫简介 http://www.lete.com , 乐贷网其实就是爬虫的简单应用 ,发送一个商品连接 , 获取商品信息 目标 爬取京东所有商品的信息 封装在自己的Item实体类 ...

最新文章

  1. zeptojs-跑马灯效果
  2. .Net Core使用视图组件(ViewComponent)封装表单文本框控件
  3. 特斯拉Model3交付危机:周产5000辆仍需排队一年,造空者花式补刀
  4. java(5)——数据类型中的字符型和布尔类型
  5. Docker相关概念与安装(Docker-CE)
  6. 节能与新能源汽车技术路线图2.0 pdf_《节能与新能源汽车技术路线图(2.0版)》正式发布...
  7. 结构体06:结构体const使用场景
  8. 接口测试(二)--APP抓包
  9. java题角色信息管理,java题库专家信息管理系统
  10. Glide在github上的jar包下载方法
  11. 排序算法2:直接选择排序
  12. 计算机相关论文摘要,计算机类论文摘要
  13. maven parent 覆盖_Maven 最佳实践之 · 一个好的 parent 依赖基础
  14. 继电器互锁功能的实现
  15. ThingJS学习笔记
  16. sqlite C接口增删改查,数据库优化
  17. 8253(8254)计时/计数器简介
  18. compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别
  19. 互联网老兵:第一代程序员简晶 最老站长华军
  20. 计算机储存配置信息,怎么看电脑配置信息

热门文章

  1. iPhone 6现身日本亚马逊 加尺寸不加重量
  2. eureka双节点注册中心打包成功后无法启动
  3. 浅析云服务器常见的维护技巧
  4. 等保测评之安全物理环境、安全管理
  5. CC1310模块上电问题
  6. Mac系统-npm安装淘宝镜像
  7. Java爬虫饿了么商铺证书_美团、饿了么、百度外卖三大外卖平台的店铺、菜品数据爬虫源码...
  8. Python基础(九)Python3 面向对象
  9. 抗击疫情四大5G典型应用场景,催化5G深刻改变社会
  10. AnyCasting压铸局部挤压功能