简单的网络爬虫,下载GitHub的头像

基于Web Magic的一个爬虫框架(https://github.com/code4craft/webmagic)开发的,可以下载github的用户的头像。

使用Apache的HttpClient对页面进行请求,用JSoup对下载来的html文档进行过滤找到合适的图片链接,再发送一次HttpRequest去下载图片并保存到本地。

  1 package webcrawler.webcrawler;
  2 import java.awt.im.InputContext;
  3 import java.io.ByteArrayInputStream;
  4 import java.io.File;
  5 import java.io.FileOutputStream;
  6 import java.io.IOException;
  7 import java.io.InputStream;
  8 import java.net.URL;
  9 import java.util.ArrayList;
 10 import java.util.Date;
 11 import java.util.HashMap;
 12 import java.util.HashSet;
 13 import java.util.Iterator;
 14 import java.util.List;
 15 import java.util.Map;
 16 import java.util.Set;
 17
 18 import org.apache.http.HttpEntity;
 19 import org.apache.http.HttpResponse;
 20 import org.apache.http.client.ClientProtocolException;
 21 import org.apache.http.client.HttpClient;
 22 import org.apache.http.client.methods.HttpGet;
 23 import org.apache.http.client.utils.HttpClientUtils;
 24 import org.apache.http.impl.client.DefaultHttpClient;
 25 import org.apache.http.impl.client.HttpClientBuilder;
 26
 27 import us.codecraft.webmagic.Page;
 28 import us.codecraft.webmagic.Site;
 29 import us.codecraft.webmagic.Spider;
 30 import us.codecraft.webmagic.pipeline.ConsolePipeline;
 31 import us.codecraft.webmagic.processor.PageProcessor;
 32
 33 public class GithubAvaterDownLoaderProcessor implements PageProcessor {
 34
 35     private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
 36     Set<String> globalSet= new HashSet();
 37     int index=1;
 38
 39     public void process(Page page) {

       /*在主函数里,实例化Spider时,此GithubAvaterDownLoaderProcessor的实例会赋给Spider实例里的PageProcessor实例。
        run()方法里面会使用该GithubAvaterDownLoaderProcessor实例去调用这里的process方法,彼时page实例已得到 */

 40         List<String> listWithFollowers = new ArrayList<String>();
 41         for(String ori:page.getHtml().links().regex("(https://github\\.com/\\w+)").all()){
 42             listWithFollowers.add(ori+"/followers");
 43             listWithFollowers.add(ori+"/following");
 44         }
 45
 46         page.addTargetRequests(listWithFollowers);
 47
 48         MyPage myPage=new MyPage(page);
 49         page.putField("nameLinkMap", myPage.getMap());
 50
 51
 52         this.downLoadAavePicToLocal(page);  //发送下载请求并保存到本地
 53         globalSet.addAll(myPage.getMap().keySet()); //将访问过名字存入一个set,以后可以用来检查是否某用户已经访问过,存在该set里就可以跳过不去请求了
 54     }
 55
 56
 57     public void downloadSavePicToLocal(Page page) {
 58         HttpClient client= HttpClientBuilder.create().build();
 59         Map map= page.getResultItems().get("nameLinkMap");
 60
 61             Iterator<String> mapItor=map.keySet().iterator();
 62             while (mapItor.hasNext()) {   //迭代用户名为key,用户头像链接为value的map
 63                 String name=mapItor.next();
 64                 if(globalSet.contains(name)) //检测是否访问过
 65                     continue;
 66
 67                 String link =(String) map.get(name);
 68                 HttpGet getRequest= new HttpGet(link);
 69                 try {
 70                     HttpResponse response = client.execute(getRequest);
 71                     HttpEntity entity=response.getEntity();
 72                     InputStream is= entity.getContent();
 73                     File AvaterFolder= new File(".\\AvatersFolder");
 74                     if(!AvaterFolder.exists()) AvaterFolder.mkdirs();
 75
 76                     File file=new File(AvaterFolder+File.separator+index++ +" "+name+".jpg");
 77
 78                     FileOutputStream fileOutputStream= new FileOutputStream(file);
 79                     byte[] bytes= new byte[1024];
 80                     int length;
 81                     while((length=is.read(bytes,0,bytes.length))!=-1){
 82                         fileOutputStream.write(bytes, 0, length);
 83                     }
 84                     fileOutputStream.flush();
 85                     is.close();
 86                     fileOutputStream.close();
 87
 88                 } catch (Throwable e) {
 89                     e.printStackTrace();
 90                 }
 91             }
 92     }
 93
 94     public Site getSite() {
 95         return site;
 96     }
 97
 98     public static void main(String[] args) {
 99       Spider.create(new GithubAvaterDownLoaderProcessor())
100         .addPipeline(new MyConsolePipeline())
101         .addUrl("https://github.com/code4craft/webmagic/followers") //种子链接
102         .thread(2)
103         .run();
104     }
105 }
 1 package webcrawler.webcrawler;
 2
 3
 4
 5 import java.util.ArrayList;
 6 import java.util.HashMap;
 7 import java.util.List;
 8 import java.util.Map;
 9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
11
12 import javax.management.remote.SubjectDelegationPermission;
13
14 import org.jsoup.Jsoup;
15 import org.jsoup.nodes.Document;
16 import org.jsoup.nodes.Element;
17
18 import us.codecraft.webmagic.Page;
19 import us.codecraft.webmagic.selector.Html;
20 import us.codecraft.webmagic.utils.UrlUtils;
21
22 public class MyPage{
23     private String rString;
24     private Map<String,String> map;
25
26     public Map getMap(){
27         return this.map;   //用来返回此map,用户名为key,用户头像链接为value
28     }
29
30     public MyPage(Page page) {
31         rString= page.getRawText();
32         map = new HashMap();
33         Document document=Jsoup.parse(rString);   //用JSoup去parse页面
34         List<Element> listOfElements = document.select("img.gravatar");  //CSS selector 去定位元素
35         for(Element element:listOfElements){
36             map.put((String)element.attr("alt"), getCleanOne((String)element.attr("src")));  //保存到map, 用户名为key,该用户头像链接为value
37         }
38     }
39     public String getCleanOne(String s) {
40         Pattern pattern = Pattern.compile("https://avatars\\d\\.githubusercontent\\.com/u/\\d+");  //只寻找符合此条件的链接
41         Matcher matcher=pattern.matcher(s);
42         if(matcher.find())
43             return matcher.group();
44         return null;
45     }
46
47 }
时间: 2024-08-08 17:42:11

简单的网络爬虫,下载GitHub的头像的相关文章

Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)

Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起来比urllib更加简洁方便. requests是第三方库,使用前需要通过pip安装. pip install requests 1.基本用法: import requests #以百度首页为例 response = requests.get('http://www.baidu.com') #res

