概述

使用jsoup来进行网页数据爬取。jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

详细

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

1. 从一个URL,文件或字符串中解析HTML;

2. 使用DOM或CSS选择器来查找、取出数据;

3. 可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目

第一步:项目预览

第二步:代码实现

主程序为GrapNews类,实现了从汽车网摘取相关内容的功能。GrapNews有main函数,执行即可。

  1. package net.sinolbs.ycd.news;
  2.  
  3. import java.net.URLEncoder;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8.  
  9. import org.jsoup.Jsoup;
  10. import org.jsoup.nodes.Document;
  11. import org.jsoup.nodes.Element;
  12. import org.jsoup.select.Elements;
  13.  
  14. /**
  15. * TODO
  16. * 2017年5月21日上午12:25:30
  17. */
  18. public class GrapNews {
  19.  
  20. public static boolean isContainChinese(String str) {
  21. Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
  22. Matcher m = p.matcher(str);
  23. if (m.find()) {
  24. return true;
  25. }
  26. return false;
  27. }
  28.  
  29. /**
  30. * 从笑话集抓取笑话
  31. * @param size
  32. * @param baseUrl
  33. * @param domainName
  34. * @param newsListClassOrId
  35. * @param classOrId
  36. * @param newsULIndex
  37. * @param newsContentClassOrId
  38. * @param titleTagOrClass
  39. * @param dateTag
  40. * @return
  41. */
  42. public static ArrayList<News> getNewsFromJokeji(int size,String baseUrl,String domainName,
  43. String newsListClassOrId,int newsULIndex,
  44. String newsContentClassOrId,String titleTagOrClass,String dateTag){
  45. ArrayList<News> newsList = new ArrayList<News>();
  46. Document doc;
  47. Element element =null;
  48. Element title =null;
  49. News news = null;
  50. try {
  51. doc = Jsoup.connect(baseUrl).timeout(10000).get();
  52. element = (Element) doc.getElementsByClass(newsListClassOrId).first();
  53. Elements elements = element.getElementsByTag("li");
  54. if(elements!=null&&elements.size()>0){
  55. for(Element ele:elements){
  56. news = new News();
  57. title = ele.select("a").first();
  58. if(title==null){
  59. continue;
  60. }
  61. news.setTitle(title.getElementsByTag(titleTagOrClass).text());
  62. if(news.getTitle()==null||news.getTitle().equals("")){
  63. continue;
  64. }
  65. news.setHref(domainName+title.attr("href"));
  66. if(dateTag!=null){
  67. String date=ele.select("i").text();
  68. news.setDate(date);
  69. }
  70. String newsUrl =news.getHref();
  71. if (isContainChinese(news.getHref())) {
  72. newsUrl = URLEncoder.encode(news.getHref(), "utf-8")
  73. .toLowerCase().replace("%3a", ":").replace("%2f", "/");
  74. }
  75. Document newsDoc = Jsoup.connect(newsUrl).timeout(10000).get();
  76. String text=newsDoc.getElementById(newsContentClassOrId).html();
  77. text=deleteImg(text);
  78. text=deleteA(text);
  79. StringBuffer textBuffer=new StringBuffer(5);
  80. textBuffer.append("<!DOCTYPE html><html><head><meta name=\"content-type\" content=\"text/html; charset=UTF-8\">");
  81. textBuffer.append("</head><body>");
  82. textBuffer.append(deleteSource(text));
  83. textBuffer.append("</body></html>");
  84. news.setContent(textBuffer.toString());
  85. news.setContent(textBuffer.toString());
  86. System.out.println("标题====="+news.getTitle());
  87. System.out.println("href====="+news.getHref());
  88. System.out.println("content====="+news.getContent());
  89. newsList.add(news);
  90. if(newsList.size()==size){
  91. break;
  92. }
  93. }
  94. }
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }
  98. return newsList;
  99. }
  100.  
  101. /**
  102. * 从汽车之家抓新闻
  103. * @param size
  104. * @param baseUrl
  105. * @param domainName
  106. * @param newsListId
  107. * @param newsContentClass
  108. * @param titleTagOrClass
  109. * @param limitHref
  110. * @param dateTag
  111. * @param needDeleteAlt
  112. * @return
  113. */
  114. public static ArrayList<News> getNewsFromCarHome(int size,String baseUrl,String domainName,String newsListId,
  115. String newsContentClass,String titleTag,String dateTag,String needDeleteAlt){
  116. ArrayList<News> newsList = new ArrayList<News>();
  117. Document doc;
  118. Elements elements =null;
  119. Element title =null;
  120. News news = null;
  121. try {
  122. doc = Jsoup.connect(baseUrl).timeout(10000).get();
  123. elements = (Elements) doc.getElementById(newsListId).children();
  124. if(elements!=null&&elements.size()>0){
  125. for(Element ele:elements){
  126. news = new News();
  127. title = ele.select("a").first();
  128. if(title==null){
  129. continue;
  130. }
  131. news.setTitle(title.getElementsByTag(titleTag).text());
  132. if(news.getTitle()==null||news.getTitle().equals("")){
  133. continue;
  134. }
  135. news.setHref(domainName+title.attr("href"));
  136. if(dateTag!=null){
  137. String date=ele.select("i").text();
  138. news.setDate(date);
  139. }
  140. String newsUrl =news.getHref();
  141. if (isContainChinese(news.getHref())) {
  142. newsUrl = URLEncoder.encode(news.getHref(), "utf-8")
  143. .toLowerCase().replace("%3a", ":").replace("%2f", "/");
  144. }
  145. Document newsDoc = Jsoup.connect(newsUrl).timeout(10000).get();
  146. String text=newsDoc.getElementsByClass(newsContentClass).html();
  147. if(text.indexOf("余下全文")>0||text.indexOf("未经许可")>0
  148. ||text.indexOf("禁止转载")>0||text.indexOf("公众号")>0||text.indexOf("公众账号")>0){
  149. continue;
  150. }
  151. text=replaceImgSrcFromDataSrc(text,true,needDeleteAlt);
  152. int index=text.lastIndexOf("(");
  153. if(index>0){
  154. text=text.substring(0,index);
  155. }
  156. StringBuffer textBuffer=new StringBuffer(5);
  157. textBuffer.append("<!DOCTYPE html><html><head><meta name=\"content-type\" content=\"text/html; charset=UTF-8\">");
  158. textBuffer.append("</head><body>");
  159. textBuffer.append(deleteSource(text));
  160. textBuffer.append("</body></html>");
  161. news.setContent(textBuffer.toString());
  162. news.setContent(textBuffer.toString());
  163. System.out.println("标题====="+news.getTitle());
  164. System.out.println("href====="+news.getHref());
  165. System.out.println("content====="+news.getContent());
  166. newsList.add(news);
  167. if(newsList.size()==size){
  168. break;
  169. }
  170. }
  171. }
  172. } catch (Exception e) {
  173. e.printStackTrace();
  174. }
  175. return newsList;
  176. }
  177.  
  178. public static String getVideoFromMiaoPai(String baseUrl) throws Exception{
  179. Document doc= Jsoup.connect(baseUrl).timeout(10000).get();
  180. String html=doc.html().trim();
  181. return getUrlFromMiaoPaiHtml(html);
  182. }
  183.  
  184. public static String getUrlFromMiaoPaiHtml(String html){
  185. int startIndex=html.indexOf("videoSrc");
  186. int endIndex=html.indexOf("poster");
  187. String videoUrl=html.substring(startIndex+11,endIndex+5);
  188. int index=videoUrl.indexOf('"');
  189. if(index>0){
  190. return videoUrl.substring(0, index);
  191. }
  192. return videoUrl;
  193. }
  194.  
  195. public static String getVideoPhotoFromMiaoPaiHtml(String html){
  196. System.out.println(html);
  197. int startIndex=html.indexOf("poster");
  198. int index=html.substring(startIndex).indexOf("jpg");
  199. return html.substring(startIndex+9,startIndex+index+3);
  200. }
  201.  
  202. public static void main(String[] args) throws Exception{
  203. getNewsFromCarHome(2,"http://m.autohome.com.cn/channel","http://m.autohome.com.cn","list","details","h4","time","汽车之家");
  204. getNewsFromJokeji(3,"http://www.jokeji.cn/list.htm","http://www.jokeji.cn","list_title",1,"text110","a","i");
  205. getNewsFromSouHu(20,"http://m.sohu.com/c/1592/","a",null,null);
  206. }
  207. /**
  208. * 从秒拍抓视频
  209. * @param size
  210. * @param baseUrl
  211. * @param domainName
  212. * @param newsListId
  213. * @param newsContentClass
  214. * @param titleTagOrClass
  215. * @param limitHref
  216. * @param dateTag
  217. * @param needDeleteAlt
  218. * @return
  219. */
  220. public static ArrayList<News> getVideoFromMiaopai(int size,String baseUrl){
  221. ArrayList<News> newsList = new ArrayList<News>();
  222. try {
  223. News news = null;
  224. Element videoEmement=null;
  225. Document doc = null;
  226. String videoUrl=null;
  227. doc = Jsoup.connect(baseUrl).timeout(10000).get();
  228. Elements elements = doc.getElementsByClass("videoCont");
  229. String videoDetailUrl="";
  230. if(elements!=null&&elements.size()>0){
  231. for(Element ele:elements){
  232. videoEmement=ele.getElementsByClass("MIAOPAI_player").first();
  233. String videoId=videoEmement.attr("data-scid").toString();
  234. String videoPhotoUrl=videoEmement.attr("data-img").toString();
  235. String videoTitle=ele.getElementsByClass("viedoAbout").first().getElementsByTag("p").text();
  236. System.out.println("视频id"+videoId);
  237. System.out.println("视频封面url"+videoPhotoUrl);
  238. System.out.println("视频标题"+videoTitle);
  239. news = new News();
  240. if(videoId!=null){
  241. news.setTitle(videoTitle);
  242. videoDetailUrl="http://www.miaopai.com/show/"+videoId+".html";
  243. doc = Jsoup.connect("http://www.miaopai.com/show/"+videoId+".html").timeout(10000).get();
  244. System.out.println("视频详情url========"+videoDetailUrl);
  245. news.setHref("http://m.miaopai.com/show/"+videoId);
  246. news.setPhotoUrl(videoPhotoUrl);
  247. }
  248. if(doc!=null){
  249. videoUrl=getUrlFromMiaoPaiHtml(doc.html());
  250. }
  251. if(videoUrl!=null){
  252. news.setContent(createVideoHtml(videoUrl, videoPhotoUrl));
  253. System.out.println("视频url====="+videoUrl);
  254. System.out.println("视频html======"+news.getContent());
  255. newsList.add(news);
  256. }
  257.  
  258. }
  259. }
  260. } catch (Exception e) {
  261. e.printStackTrace();
  262. }
  263. return newsList;
  264. }
  265.  
  266. public static String createVideoHtml(String videoUrl,String videoPhotoUrl) {
  267. Document doc;
  268. StringBuffer textBuffer = new StringBuffer(5);
  269. textBuffer.append("<!DOCTYPE html><html><head><meta name=\"content-type\" content=\"text/html; charset=UTF-8\">");
  270. textBuffer.append("</head><body>");
  271. textBuffer.append("<div align=\"center\">");
  272. textBuffer.append(" <video></video> </div>");
  273. textBuffer.append("</body></html>");
  274. doc = Jsoup.parse(textBuffer.toString());
  275. doc.getElementsByTag("body").attr("style", "height:400px;");
  276. doc.getElementsByTag("video").attr("style", "width:100%;max-height:400px;")
  277. .attr("poster", videoPhotoUrl).attr("autoplay", "autoplay")
  278. .attr("controls", "controls").attr("src", videoUrl);
  279. return doc.toString();
  280. }
  281.  
  282. /**
  283. * 从搜狐抓新闻
  284. * @param size
  285. * @param baseUrl
  286. * @param domainName
  287. * @param newsListId
  288. * @param newsContentClass
  289. * @param titleTagOrClass
  290. * @param limitHref
  291. * @param dateTag
  292. * @param needDeleteAlt
  293. * @return
  294. */
  295. public static ArrayList<News> getNewsFromSouHu(int size,String baseUrl,
  296. String titleTag,String dateTag,String needDeleteAlt){
  297. ArrayList<News> newsList = new ArrayList<News>();
  298. Document doc;
  299. Element element =null;
  300. Element title =null;
  301. News news = null;
  302. try {
  303. doc = Jsoup.connect(baseUrl).timeout(10000).get();
  304. element =doc.getElementsByTag("section").get(2);
  305. element = element.getElementsByClass("headlines").get(0);
  306. Elements elements=element.children();
  307. if(elements!=null&&elements.size()>0){
  308. for(Element ele:elements){
  309. news = new News();
  310. title = ele.select("a").first();
  311. if(title==null){
  312. continue;
  313. }
  314. news.setTitle(title.getElementsByTag(titleTag).text());
  315. if(news.getTitle()==null||news.getTitle().equals("")
  316. ||news.getTitle().indexOf("广告")>0||news.getTitle().indexOf("视频")>0){
  317. continue;
  318. }
  319. news.setHref("https://m.sohu.com"+title.attr("href"));
  320. if(dateTag!=null){
  321. String dateStr=ele.select(dateTag).first().text();
  322. news.setDate(dateStr);
  323. }
  324. String newsUrl =news.getHref();
  325. if (isContainChinese(news.getHref())) {
  326. newsUrl = URLEncoder.encode(news.getHref(), "utf-8")
  327. .toLowerCase().replace("%3a", ":").replace("%2f", "/");
  328. }
  329. Document newsDoc = Jsoup.connect(newsUrl).timeout(10000).get();
  330. String text=newsDoc.getElementsByTag("article").html();
  331. if(text.indexOf("未经许可")>0||text.indexOf("禁止转载")>0
  332. ||text.indexOf("公众号")>0||text.indexOf("公众账号")>0){
  333. continue;
  334. }
  335. int index=text.indexOf("<p class=\"para\">");
  336. int lastIndex=text.indexOf("<div class=\"expend-wp\"> ");
  337. if(lastIndex>0){
  338. text=text.substring(index,lastIndex);
  339. }else if(index>0){
  340. text=text.substring(index,text.length());
  341. }
  342. text=replaceImgSrcFromDataSrc(text,true,null);
  343. if(text==null||text.length()==0){
  344. continue;
  345. }
  346. StringBuffer textBuffer=new StringBuffer(5);
  347. textBuffer.append("<!DOCTYPE html><html><head>"
  348. + "<meta name=\"content-type\" content=\"text/html; charset=UTF-8\">");
  349. textBuffer.append("</head><body>");
  350. textBuffer.append(deleteSource(text));
  351. textBuffer.append("</body></html>");
  352. news.setContent(textBuffer.toString());
  353. news.setContent(textBuffer.toString());
  354. System.out.println("标题====="+news.getTitle());
  355. System.out.println("href====="+news.getHref());
  356. System.out.println("content====="+news.getContent());
  357. newsList.add(news);
  358. if(newsList.size()==size){
  359. break;
  360. }
  361. }
  362. }
  363. } catch (Exception e) {
  364. e.printStackTrace();
  365. }
  366. return newsList;
  367. }
  368.  
  369. private static String deleteImg(String text) {
  370. return text.replaceAll("<img [^>]*>", "");
  371. }
  372.  
  373. private static String deleteA(String text) {
  374. return text.replaceAll("<a[^>]*>(.*?)</a>", "");
  375. }
  376.  
  377. private static String deleteSource(String text) {
  378. return text.replaceAll("\\(.*?\\)|\\[.*?]", "");
  379. }
  380. /**
  381. * 删除a标签中的href
  382. * @param content
  383. * @return
  384. */
  385. public static String removeHref(String content){
  386. Document document = Jsoup.parse(content);
  387. Elements elements = document.select("a[href]");
  388. for(Element el:elements){
  389. el.removeAttr("href");
  390. }
  391. return document.html();
  392. }
  393.  
  394. /**
  395. * 将htmlBody中所有img标签中的src内容替换为原data-src的内容, <br/>
  396. * 如果不报含data-src,则src的内容不会被替换 <br/>
  397. * @param htmlBody html内容
  398. * @param needDeleteAlt 需要剔除的图片的alt信息
  399. * @param imgUrlNeedAddProtocolPrefix 图片的url是否需要添加http协议前缀
  400. * @return 返回替换后的内容
  401. */
  402. public static String replaceImgSrcFromDataSrc(String htmlBody,
  403. boolean imgUrlNeedAddProtocolPrefix,String needDeleteAlt) {
  404. Document document = Jsoup.parseBodyFragment(htmlBody);
  405. List<Element> nodes = document.select("img");
  406. int nodeLenth = nodes.size();
  407. if(nodeLenth==0){
  408. return htmlBody;
  409. }
  410. for (int i = 0; i < nodeLenth; i++) {
  411. Element e = nodes.get(i);
  412. String dataSrc = e.attr("data-src");
  413. if (isNotBlank(dataSrc)) {
  414. e.attr("src", dataSrc);
  415. e.removeAttr("data-src");
  416. }
  417. String originalSrc = e.attr("original");
  418. if (isNotBlank(originalSrc)) {
  419. e.attr("src", "http:"+originalSrc);
  420. e.removeAttr("originalSrc");
  421. }
  422. String originalHiddenSrc = e.attr("original-hidden");
  423. if (isNotBlank(originalHiddenSrc)) {
  424. e.attr("src", "http:"+originalHiddenSrc);
  425. e.removeAttr("original-hidden");
  426. }
  427. }
  428. if (htmlBody.contains("<html>")) {
  429. if(needDeleteAlt==null&&!imgUrlNeedAddProtocolPrefix){
  430. return document.toString();
  431. }else if(needDeleteAlt==null&&imgUrlNeedAddProtocolPrefix){
  432. return document.toString().replace("src=\"//", "src=\"http://");
  433. }else if(needDeleteAlt!=null&&imgUrlNeedAddProtocolPrefix){
  434. return document.toString().replace("src=\"//", "src=\"http://")
  435. .replace("alt="+needDeleteAlt, "");
  436. }
  437. return document.toString().replace("alt="+needDeleteAlt, "");
  438. } else {
  439. if(needDeleteAlt==null&&!imgUrlNeedAddProtocolPrefix){
  440. return document.select("body>*").toString();
  441. }else if(needDeleteAlt==null&&imgUrlNeedAddProtocolPrefix){
  442. return document.select("body>*").toString().replace("src=\"//", "src=\"http://");
  443. }else if(needDeleteAlt!=null&&imgUrlNeedAddProtocolPrefix){
  444. return document.select("body>*").
  445. toString().replace("src=\"//", "src=\"http://").replace("alt="+needDeleteAlt, "");
  446. }
  447. return document.select("body>*").toString().replace("alt="+needDeleteAlt, "");
  448. }
  449.  
  450. }
  451.  
  452. private static boolean isNotBlank(String str){
  453. if(str == null)
  454. return false;
  455. else if(str.trim().length() == 0)
  456. return false;
  457. else
  458. return true;
  459. }
  460. }

