最近在学习搜索方面的东西, 需要了解网络爬虫方面的知识, 虽然有很多开源的强大的爬虫, 但本着学习的态度, 想到之前在做资讯站的时候需要用到爬虫来获取一些文章, 今天刚好有空就研究了一下. 在网上看到了一个 demo, 使用的是 Jsoup, 我拿过来修改了一下, 有需要的朋友可以参考
前言
需要提前说下的是, 由于今日头条的文章的特殊性, 所以无法直接获取文章的地址, 需要获取文章的 id 然后在拼接成 url 再访问下面话不多说了, 直接上代码
示例代码如下
- public class Demo2 {
- public static void main(String[] args) {
- // 需要爬的网页的文章列表
- String url = "http://www.toutiao.com/news_finance/";
- // 文章详情页的前缀(由于今日头条的文章都是在 group 这个目录下, 所以定义了前缀, 而且通过请求获取到的 html 页面)
- String url2="http://www.toutiao.com/group/";
- // 链接到该网站
- Connection connection = Jsoup.connect(url);
- Document content = null;
- try {
- // 获取内容
- content = connection.get();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 转换成字符串
- String htmlStr = content.html();
- // 因为今日头条的文章展示比较奇葩, 都是通过 js 定义成变量, 所以无法使用获取 dom 元素的方式获取值
- String jsonStr = StringUtils.substringBetween(htmlStr,"var _data =", ";");
- System.out.println(jsonStr);
- Map parse = (Map) JSONObject.parse(jsonStr);
- JSONArray parseArray = (JSONArray) parse.get("real_time_news");
- Map map=null;
- List<Map> maps=new ArrayList<>();
- // 遍历这个 jsonArray, 获取到每一个 json 对象, 然后将其转换成 Map 对象(在这里其实只需要一个 group_id, 那么没必要使用 map)
- for(int i=0;i<parseArray.size();i++){
- map = (Map)parseArray.get(i);
- maps.add((Map)parseArray.get(i));
- System.out.println(map.get("group_id"));
- }
- // 遍历之前获取到的 map 集合, 然后分别访问这些文章详情页
- for (Map map2 : maps) {
- connection = Jsoup.connect(url2+map2.get("group_id"));
- try {
- Document document = connection.get();
- // 获取文章标题
- Elements title = document.select("[class=article-title]");
- System.out.println(title.html());
- // 获取文章来源和文章发布时间
- Elements articleInfo = document.select("[class=articleInfo]");
- Elements src = articleInfo.select("[class=src]");
- System.out.println(src.html());
- Elements time = articleInfo.select("[class=time]");
- System.out.println(time.html());
- // 获取文章内容
- Elements contentEle = document.select("[class=article-content]");
- System.out.println(contentEle.html());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
总结
来源: http://www.phperz.com/article/18/0222/359496.html