依赖httpclient4.2,Jsop

SemeiziCrawler.java

  1. package kidbei.learn.crawler;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.StringWriter;
  9. import java.util.ArrayList;
  10. import java.util.Iterator;
  11. import java.util.List;
  12.  
  13. import org.apache.commons.io.IOUtils;
  14. import org.apache.http.HttpEntity;
  15. import org.apache.http.HttpResponse;
  16. import org.apache.http.client.methods.HttpGet;
  17. import org.apache.http.impl.client.DefaultHttpClient;
  18. import org.apache.http.util.EntityUtils;
  19. import org.jsoup.Jsoup;
  20. import org.jsoup.nodes.Document;
  21. import org.jsoup.nodes.Element;
  22. import org.jsoup.select.Elements;
  23. /**
  24. * http://sejie.wanxun.org/post/2012-09-25/40039413449
  25. * @author Administrator
  26. *
  27. */
  28. public class SemeiziCrawler {
  29. private static final String BASEHOST = "http://sejie.wanxun.org/";
  30. private static DefaultHttpClient client = ConnectionManager.getHttpClient();
  31. static String url = "http://sejie.wanxun.org/post/2012-09-25/40039413449";
  32. private static String IMGPATH = "D:\\sexpicture\\色戒美眉图"+File.separator+StringUtil.getDate();
  33. static int STARTPAGE = 1;
  34. static int PAGECOUNT = 100;
  35.  
  36. public static void main(String[] args) {
  37. File f = new File(IMGPATH);
  38. if(!f.exists()){
  39. f.mkdirs();
  40. }
  41. String host = BASEHOST ;
  42. for(int i=STARTPAGE;i<PAGECOUNT;i++){
  43. if(i != 1){
  44. host = BASEHOST+"page/"+i;
  45. }
  46. System.out.println("进入第"+i+"页");
  47. String pageContext = getResultByUrl(host);
  48. // System.out.println(pageContext);
  49. List<String>articleURLS = getArticleURL(pageContext);
  50. for(String articleURL:articleURLS){
  51. String articleContext = getResultByUrl(articleURL);
  52. List<String> ImgURLS = getImgURLS(articleContext);
  53. for(String ImgURL:ImgURLS){
  54. savepic(ImgURL);
  55. }
  56. }
  57. }
  58. // String articleContext = getResultByUrl(url);
  59. // List<String> strs = getImgURLS(articleContext);
  60. // for(String str:strs){
  61. // System.out.println(str);
  62. // }
  63. }
  64. /**
  65. * 根据url获取页面
  66. * @param url
  67. * @return
  68. */
  69. public static String getResultByUrl(String url){
  70. System.out.println("打开网页"+url);
  71. HttpGet get = new HttpGet(url);
  72. HttpEntity entity = null;
  73. HttpResponse response = null;
  74. try {
  75. response = client.execute(get);
  76. entity = response.getEntity();
  77. if(entity != null){
  78. InputStream is = entity.getContent();
  79. StringWriter sw = new StringWriter();
  80. IOUtils.copy(is, sw, "UTF-8");
  81. is.close();
  82. sw.close();
  83. return sw.toString();
  84. }
  85. } catch (Exception e) {
  86. System.out.println("网页打开出错");
  87. return null;
  88. }finally{
  89. get.abort();
  90. try {
  91. EntityUtils.consume(entity);
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. return null;
  97. }
  98. /**
  99. * 找出当前页面中所有帖子的地址
  100. * @param pageStr 网页字符串
  101. * @return
  102. */
  103. public static List<String> getArticleURL(String pageContext){
  104. if(pageContext == null){
  105. return null;
  106. }
  107. List<String> articleURLS = new ArrayList<String>();
  108. System.out.println("寻找帖子...........");
  109. try {
  110. Document doc = Jsoup.parseBodyFragment(pageContext);
  111. Elements es = doc.select("div.post");
  112. es = es.select("div[class=post-item type-photo]");
  113. es = es.select("div.meta a:containsOwn(全文)");
  114. for(Element e:es){
  115. articleURLS.add(e.attr("href"));
  116. }
  117. } catch (Exception e) {
  118. e.printStackTrace();
  119. return null;
  120. }
  121. return articleURLS;
  122. }
  123. /**
  124. * 获取帖子的图片地址
  125. * @param articleURLS
  126. * @return
  127. */
  128. public static List<String> getImgURLS(String articleContext){
  129. List<String>ImgURLS = new ArrayList<String>();
  130. if(articleContext == null){
  131. return null;
  132. }
  133. System.out.println("获取图片地址-----------");
  134. Document doc = Jsoup.parse(articleContext);
  135. Elements es = doc.select("a[target=_blank] img[src]");
  136. for(Iterator<Element> i=es.iterator();i.hasNext();){
  137. Element e = i.next();
  138. ImgURLS.add(e.attr("src"));
  139. }
  140. return ImgURLS;
  141. }
  142. /**
  143. * 保存图片
  144. * @param ImgURL
  145. */
  146. public static void savepic(String ImgURL){
  147. if(ImgURL == null){
  148. return ;
  149. }
  150. HttpGet get = new HttpGet(ImgURL);
  151. String[] strs = ImgURL.split("/");
  152. String fileName = strs[strs.length-1];
  153. String savePath = IMGPATH+File.separator+fileName;
  154. HttpEntity entity = null;
  155. try {
  156. HttpResponse response = client.execute(get);
  157. entity = response.getEntity();
  158. System.out.println("保存图片>>>>.>>>>>>"+fileName);
  159. InputStream is = entity.getContent();
  160. OutputStream os = new FileOutputStream(savePath);
  161. IOUtils.copy(is, os);
  162. IOUtils.closeQuietly(os);
  163. IOUtils.closeQuietly(is);
  164. } catch (Exception e) {
  165. e.printStackTrace();
  166. System.out.println("图片保存失败");
  167. return ;
  168. }
  169. }
  170. }

StringUtil.java

  1. package kidbei.learn.crawler;
  2.  
  3. import java.io.File;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.Random;
  7.  
  8. public class StringUtil {
  9. public static String getRandomString(){
  10. StringBuffer generateRandStr = new StringBuffer();
  11. Random rand = new Random();
  12. int length = 6;
  13. char ch;
  14. for(int i=0;i<length;i++)
  15. {
  16. int randNum = Math.abs(rand.nextInt())%26+97; // 产生97到122的随机数(a-z的键位值)
  17. ch = ( char ) randNum;
  18. generateRandStr.append( ch );
  19. }
  20. return generateRandStr.toString();
  21. }
  22.  
  23. public static String getSavePath(String IMGPATH,String fileName){
  24. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  25. String date = sdf.format(new Date()).toString();
  26. if(!(fileName.endsWith(".jpg"))){
  27. fileName = fileName + ".jpg";
  28. }
  29. String randStr = StringUtil.getRandomString();
  30. return IMGPATH+File.separator+date+File.separator+randStr+fileName;
  31. }
  32.  
  33. public static String getDate(){
  34. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  35. return sdf.format(new Date()).toString();
  36. }
  37. }

ConnectionManager.java

  1. package kidbei.learn.crawler;
  2.  
  3. import org.apache.http.conn.scheme.PlainSocketFactory;
  4. import org.apache.http.conn.scheme.Scheme;
  5. import org.apache.http.conn.scheme.SchemeRegistry;
  6. import org.apache.http.conn.ssl.SSLSocketFactory;
  7. import org.apache.http.impl.client.DefaultHttpClient;
  8. import org.apache.http.impl.conn.PoolingClientConnectionManager;
  9. import org.apache.http.params.BasicHttpParams;
  10. import org.apache.http.params.CoreConnectionPNames;
  11. import org.apache.http.params.CoreProtocolPNames;
  12. import org.apache.http.params.HttpParams;
  13.  
  14. public class ConnectionManager {
  15. static final int TIMEOUT = 20000;//连接超时时间
  16. static final int SO_TIMEOUT = 20000;//数据传输超时
  17. static String UA = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1" +
  18. " (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1";
  19.  
  20. public static DefaultHttpClient getHttpClient(){
  21. SchemeRegistry schemeRegistry = new SchemeRegistry();
  22. schemeRegistry.register(
  23. new Scheme("http",80,PlainSocketFactory.getSocketFactory()));
  24. schemeRegistry.register(
  25. new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
  26.  
  27. PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);
  28. cm.setMaxTotal(500);
  29. cm.setDefaultMaxPerRoute(200);
  30.  
  31. HttpParams params = new BasicHttpParams();
  32. params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,TIMEOUT);
  33. params.setParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
  34. params.setParameter(CoreProtocolPNames.USER_AGENT, UA);
  35.  
  36. DefaultHttpClient client = new DefaultHttpClient(cm,params);
  37. return client;
  38. }
  39. }

本文转自:http://www.oschina.net/code/snippet_257479_14524#23843

httpclient爬取性感美图的更多相关文章

  1. scrapy实战--爬取最新美剧

    现在写一个利用scrapy爬虫框架爬取最新美剧的项目. 准备工作: 目标地址:http://www.meijutt.com/new100.html 爬取项目:美剧名称.状态.电视台.更新时间 1.创建 ...

  2. 爬虫实战2:爬头条网美图--Ajax图片加载处理

    完整代码经测试可成功运行,目的是抓取头条网输入街拍后的图片,涉及的知识点如下 1. md5加密使用方法 方法1:不创建实例对象,直接使用 >>> from hashlib impor ...

  3. Android 性感美图在线浏览APP

    周末无聊,遂整理了下近来常用的几个开源库,无意间又发现了一些开放接口,于是乎决定融合在一起,做个简单的"性感美图"浏览的APP,名字呢,就叫"性感沙滩",效果如 ...

  4. Python爬取 | 唯美女生图片

    这里只是代码展示,且复制后不能直接运行,需要配置一些设置才行,具体请查看下方链接介绍: Python爬取 | 唯美女生图片 from selenium import webdriver from fa ...

  5. python 爬取天猫美的评论数据

    笔者最近迷上了数据挖掘和机器学习,要做数据分析首先得有数据才行.对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫在网络上爬取数据了.本文记录一下笔者爬取天猫某商品的全过程,淘宝上面的店铺也是类似 ...

  6. 练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)

    要看一种技术在本地的流行程度,最简单的就是找招聘网站按关键词搜索. 比如今天查到的职位数量是vue 1296个,react 1204个,angular 721个.国际上比较流行的是react,本地市场 ...

  7. 用python写一个爬虫——爬取性感小姐姐

    忍着鼻血写代码 今天写一个简单的网上爬虫,爬取一个叫妹子图的网站里面所有妹子的图片. 然后试着先爬取了三页,大概有七百多张图片吧!各个诱人的很,有兴趣的同学可以一起来爬一下,大佬级程序员勿喷,简单爬虫 ...

  8. Scrapy框架学习(四)爬取360摄影美图

    我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求, 其中list就是图片的详细信息,接着观察到每 ...

  9. python 爬取京东手机图

    初学urllib,高手勿喷... import re import urllib.request #函数:每一页抓取的30张图片 def craw(url,page): imagelist = []# ...

