核心方法: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 collation-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.origin=msg.sender
pg 添加mysql外部表
如何在html中导入jsx文件
人人快包
界面变化前后对比工具
uiimageview 快速播放视频
golang 浮点数到 int
ir 字母组合的声音
js 字符转 utf-8
提琴手代理ip