爬虫学习之一个简单的网络爬虫

这是一个网络爬虫学习的技术分享,主要通过一些实际的案例对爬虫的原理进行分析,达到对爬虫有个基本的认识,并且能够根据自己的需要爬到想要的数据.有了数据后可以做数据分析或者通过其他方式重新结构化展示. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.via 百度百科网络爬虫 网络蜘蛛(Web spider)也叫网络爬虫(Web c

利用Python编写网络爬虫下载文章

#coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期>的一些消息" target="_blank" href="http://blog.sina.com.cn/s/blog_4701280b0102eo83.html"><论电影的七个元素>——关于我对电…</a>' impo

用Python写一个最简单的网络爬虫

什么是网络爬虫?这是百度百科的解释: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫. 爬虫可以做什么?爬虫可以帮助我们在茫茫互联网中爬取我们需要的特定数据,这个特定数据可以是任何想获得的数据. 爬虫是一个让人热血的话题,因为当你在写爬虫的时候,你会感觉到自己是在做一件很NB的事,而每当写出一个爬虫,就会在此基础上不断尝试写出更NB的爬虫,有

在python3中使用urllib.request编写简单的网络爬虫

Python官方提供了用于编写网络爬虫的包 urllib.request, 我们主要用它进行打开url,读取url里面的内容,下载里面的图片. 分以下几步: step1:用urllib.request.urlopen打开目标网站 step2:由于urllib.request.urlopen返回的是一个http.client.HTTPResponse object,无法直接读取里面的内容,所以直接调用该对象的方法read(),获取到页面代码,存到html里 step3:构建正则表达式,从页面代码里

也写一个简单的网络爬虫

引子 在cnblogs也混了许久,不过碍于平日工作太忙,一篇随笔也没有写过.最近经常感觉到自己曾经积累过的经验逐步的丢失,于是开通了博客,主要是记录一下自己在业余时间里玩的一些东西. 缘起 言归正传.某次在在某高校网站闲逛,看到了一些有趣的东西想要保存起来,但是却分散在各个页面,难以下手.使用baidu,google却有无法避免的搜索到此站点之外的内容.于是就想如果有一个爬虫,可以抓取指定域名的某些感兴趣的内容,不是很好.在网上简单搜索了一下,简单的都不满意,功能强大的又太复杂,就想自己写一个.

爬虫其实很简单!——网络爬虫快速实现(一)

今天我来带领大家一起学习编写一个网络爬虫!其实爬虫很简单,没有想象中那么难,也许所有学问都是这样,恐惧源自于无知.废话不多说,现在开始我们的爬虫之旅吧. 爬虫是什么? 我们时常听说编程大牛嘴边一直念叨着"网络爬虫",那网络爬虫究竟是何方神圣呢? 网络爬虫能够模仿用户浏览网页,并将所想要的页面中的信息保存下来.有些同学不禁要问:"我自己浏览网页,可以手动将数据保存下来啊,为何要写个程序去爬取数据呢?"道理其实很简单,程序能够在短时间内访问成千上万的页面,并且在短时间内

python实现网络爬虫下载天涯论坛帖子

最近发现天涯论坛是一个挺有意思的网站,有各种乱七八糟的帖子足以填补无聊时候的空虚感,但是相当不爽的一件事就是天涯的分页模式下想连贯的把楼主的内容看完实在是太心酸了,一个999页的帖子,百分之九十都是无聊网友的灌水,有时候连续翻几十页才能找到楼主的一条内容.所以无聊之下,就打算写一个简单的爬虫,能一次性把某一个帖子下楼主的所有内容一次性的下载下来.好吧,说了这么多废话,现在开始讲点正事. 网页的地址形式:http://bbs.tianya.cn/post-no05-355576-1.shtml,其

用urllib2实现简单的网络爬虫1

玩python的同学都避免不了想写个爬虫玩玩,并且一般都以抓取XX图片为主,当然楼主也不例外~~ 这里先用比较原始的方式:urllib2 + 正则表达式,后面再尝试requests 背景:假设有个网站,是关于一些艺术家及其作品介绍的,登陆进去后,每一页是艺术家的头像和名字列表(由于艺术家很多,所以有很多页):  点击艺术家的头像或名字,就进入该艺术家的主页,主页上有该艺术家的详细介绍和作品列表(由于每个艺术家有很多作品,所有可能会有很多页):   点击其中一部作品,就进入该作品的详细介绍页面,包