随机推荐

  1. Android读写assets、raw、sdard和工程文件的方法

    Android开发离不开对文件的操作,前面的文章“Android简易数据存储之SharedPreferences”和“Android数据存储之SQLite的操作”,分别讲解了简单的数据的存储和数据库数 ...

  2. win平台检查内存泄露

    int main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetBre ...

  3. iOS NSOperation的使用

    先给出NSOpetation的官方指导https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation ...

  4. 转MYSQL学习(三) 函数

    这一节主要介绍MYSQL里的函数,MYSQL里的函数很多,我这里主要介绍MYSQL里有而SQLSERVER没有的函数 数学函数 1.求余函数MOD(X,Y) MOD(X,Y)返回x被y除后的余数,MO ...

  5. codeforces C. Arithmetic Progression 解题报告

    题目链接:http://codeforces.com/problemset/problem/382/C 题目意思:给定一个序列,问是否可以通过只插入一个数来使得整个序列成为等差数列,求出总共有多少可能 ...

  6. Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具

    一:CPU 1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比. 系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比.系统态CPU高意味着共享资源有竞争或者I/O设备之间 ...

  7. 修改PHP网站默认首页

    一般默认的首页文件是index.php index.php3 index.html index.htm之类的,要想修改为myNewIndex.php, 进入服务器Apache目录,找到httpd.co ...

  8. mysql自增字段重排 或 归零

    由于删除了某些记录行,所以自增字段不连续了.重排或归零的方法:方法1:truncate table 你的表名//这样不但重新定位自增的字段,而且会将表里的数据全部删除,慎用!方法2:delete fr ...

  9. Git Server & Git Hook

    http://ju.outofmemory.cn/entry/16893 我喜欢 github,我现在的个人代码全部是托管在上面了,但是一些公司或者某些项目不适合放入github中,你希望能有一个完全 ...

  10. hdu 3746 kmp求循环节

    题意就是将所给的字符串变成多个完整的循环(至少两个),然后给出最少需要添加的字符数.