核心方法:Java广度优先爬虫示例(抓取复旦新闻信息)

优采云 发布时间: 2022-09-21 15:19

  核心方法:Java广度优先爬虫示例(抓取复旦新闻信息)

  以下内容仅供学习交流,请勿用于其他目的,否则后果自负。 一.使用的技术

  这个爬虫是近半个月前学习爬虫技术的一个小例子。它相对简单。恐怕时间久了就会忘记。这是一个简短的总结。主要使用的外部Jar包有HttpClient4.3.4、HtmlParser2.1,使用的开发工具(IDE)是intelij 13.1,Jar包管理工具是Maven,不习惯使用intelij的同学也可以使用eclipse新建一个Project。

  二.爬虫基础知识1.什么是网络爬虫? (爬虫基本原理)

  网络爬虫,在拆解方面,网络是指互联网,互联网就像蜘蛛网,而爬虫就像蜘蛛,可以四处爬行,处理爬取的数据。

  维基百科上的解释:网络爬虫(又称网络蜘蛛、网络机器人,在FOAF社区,更常被称为网络追逐者),是一种按照一定规则自动抓取万维网信息的程序或脚本。其他不太常用的名称是 ant、auto-index、emulator 或 worm。

  基本原理:传统爬虫从一个或多个初始网页的URL开始,获取初始网页上的URL。在抓取网页的过程中,它不断地从当前页面中提取新的 URL 并放入队列中,直到满足系统的要求。流程图中显示了某个停止条件。焦点爬虫的工作流程比较复杂。它需要按照一定的网页分析算法过滤掉与主题无关的链接,保留有用的链接,并放入等待抓取的URL队列中。然后,它会根据一定的搜索策略从队列中选择下一个要爬取的网页URL,并重复上述过程,直到达到系统的一定条件并停止

  2.常用的爬虫策略有哪些?

  网页抓取策略可以分为三类:深度优先、广度优先和最佳优先。深度优先在很多情况下会导致爬虫被困的问题。目前,广度优先和最佳优先方法很常见。

  2.1 宽度优先

  广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,径向遍历它周围更广阔的区域,所以得名。

  基本思路:

  1),从图中的一个顶点V0开始,访问这个顶点;

  2),从V0开始,访问V0的每个未访问的相邻点W1,W2,...,Wk;然后,从W1,W2,...,Wk开始,依次访问每个未访问的相邻点;

  3),重复第2步,直到所有顶点都被访问过。

  如下图:

  2.2深度优先

  假设初始状态是图中所有顶点都没有被访问过,那么深度优先搜索方法的步骤为:

  [En]

  假设初始状态是图中所有顶点都没有被访问,那么深度优先搜索方法的步骤为:

  1)在图中选择一个顶点Vi作为起点,访问并标记该顶点;

  2) 以Vi为当前顶点,依次搜索Vi的每个相邻点Vj,如果Vj没有被访问过,访问并标记相邻点Vj,如果Vj已经访问过,搜索Vi的下一个相邻点的相邻点Vj;

  3)以Vj为当前顶点,重复步骤2,直到图中所有与Vi有路径的顶点都被访问过;

  4)如果图中有没有被访问过的顶点(在不连通的情况下),可以以图中一个未访问过的顶点为起点,重复上述过程,直到图中的所有顶点都没有被访问。访问顶点。

  以下是有向图和无向图的示例:

  广度、深度和区别:

  广度优先遍历是按照层的顺序,先搜索到某一层的所有节点,再搜索下一层;而深度优先遍历是在搜索分支上的所有节点之后。转向搜索其他分支上的所有节点。

  2.3 最佳优先搜索

  最佳优先级搜索策略根据一定的网页分析算法预测候选URL与目标网页的相似度,或与主题的相关度,选择评价最好的一个或几个URL进行爬取。它只访问页面分析算法预测为“有用”的页面。这种搜索适合抓取暗网数据,只要内容符合要求即可。

  3.本文爬虫示例

  本文介绍的例子是抓取新闻信息,因为一般的新闻信息,重要的和最近的都会放在首页,网络层更深的信息的重要性一般会逐渐降低。 ,所以广度优先算法更合适。下图是本文将要爬取的网页结构:

  三.广度优先爬虫示例1.要求:抓取复旦新闻资讯(只抓取100个网页)

  这里只抓取100条信息,url必须以开头。

  2.代码实现

  使用maven导入外部jar包:

  

