java爬虫抓取腾讯漫画评论
package com.eteclab.wodm.utils; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; public class MySearchTest2 {
private final static Executor executor = Executors.newCachedThreadPool();// 启用多线程
private static String mainUrl = "http://ac.qq.com/Comic/index/state/pink/page/";// 可以根据腾讯漫画的分类来进行抓取
private static String url = "http://ac.qq.com/Jump";// +/Comic/comicInfo/id/11111
// 可以获取具体的漫画页面 public static void main(String[] args) {
for (int i = 1; i <= 144; i++) {//可以分析漫画的总页数来进行调用
final int j = i;
executor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("begin*************第" + j + "页");
getArticleListFromUrl(mainUrl + j, j);
System.out.println("end*************第" + j + "页");
} catch (Exception e) {
System.err.println("**********************获取漫画错误**********************");
e.printStackTrace();
}
}
}); }
} /**
* 获取日漫列表
*
* @param listurl
*/
public static void getArticleListFromUrl(String listurl, int j) {
Document doc = null;
try {
doc = Jsoup
.connect(listurl)
.userAgent(
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
.timeout(3000).get();
} catch (IOException e) {
System.err.println("**********************获取评论请求错误**********************");
e.printStackTrace();
}
// System.out.println(doc);
Elements elements = doc.getElementsByTag("a");// 找到所有a标签
for (Element element : elements) {
String relHref = element.attr("href"); // ==
// "/"这个是href的属性值,一般都是链接。这里放的是漫画的连接
String linkHref = element.text();
// 用if语句过滤掉不是漫画链接的内容
if (!relHref.startsWith("http://")
&& relHref.contains("/Comic/comicInfo/id")) {
StringBuffer sb = new StringBuffer();
sb.append(url).append(relHref);
String id = sb.substring(sb.lastIndexOf("/") + 1);
try {
for (int i = 1; i <= 50; i++) {//默认取50页评论
getArticleFromUrl(sb.toString(), Integer.valueOf(id),
i, j);// 查询第i页的评论
}
} catch (Exception e) {
// TODO: handle exception
System.err.println("**********************获取评论分页错误**********************");
e.printStackTrace();
}
}
} } /**
* 获取评论内容,调用评论接口主要就是要获取漫画页面的cookies信息,调用时一起传过去;
*
* @param detailurl
* 评论的url
* @param id
* 资源id
* @param page
* 评论页数
*/
public static void getArticleFromUrl(String detailurl, Integer id,
Integer page, Integer mainIndex) {
try {
long i = System.currentTimeMillis();// 生成时间戳
Connection connect = Jsoup
.connect("http://ac.qq.com/Community/topicList?targetId="
+ id + "&page=" + page + "&_=" + i);
Map<String, String> header = new HashMap<String, String>();
header.put("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0");
header.put(
"Referer",
"http://ac.qq.com/Comic/ComicInfo/id/530132?trace_id=1_907_10.194.156.134_1504854317");
header.put(
"Cookie",
"LW_uid=q19499A3B6c0z0Y4z0k5h18046; pgv_pvid=8070181612; eas_sid=11O4U96326x0V0r4j0I5b2c073; pgv_pvi=623979520"
+ "; pt2gguin=o0877101804; RK=zfdTLMzqZc; ptcz=264e6df783796823cf379b14e6aef6aa3be6a4e2fb4b6126692ee05c2a0b0c4c"
+ "; ue_ts=1493600756; ue_uk=a058f8c6bbbe035c75bece7707297348; ue_uid=e5fb4837d184233402086deba8d197aa;"
+ " ue_skey=0e157906ef4cb8f560768be75c751a72; LW_pid=7813c0ffd4b168e438f4a5a82ad1c993; ts_uid=2015751548"
+ "; ts_refer=www.baidu.com/link; theme=white; roastState=2; readRecord=%5B%5B505430%2C%22%E8%88%AA%E6%B5"
+ "%B7%E7%8E%8B%22%2C888%2C%22%E7%AC%AC871%E8%AF%9D%20%E5%8A%A0%E6%B2%B9%E5%95%8A%EF%BC%81%E5%87%AF%E6%92"
+ "%92%EF%BC%81%EF%BC%81%22%2C871%5D%5D; readLastRecord=%5B%5D; pgv_si=s8053975040; pgv_info=ssid=s26281936"
+ "; ts_last=ac.qq.com/Comic/ComicInfo/id/530132; girlHideState=1; topicPop=1; pc_userinfo_cookie=; o_cookie"
+ "=877101804");
Connection data = connect.headers(header);
Document document = data.get();
Elements elements = document.getElementsByAttributeValue("class",
"comment-content-detail");
List<String> commList = new ArrayList<String>();
for (Element element : elements) {
commList.add(element.text());
} /*JSONArray json = new JSONArray();
for (int j = 0; j < commList.size(); j++) {
JSONObject jo = new JSONObject();
jo.put("comment", commList.get(j));
json.add(jo);
}
String comment = json.toString();*/
String comment = StringUtils.listToString(commList, '\r');
String date = DateUtilsTool.getLongDate(new Date());
String indexString = formatCode(mainIndex.toString());
saveArticle(date +indexString , comment); } catch (IOException e) {
System.err.println("**********************获取评论错误**********************");
e.printStackTrace();
} } private static String formatCode(String code) {
StringBuilder sb = new StringBuilder();
int a = 4 - code.length();
if (a < 0) {
throw new RuntimeException("formatCode错误 code超过9999");
}
for (int i = 0; i < a; i++) {
sb.append("0");
}
sb.append(code);
return sb.toString();
} /**
* 保存内容到本地
*
* @param titile
* @param content
* @param blogName
*/
public static void saveArticle(String titile, String content) {
String filePath = "d:\\MyLoadArticle\\" + titile + ".txt";// 保存到本地的路径和文件名
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
System.err.println("*******************读取文件错误*******************");
e.printStackTrace(); }
try {
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.flush();
bw.close();
fw.close();
} catch (IOException e) {
System.err.println("*******************写入文件错误*******************");
e.printStackTrace();
} } }
pom.xml文件需要添加的jar包
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
程序中的工具类:
//时间转换类
/**
* 将Date日期转换成String长类型的yyyyMMddHHmmss
* @author: Simon
* @date: 2017年9月9日 上午9:40:39
* @param date
* @return
*/
public static String getLongDate(Date date) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
String ret = sdf.format(date);
return ret;
}
//list根据给定的字符进行切割成String类型
/**
* list转string
* @author: Simon
* @date: 2017年9月9日 上午10:24:52
* @param list
* @param separator
* @return
*/
public static String listToString(List list, char separator) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
if (i == list.size() - 1) {
sb.append(list.get(i));
} else {
sb.append(list.get(i));
sb.append(separator);
}
}
return sb.toString();
}
java爬虫抓取腾讯漫画评论的更多相关文章
- 【Python3 爬虫】16_抓取腾讯视频评论内容
上一节我们已经知道如何使用Fiddler进行抓包分析,那么接下来我们开始完成一个简单的小例子 抓取腾讯视频的评论内容 首先我们打开腾讯视频的官网https://v.qq.com/ 我们打开[电视剧]这 ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据
最近整理一下手头上搞过的一些爬虫,有HttpClients+jsoup,Jsoup,htmlunit,HeadlessChrome 一,HttpClients+jsoup,这是第一代比较low,很快就 ...
- 用python实现的抓取腾讯视频所有电影的爬虫
1. [代码]用python实现的抓取腾讯视频所有电影的爬虫 # -*- coding: utf-8 -*-# by awakenjoys. my site: www.dianying.atim ...
- Python爬虫实现抓取腾讯视频所有电影【实战必学】
2019-06-27 23:51:51 阅读数 407 收藏 更多 分类专栏: python爬虫 前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问 ...
- Python爬虫---爬取腾讯动漫全站漫画
目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...
- 爬虫抓取页面数据原理(php爬虫框架有很多 )
爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...
- 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)
这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...
随机推荐
- TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
这个问题说的很清楚,就是类型不对,需要转化类型,首先讲一下这个问题是在使用pandas的resample函数激发的,官方文档解释的较为清楚,如下: Convenience method for fre ...
- 当WebView运行在特权进程时抛出安全异常,Hook方式解决方案(包含对Android 8.0的处理)
1.问题起源报错语句是:java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in ...
- Codeplex最流行25个开源项目
1. VMukti富媒体协作平台 2. Microsoft SQL Server Product Samples: Engine 3. Patterns & Practices: Enterp ...
- 【Python】批量查询-提取站长之家IP批量查询的结果v1.0
0 前言 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 1 使 ...
- 【C++】面试题目:从尾到头打印链表
通过<剑指offer 名企面试官精讲典型编程题>看到一道讲解链表的题目. 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值 链表定义如下: typedef struct _NO ...
- 高级 Java 面试通关知识点整理!
1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式:动态代理和静态代理,什么时候使用动态代理. ...
- Shell 中test 单中括号[] 双中括号[[]] 的区别
Shell test 单中括号[] 双中括号[[]] 的区别 在写Shell脚本的时候,经常在写条件判断语句时不知道该用[] 还是 [[]],首先我们来看他们的类别: $type [ [[ test ...
- zookeeper3.4.6配置实现自动清理日志
在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存 ...
- 04-Bootstrap的插件
1.下拉菜单 代码如下: <div class="dropdown"> <button class="btn btn-default dropdown- ...
- Python-JS基础(基础结构~函数)
程序本质上分为三大结构: 顺序结构.分支结构.循环结构JavaScript中的程序结构也是这样,下面我们来分别介绍JS中的三种基本程序结构:我们上篇博客中介绍到的使用逻辑运算符&&实现 ...