还有一个载体类,用于把趴下来的网页内容进行封装到一个类里面。

  1. package net.sinolbs.ycd.news;
  2.  
  3. /**
  4. * 新闻数据载体
  5. */
  6. public class News {
  7. private int id;
  8. private String title;
  9. private String href;
  10. private String content;
  11. private String date;
  12. private String photoUrl;
  13. public News() {
  14. }
  15.  
  16. public News(String title, String href, String content, int id) {
  17. this.title = title;
  18. this.content = content;
  19. this.href = href;
  20. this.id = id;
  21. }
  22.  
  23. public int getId() {
  24. return id;
  25. }
  26.  
  27. public void setId(int id) {
  28. this.id = id;
  29. }
  30.  
  31. public String getTitle() {
  32. return title;
  33. }
  34.  
  35. public void setTitle(String title) {
  36. this.title = title;
  37. }
  38.  
  39. public String getHref() {
  40. return href;
  41. }
  42.  
  43. public void setHref(String href) {
  44. this.href = href;
  45. }
  46.  
  47. public String getContent() {
  48. return content;
  49. }
  50.  
  51. public void setContent(String content) {
  52. this.content = content;
  53. }
  54.  
  55. public String getDate() {
  56. return date;
  57. }
  58.  
  59. public void setDate(String date) {
  60. this.date = date;
  61. }
  62.  
  63. public String getPhotoUrl() {
  64. return photoUrl;
  65. }
  66.  
  67. public void setPhotoUrl(String photoUrl) {
  68. this.photoUrl = photoUrl;
  69. }
  70.  
  71. }