org.apache.httpcomponentsgroupId>

httpclientartifactId>

4.3.4version>

dependency>

org.htmlparsergroupId>

htmlparserartifactId>

2.1version>

dependency>

  程序主入口:

  package com.amos.crawl;

import java.util.Set;

/**

* Created by amosli on 14-7-10.

*/

public class MyCrawler {

/**

* 使用*敏*感*词*初始化URL队列

*

* @param seeds

*/

private void initCrawlerWithSeeds(String[] seeds) {

for (int i = 0; i < seeds.length; i++) {

LinkQueue.addUnvisitedUrl(seeds[i]);

}

}

public void crawling(String[] seeds) {

//定义过滤器,提取以http://news.fudan.edu.cn/的链接

LinkFilter filter = new LinkFilter() {

@Override

public boolean accept(String url) {

if (url.startsWith("http://news.fudan.edu.cn")) {

return true;

}

return false;

}

};

//初始化URL队列

initCrawlerWithSeeds(seeds);

int count=0;

//循环条件:待抓取的链接不为空抓取的网页最多100条

while (!LinkQueue.isUnvisitedUrlsEmpty() && LinkQueue.getVisitedUrlNum() ) {

System.out.println("count:"+(++count));

//附头URL出队列

String visitURL = (String) LinkQueue.unVisitedUrlDeQueue();

DownLoadFile downloader = new DownLoadFile();

//下载网页

downloader.downloadFile(visitURL);

//该URL放入怩访问的URL中

LinkQueue.addVisitedUrl(visitURL);

//提取出下载网页中的URL

Set links = HtmlParserTool.extractLinks(visitURL, filter);

//新的未访问的URL入列

for (String link : links) {

System.out.println("link:"+link);

LinkQueue.addUnvisitedUrl(link);

}

}

}

public static void main(String args[]) {

//程序入口

MyCrawler myCrawler = new MyCrawler();

myCrawler.crawling(new String[]{"http://news.fudan.edu.cn/news/"});

}

}

  工具类:Tools.java

  package com.amos.tool;

import java.io.*;

import java.net.URI;

import java.net.URISyntaxException;

import java.net.UnknownHostException;

import java.security.KeyManagementException;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.Locale;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLException;

import org.apache.http.*;

import org.apache.http.client.CircularRedirectException;

import org.apache.http.client.CookieStore;

import org.apache.http.client.HttpRequestRetryHandler;

import org.apache.http.client.RedirectStrategy;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpHead;

import org.apache.http.client.methods.HttpUriRequest;

import org.apache.http.client.methods.RequestBuilder;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.client.utils.URIBuilder;

import org.apache.http.client.utils.URIUtils;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.HttpClientConnectionManager;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.cookie.Cookie;

import org.apache.http.impl.client.*;

import org.apache.http.impl.conn.BasicHttpClientConnectionManager;

import org.apache.http.impl.cookie.BasicClientCookie;

import org.apache.http.protocol.HttpContext;

import org.apache.http.util.Args;

import org.apache.http.util.Asserts;

import org.apache.http.util.TextUtils;

import org.omg.CORBA.Request;

/**

* Created by amosli on 14-6-25.

*/