第三步:运行效果

运行GrapNews类(有main方法)。

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

java爬虫入门--用jsoup爬取汽车之家的新闻的更多相关文章

  1. python3 爬取汽车之家所有车型数据操作步骤(更新版)

    题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...

  2. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  3. Java爬虫_资源网站爬取实战

    对 http://bestcbooks.com/  这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url  返回其源码 (获得源码后,对源码进 ...

  4. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  5. Python 爬虫实例(15) 爬取 汽车之家(汽车授权经销商)

    有人给我吹牛逼,说汽车之家反爬很厉害,我不服气,所以就爬取了一下这个网址. 本片博客的目的是重点的分析定向爬虫的过程,希望读者能学会爬虫的分析流程. 一:爬虫的目标: 打开汽车之家的链接:https: ...

  6. python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  7. Java爬虫——B站弹幕爬取

    如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号,cid=14295428 弹幕存放位置为  h ...

  8. Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分

    1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神 ...

  9. Python 爬虫入门实例(爬取小米应用商店的top应用apk)

    一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载. ...

随机推荐

  1. emouse思·睿—评论与观点整理之二

    虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...

  2. Asp.Net MVC3 简单教程(三)详解Controller之Filter 【转】

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  3. VS2010 SP1安装失败之”此计算机的状态不支持此安装“()

    升级安装VS2010SP1的时候,出现“此计算机的状态不支持此安装”,Google得之: 如下图显示: 安装程序已经检测到,此计算机不满足安装此软件所需的条件.必须先解决以下这些造成阻止的问题,才可以 ...

  4. thinkphp生成的验证码不显示问题解决

    在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify-& ...

  5. Nginx如何启用ETag,提高访问速度

    ETag全称EntityTags,HTTP协议规格说明中定义“ETag”为“被请求变量的实体值”. 我们也可以把ETag理解为是一个客户端与服务器关联的记号.这个记号告诉客户端,当前网页在上次请求之后 ...

  6. 揭秘uc浏览器四

    请问大家用过uc浏览器,他收藏一个网页是怎么操作的? 是不是这样,按菜单键——弹出添加网页,收藏网页等等的菜单操作,这个菜单操作很人性化了,并且在前面的篇幅已经说过了,这里不做太多的赘述了. 我这里只 ...

  7. Python实现爬虫设置代理IP和伪装成浏览器的方法(转载)

    https://www.jb51.net/article/139587.htm chrome_options = webdriver.ChromeOptions() chrome_options.ad ...

  8. 分词中的HMM

    http://blog.csdn.net/heavendai/article/details/7030102 1.       首先来说一下马尔科夫链.   一个事件序列发生的概率可以用下面的概率论里 ...

  9. Android 原生 Android ActionBar

    本文内容 关于 ActionBar 必要条件 项目结构 环境 演示一:Action Bar 显示隐藏 演示二:Action Item 显示菜单选项 演示三:Action Home 启用"返回 ...

  10. 分布式锁与实现(一)——基于Redis实现(转载)

    php的完整流程,包护队列操作:http://www.cnblogs.com/candychen/p/5736128.html 概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致 ...