public class Tools {

/**

* 写文件到本地

*

* @param httpEntity

* @param filename

*/

public static void saveToLocal(HttpEntity httpEntity, String filename) {

try {

File dir = new File(Configuration.FILEDIR);

if (!dir.isDirectory()) {

dir.mkdir();

}

File file = new File(dir.getAbsolutePath() + "/" + filename);

FileOutputStream fileOutputStream = new FileOutputStream(file);

InputStream inputStream = httpEntity.getContent();

byte[] bytes = new byte[1024];

int length = 0;

while ((length = inputStream.read(bytes)) > 0) {

fileOutputStream.write(bytes, 0, length);

}

inputStream.close();

fileOutputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 写文件到本地

*

* @param bytes

* @param filename

*/

public static void saveToLocalByBytes(byte[] bytes, String filename) {

try {

File dir = new File(Configuration.FILEDIR);

if (!dir.isDirectory()) {

dir.mkdir();

}

File file = new File(dir.getAbsolutePath() + "/" + filename);

FileOutputStream fileOutputStream = new FileOutputStream(file);

fileOutputStream.write(bytes);

//fileOutputStream.write(bytes, 0, bytes.length);

fileOutputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 输出

* @param string

*/

public static void println(String string){

System.out.println("string:"+string);

}

/**

* 输出

* @param string

*/

public static void printlnerr(String string){

System.err.println("string:"+string);

}

/**

* 使用ssl通道并设置请求重试处理

* @return

*/

public static CloseableHttpClient createSSLClientDefault() {

<p>

try {

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

//信任所有

public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {

return true;

}

}).build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);

//设置请求重试处理,重试机制,这里如果请求失败会重试5次

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

@Override

public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {

if (executionCount >= 5) {

// Do not retry if over max retry count

return false;

}

if (exception instanceof InterruptedIOException) {

// Timeout

return false;

}

if (exception instanceof UnknownHostException) {

// Unknown host

return false;

}

if (exception instanceof ConnectTimeoutException) {

// Connection refused

return false;

}

if (exception instanceof SSLException) {

// SSL handshake exception

return false;

}

HttpClientContext clientContext = HttpClientContext.adapt(context);

HttpRequest request = clientContext.getRequest();

boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);

if (idempotent) {

// Retry if the request is considered idempotent

return true;

}

return false;

}

};

//请求参数设置,设置请求超时时间为20秒,连接超时为10秒,不允许循环重定向

RequestConfig requestConfig = RequestConfig.custom()

.setConnectionRequestTimeout(20000).setConnectTimeout(20000)

.setCircularRedirectsAllowed(false)

.build();

Cookie cookie ;

return HttpClients.custom().setSSLSocketFactory(sslsf)

.setUserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36")

.setMaxConnPerRoute(25).setMaxConnPerRoute(256)

.setRetryHandler(retryHandler)

.setRedirectStrategy(new SelfRedirectStrategy())

.setDefaultRequestConfig(requestConfig)

.build();

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (KeyStoreException e) {

e.printStackTrace();

}

return HttpClients.createDefault();

}

/**

* 带cookiestore

* @param cookieStore

* @return

*/

public static CloseableHttpClient createSSLClientDefaultWithCookie(CookieStore cookieStore) {

try {

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

//信任所有

public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {

return true;

}

}).build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);

//设置请求重试处理,重试机制,这里如果请求失败会重试5次

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {

@Override

public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {

if (executionCount >= 5) {

// Do not retry if over max retry count

return false;

}

if (exception instanceof InterruptedIOException) {

// Timeout

return false;

}

if (exception instanceof UnknownHostException) {

// Unknown host

return false;

}

if (exception instanceof ConnectTimeoutException) {

// Connection refused

return false;

}

if (exception instanceof SSLException) {

// SSL handshake exception

return false;

}

HttpClientContext clientContext = HttpClientContext.adapt(context);

HttpRequest request = clientContext.getRequest();

boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);

if (idempotent) {

// Retry if the request is considered idempotent

return true;

}

return false;

}

};

//请求参数设置,设置请求超时时间为20秒,连接超时为10秒,不允许循环重定向

RequestConfig requestConfig = RequestConfig.custom()

.setConnectionRequestTimeout(20000).setConnectTimeout(20000)

.setCircularRedirectsAllowed(false)

.build();

return HttpClients.custom().setSSLSocketFactory(sslsf)

.setUserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36")

.setMaxConnPerRoute(25).setMaxConnPerRoute(256)

.setRetryHandler(retryHandler)

.setRedirectStrategy(new SelfRedirectStrategy())

.setDefaultRequestConfig(requestConfig)

.setDefaultCookieStore(cookieStore)

.build();

} catch (KeyManagementException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (KeyStoreException e) {

e.printStackTrace();

}

return HttpClients.createDefault();

}

}

</p>

  查看代码

  将网页写入本地下载类:DownLoadFile.java

  package com.amos.crawl;

import com.amos.tool.Configuration;

import com.amos.tool.Tools;

import org.apache.http.*;

import org.apache.http.client.HttpClient;

import org.apache.http.client.HttpRequestRetryHandler;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.conn.ClientConnectionManager;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.impl.client.AutoRetryHttpClient;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.protocol.HttpContext;

import javax.net.ssl.SSLException;

import java.io.*;

import java.net.UnknownHostException;

/**

* Created by amosli on 14-7-9.

*/

public class DownLoadFile {

public String getFileNameByUrl(String url, String contentType) {

//移除http http://

url = url.contains("http://") ? url.substring(7) : url.substring(8);

//text/html类型

if (url.contains(".html")) {

url = url.replaceAll("[\\?/:*|\"]", "_");

} else if (contentType.indexOf("html") != -1) {

url = url.replaceAll("[\\?/:*|\"]", "_") + ".html";

} else {

url = url.replaceAll("[\\?/:*|\"]", "_") + "." + contentType.substring(contentType.lastIndexOf("/") + 1);

}

return url;

}

/**

* 将网页写入到本地

* @param data

* @param filePath

*/

private void saveToLocal(byte[] data, String filePath) {

try {

DataOutputStream out = new DataOutputStream(new FileOutputStream(new File(filePath)));

for(int i=0;i){

out.write(data[i]);

}

out.flush();

out.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 写文件到本地

*

* @param httpEntity

* @param filename

*/

public static void saveToLocal(HttpEntity httpEntity, String filename) {

try {

File dir = new File(Configuration.FILEDIR);

if (!dir.isDirectory()) {

dir.mkdir();

}

File file = new File(dir.getAbsolutePath() + "/" + filename);

FileOutputStream fileOutputStream = new FileOutputStream(file);

InputStream inputStream = httpEntity.getContent();

if (!file.exists()) {

file.createNewFile();

}

byte[] bytes = new byte[1024];

int length = 0;

while ((length = inputStream.read(bytes)) > 0) {

fileOutputStream.write(bytes, 0, length);

}

inputStream.close();

fileOutputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

<p>

}

public String downloadFile(String url) {

//文件路径

String filePath=null;

//1.生成HttpClient对象并设置参数

HttpClient httpClient = Tools.createSSLClientDefault();

//2.HttpGet对象并设置参数

HttpGet httpGet = new HttpGet(url);

//设置get请求超时5s

//方法1

//httpGet.getParams().setParameter("connectTimeout",5000);

//方法2

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).build();

httpGet.setConfig(requestConfig);

try {

HttpResponse httpResponse = httpClient.execute(httpGet);

int statusCode = httpResponse.getStatusLine().getStatusCode();

if(statusCode!= HttpStatus.SC_OK){

System.err.println("Method failed:"+httpResponse.getStatusLine());

filePath=null;

}

filePath=getFileNameByUrl(url,httpResponse.getEntity().getContentType().getValue());

saveToLocal(httpResponse.getEntity(),filePath);

} catch (Exception e) {

e.printStackTrace();

}

return filePath;

}

public static void main(String args[]) throws IOException {

String url = "http://websearch.fudan.edu.cn/search_dep.html";

HttpClient httpClient = new DefaultHttpClient();

HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = httpClient.execute(httpGet);

Header contentType = httpResponse.getEntity().getContentType();

System.out.println("name:" + contentType.getName() + "value:" + contentType.getValue());

System.out.println(new DownLoadFile().getFileNameByUrl(url, contentType.getValue()));

}

}

</p>

  查看代码

  创建过滤器接口:LinkFilter.java

  package com.amos.crawl;

/**

* Created by amosli on 14-7-10.

*/

public interface LinkFilter {

public boolean accept(String url);

}

  使用HtmlParser过滤url的方法:HtmlParserTool.java

  package com.amos.crawl;

import org.htmlparser.Node;

import org.htmlparser.NodeFilter;

import org.htmlparser.Parser;

import org.htmlparser.filters.NodeClassFilter;

import org.htmlparser.filters.OrFilter;

import org.htmlparser.tags.LinkTag;

import org.htmlparser.util.NodeList;

import java.util.HashSet;

import java.util.Set;

/**

* Created by amosli on 14-7-10.

*/

public class HtmlParserTool {

public static Set extractLinks(String url, LinkFilter filter) {

Set links = new HashSet();

try {

Parser parser = new Parser(url);

parser.setEncoding("GBK");

//过滤标签的filter,用来提取frame标签里的src属性

NodeFilter framFilter = new NodeFilter() {

@Override

public boolean accept(Node node) {

if (node.getText().contains("frame src=")) {

return true;

} else {

return false;

}

}

};

//OrFilter来设置过滤<a>标签和标签</a>

OrFilter linkFilter = new OrFilter(new NodeClassFilter(LinkTag.class), framFilter);

//得到所有经过过滤的标签

NodeList list = parser.extractAllNodesThatMatch(linkFilter);

for (int i = 0; i < list.size(); i++) {

Node tag = list.elementAt(i);

if (tag instanceof LinkTag) {

tag = (LinkTag) tag;

String linkURL = ((LinkTag) tag).getLink();

//如果符合条件那么将url添加进去

if (filter.accept(linkURL)) {

links.add(linkURL);

}

} else {//frame 标签

//frmae里src属性的链接,如

String frame = tag.getText();

int start = frame.indexOf("src=");

frame = frame.substring(start);

int end = frame.indexOf(" ");

if (end == -1) {

end = frame.indexOf(">");

}

String frameUrl = frame.substring(5, end - 1);

if (filter.accept(frameUrl)) {

links.add(frameUrl);

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

return links;

}

}

  管理网页url的实现队列:Queue.java

  package com.amos.crawl;

import java.util.LinkedList;

/**

* Created by amosli on 14-7-9.

*/

public class Queue {

//使用链表实现队列

private LinkedList queueList = new LinkedList();

//入队列

public void enQueue(Object object) {

queueList.addLast(object);

}

//出队列

public Object deQueue() {

return queueList.removeFirst();

}

//判断队列是否为空

public boolean isQueueEmpty() {

return queueList.isEmpty();

}

//判断队列是否包含ject元素..

public boolean contains(Object object) {

return queueList.contains(object);

}

//判断队列是否为空

public boolean empty() {

return queueList.isEmpty();

}

}

  网页链接进出队列的管理:LinkQueue.java

  package com.amos.crawl;

import java.util.HashSet;

import java.util.Set;

/**

* Created by amosli on 14-7-9.

*/

public class LinkQueue {

//已经访问的队列

private static Set visitedUrl = new HashSet();

//未访问的队列

private static Queue unVisitedUrl = new Queue();

//获得URL队列

public static Queue getUnVisitedUrl() {

return unVisitedUrl;

}

public static Set getVisitedUrl() {

return visitedUrl;

}

//添加到访问过的URL队列中

public static void addVisitedUrl(String url) {

visitedUrl.add(url);

}

//删除已经访问过的URL

public static void removeVisitedUrl(String url){

visitedUrl.remove(url);

}

//未访问的URL出队列

public static Object unVisitedUrlDeQueue(){

return unVisitedUrl.deQueue();

}

//保证每个URL只被访问一次,url不能为空,同时已经访问的URL队列中不能包含该url,而且因为已经出队列了所未访问的URL队列中也不能包含该url

public static void addUnvisitedUrl(String url){

if(url!=null&&!url.trim().equals("")&&!visitedUrl.contains(url)&&!unVisitedUrl.contains(url))

unVisitedUrl.enQueue(url);

}

//获得已经访问过的URL的数量

public static int getVisitedUrlNum(){

return visitedUrl.size();

}

//判断未访问的URL队列中是否为空

public static boolean isUnvisitedUrlsEmpty(){

return unVisitedUrl.empty();

}

}

  爬取的思路是:先给出要爬取的url ==> 查询满足条件的url加入队列 ==> 依次取出队列中的url,访问,同时检索满足条件的url 条件url==>下载队列中的url网页,即逐层探索,最大限制100条数据。

  3.3 张截图

  原文:

  作者:Hi_Amos

  题目:Java广度优先爬虫示例(爬取复旦新闻信息)

  技术文章:【Linux--抓取Appium网站命令】的更多相关文章

  Zeta--S3 Linux 抓取一帧 YUV 图像并使用硬件编码器将其编码为 H.264

  #include #include #include #include #include #include #include #include #include #include

  Linux爬取流量排名

  要求:分析图片服务日志,对日志进行排名(每张图片的访问次数*图片大小之和),取前10名,即计算每个url的总访问量语句: awk'{a[$1]+= $10;}END{for(iina){printi""a[i];}}'access.log|sort-k2 2.要求:把所有目录放在/ oldboy 目录及其扩展名为 .sh 的子目录 将结尾文件中收录 ./hostlists.txt 的所有字符串替换为 ../idctest_iplist 答案:for i in `ll /oldbo...

  获取网站信息时遇到的问题及解决方法 ContentType中提供的字符集无效。无法使用无效字符集将内容读取为字符串

  var response = httpClient.SendAsync(requestMessage).Result;内容 = response.Content.ReadAsStringAsync().Result;正常情况下可以获取数据,但是这次抛出了异常。异常信息如下: ContentType 提供的字符集无效。无法使用无效字符将内容读取为字符串...

  linux抓取usb包设置usbmon

  …

  Nutch2.1+mysql+solr3.6.1+中文网站爬取

  1.mysql数据库配置linux mysql安装步骤省略。首先进入[mysqld]下的/etc/f(如果mysql为5.1,则无需修改f,会导致mysql启动失败)添加:innodb_file_format=barracuda innodb_file_per_table=true innodb_large_prefix=true character -set-server=utf8mb4 collat​​ion-server=utf8mb4_unicode_ci 创建…

  Nutch 2.2+MySQL+Solr4.2实现网站内容爬取和索引

  原文地址:Nutch 2.2.1 已经发布快两个月了。与Nutch之前的版本相比,这个版本有很大的变化,尤其是与MySQL联合应用的安装和配置过程。很多地方容易出错。我在安装过程中也遇到了很多麻烦。大部分问题都没有通过百度和google解决。针对各种问题,现将重要的安装配置过程整理如下。 1.MySQL 数据库配置 lmy.ini 配置...

  获取网站数据不再困难,Fizzler (So Easy) 都能搞定

  

  先从题目说起,为什么抓网站数据不再难了(其实抓网站数据就很难了),SO EASY!!!用Fizzler搞定,相信大部分人或公司应该都有爬取别人网站数据的经验。比如我们博客园每次发布文章都会被其他网站抓取,不信你看看就知道了。也有人抢别人的邮箱、电话、QQ等有用信息。这些信息绝对可以卖钱或做其他事情。我们每天都会不时收到垃圾。短信或者邮件,大概是这样吧,感觉一样,O(∩_∩)O哈哈~。前段时间写了两个程序,一个程序是抓取某彩票的数据网站(Double…

  使用curl抓取网站数据,模仿IP,反屏蔽的终极强大解决方案

  我最近一直在做一些工作来捕获其他 网站 数据。当然,别人也不会乖乖的免费给你抓数据。有多种方法可以防止捕获。 ,有漏洞可以通过研究来钻。以下示例都是用 PHP 编写的。不使用 PHP 进行 curl 的孩子应该先学习这个,然后再往下看。可以参考一下这个文章:言归正传,说一下伪造源IP的常用方法,也是很多朋友常用的方法:1.更容易伪造标题中的 X-FORWARDED-FO...

  【Python爬虫】第28期:Selenium +phantomjs使用pyquery抓取网站排名信息

  一.介绍这个例子使用Selenium +phantomjs爬取中文网站总排名(,)信息二.网站信息三.数据爬取目的在上面的网站信息,要抓取1.先抓取信息列表抓取代码: Elements = doc('li[class^="clearfix"]') 类似信息2. 网站名称、域、URL netElement = 元素……

  热门话题

  centos7.4 创建用户

  php使用md5解密

  Linux 安装 *敏*感*词*

  vue ui设置cnpm包

  角度时间换算

  centos7 openvpn 客户端

  四个地址分为a类、b类、c类、d类和e类,其中c类ip地址用于大型网络

  

  计算机进程中的内存是什么

  遍历数据框的每个元素

  keil开发c51程序的主要步骤是构建项目

  如何绕过tx&period;origin&equals;msg&period;sender

  pg 添加mysql外部表

  如何在html中导入jsx文件

  人人快包

  界面变化前后对比工具

  uiimageview 快速播放视频

  golang 浮点数到 int

  ir 字母组合的声音

  js 字符转 utf-8

  提琴手代理ip

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线