`
ssxxjjii
  • 浏览: 944835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深度抓取

阅读更多

下面是我在网上找到的一个例子,运行之后它会把域名下的所有网页抓取回来,而我只想要域名下部分网页中的url,比如我给的地址是book.easou.com,它会把easou.com下所有网页中的URL给抓回来,但我只想要book.easou.com下的网页中的URL,那个正则表达式,我改了很久还是达不到我想要的效果,谁能帮我看看?谢谢!

package com.easou.crawler;

import java.io.File;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Hashtable;

public class Crawler {
private int webDepth = 1; // 爬虫深度
private int intThreadNum = 5; // 线程数
private String strHomePage = ""; // 主页地址
private String myDomain; // 域名
private String fPath = "web"; // 储存网页文件的目录名
private ArrayList<String> arrUrls = new ArrayList<String>(); // 存储未处理URL
private ArrayList<String> arrUrl = new ArrayList<String>(); // 存储所有URL供建立索引
private Hashtable<String, Integer> allUrls = new Hashtable<String, Integer>(); // 存储所有URL的网页号
private Hashtable<String, Integer> deepUrls = new Hashtable<String, Integer>(); // 存储所有URL深度
private int intWebIndex = 0; // 网页对应文件下标,从0开始
private String charset = "UTF-8";
private String report = "";
private long startTime;
private int webSuccessed = 0;
private int webFailed = 0;

public Crawler(String s, int i) {
this.strHomePage = s;
this.webDepth = i;
}

public synchronized void addWebSuccessed() {
webSuccessed++;
}

public synchronized void addWebFailed() {
webFailed++;
}

public synchronized void addReport(String s) {
try {
report += s;
PrintWriter pwReport = new PrintWriter(new FileOutputStream(
"report.txt"));
pwReport.println(report);
pwReport.close();
} catch (Exception e) {
System.out.println("生成报告文件失败!");
}
}

public synchronized String getAUrl() {
String tmpAUrl = arrUrls.get(0);
arrUrls.remove(0);
return tmpAUrl;
}

public synchronized String getUrl() {
String tmpUrl = arrUrl.get(0);
arrUrl.remove(0);
return tmpUrl;
}

public synchronized Integer getIntWebIndex() {
intWebIndex++;
return intWebIndex;
}


public void getWebByHomePage() {
startTime = System.currentTimeMillis();
this.myDomain = getDomain();
if (myDomain == null) {
System.out.println("Wrong input!");
// System.exit(1);
return;
}
System.out.println("Homepage = " + strHomePage);
addReport("Homepage = " + strHomePage + "!\n");
System.out.println("Domain = " + myDomain);
addReport("Domain = " + myDomain + "!\n");
arrUrls.add(strHomePage);
arrUrl.add(strHomePage);
allUrls.put(strHomePage, 0);
deepUrls.put(strHomePage, 1);
File fDir = new File(fPath);
if (!fDir.exists()) {
fDir.mkdir();
}
System.out.println("Start!");
this.addReport("Start!\n");
String tmp = getAUrl();
this.getWebByUrl(tmp, charset, allUrls.get(tmp) + "");
int i = 0;
for (i = 0; i < intThreadNum; i++) {
new Thread(new Processer(this)).start();
}
while (true) {
if (arrUrls.isEmpty() && Thread.activeCount() == 1) {
long finishTime = System.currentTimeMillis();
long costTime = finishTime - startTime;
System.out.println("\n\n\n\n\nFinished!");
addReport("\n\n\n\n\nFinished!\n");
System.out.println("Start time = " + startTime + " "
+ "Finish time = " + finishTime + " "
+ "Cost time = " + costTime + "ms");
addReport("Start time = " + startTime + " "
+ "Finish time = " + finishTime + " "
+ "Cost time = " + costTime + "ms" + "\n");
System.out.println("Total url number = "
+ (webSuccessed + webFailed) + " Successed: "
+ webSuccessed + " Failed: " + webFailed);
addReport("Total url number = " + (webSuccessed + webFailed)
+ " Successed: " + webSuccessed + " Failed: "
+ webFailed + "\n");

String strIndex = "";
String tmpUrl = "";
while (!arrUrl.isEmpty()) {
tmpUrl = getUrl();
strIndex += "Web depth:" + deepUrls.get(tmpUrl)
+ " Filepath: " + fPath + "/web"
+ allUrls.get(tmpUrl) + ".htm" + " url:" + tmpUrl
+ "\n\n";
}
System.out.println(strIndex);
break;
}
}
}

public void getWebByUrl(String strUrl, String charset, String fileIndex) {
try {
System.out.println("Getting web by url: " + strUrl);
addReport("Getting web by url: " + strUrl + "\n");
URL url = new URL(strUrl);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
InputStream is = null;
is = url.openStream();
BufferedReader bReader = new BufferedReader(new InputStreamReader(
is));
String rLine = null;
String tmp_rLine = null;
while ((rLine = bReader.readLine()) != null) {
tmp_rLine = rLine;
int str_len = tmp_rLine.length();
if (str_len > 0) {
if (deepUrls.get(strUrl) < webDepth)
getUrlByString(tmp_rLine, strUrl);
}
tmp_rLine = null;
}
is.close();
System.out.println("Get web successfully! " + strUrl);
addReport("Get web successfully! " + strUrl + "\n");
addWebSuccessed();
} catch (Exception e) {
System.out.println("Get web failed! " + strUrl);
addReport("Get web failed! " + strUrl + "\n");
addWebFailed();
}
}

public String getDomain() {
String reg = "(?<=http\\://[a-zA-Z0-9]{0,100}[.]{0,1})[^.\\s]*?\\.(com|cn|net|org|biz|info|cc|tv)";
Pattern p = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(strHomePage);
boolean blnp = m.find();
if (blnp == true) {
return m.group(0);
}
return null;
}

public void getUrlByString(String inputArgs, String strUrl) {
String tmpStr = inputArgs;

String regUrl = "(?<=(href=)[\"]?[\']?)[http://][^\\s\"\'\\?]*("
+ myDomain + ")[^\\s\"\'>]*";


Pattern p = Pattern.compile(regUrl, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(tmpStr);
boolean blnp = m.find();
while (blnp == true) {
if (!allUrls.containsKey(m.group(0))) {
System.out.println("Find a new url,depth:"
+ (deepUrls.get(strUrl) + 1) + " " + m.group(0));
addReport("Find a new url,depth:" + (deepUrls.get(strUrl) + 1)
+ " " + m.group(0) + "\n");
arrUrls.add(m.group(0));
arrUrl.add(m.group(0));
allUrls.put(m.group(0), getIntWebIndex());
deepUrls.put(m.group(0), (deepUrls.get(strUrl) + 1)); //新的URL深度+1
}
tmpStr = tmpStr.substring(m.end(), tmpStr.length());
m = p.matcher(tmpStr);
blnp = m.find();
}
}

class Processer implements Runnable {
Crawler gw;

public Processer(Crawler g) {
this.gw = g;
}

public void run() {
while (!arrUrls.isEmpty()) {
String tmp = getAUrl();
getWebByUrl(tmp, charset, allUrls.get(tmp) + "");
}
}
}
}

 

红色部分就是我现在用的正则表达式,但是达不到我想要的效果,谁能帮我改改?

我只想抓取book.easou.com下的所有网页中的URL

分享到:
评论

相关推荐

    27【爬虫与信息搜集】27.点开随机链接深度抓取.mp4

    Python爬虫+办公自动化+好玩DIY(完结)\章节03【编程让生活更美好】之【爬虫与信息搜集】

    抓取网站神器工具

    2. **深度抓取**:通过设置抓取深度,Teleport Pro 可以追踪链接到的页面,不仅限于首页,而是深入到网站的各个层级,确保抓取到所有相关的内容。 3. **定制抓取规则**:用户可以根据需要设定过滤规则,比如只抓取...

    网站抓取工具免费版Teleport Ultra

    2. **深度抓取**:不同于简单的网页下载器,Teleport Ultra可以深入抓取网站的所有链接,不仅限于首页,而是沿着链接逐层向下,直至设定的深度或特定条件(如文件类型、URL模式)为止。 3. **定制抓取规则**:用户...

    网页抓取软件(-------)

    6. **深度抓取**:通过跟踪网页内的链接,持续抓取更多页面,形成大规模的网页数据集。 **网页抓取的关键技术:** 1. **网络库**:如Python的requests库,用于发送HTTP请求。 2. **解析库**:如BeautifulSoup和lxml...

    网站内容抓取

    页面深度抓取和分步解析配置简化了操作,而可视化的配置界面则无需用户直接接触网页源代码。 在硬件和软件环境方面,WebSpider可在多种平台上运行,包括PC、服务器,兼容Windows 2K/XP、Linux操作系统,要求至少256...

    基于CNN深度学习的机器人抓取位置检测方法.pdf

    基于CNN深度学习的机器人抓取位置检测方法 本文提出了一种基于CNN深度学习的机器人抓取位置检测方法,以解决传统检测方法受复杂环境和人工干预影响而导致检测精准度低的问题。 机器人抓取位置检测是机器人技术中的...

    WebSpider 网页抓取 v5.1

    *支持页面深度抓取,页面间可以一级一级地抓下去。比如,通过列表页抓取到正文页URL,然后再抓取正文页。各级页面可以分别入库; *WEB操作界面,一处安装,随处使用 *分步解析,分步入库 *一次配置,永久抓取,...

    HTTP网址抓取器 v4.6.1 绿色版

    2. **深度抓取**:除了基础的单页链接抓取,软件还支持对网页进行深度抓取,即沿着抓取到的链接继续访问并收集下一级页面的URL,这对于构建网页链接地图或爬虫项目非常有用。 3. **结果过滤**:URLCapturer提供了...

    php网页抓取小偷程序

    8. **多步骤抓取**:`get1.php`和`get2.php`可能表示程序设计了多个抓取步骤,比如分页抓取、深度抓取或处理特定内容的逻辑。 9. **安全性与合法性**:在进行网页抓取时,必须注意遵循网站的robots.txt协议,尊重...

    网站整站下载器 网站抓取器

    1. **深度抓取**:该工具能够根据网站的内部链接结构进行深度抓取,确保抓取到网站的所有页面,不仅仅是首页。 2. **链接过滤**:为了避免无用的链接(如广告链接、外部链接)占用过多带宽,下载器通常有链接过滤...

    基于深度学习的机器人抓取位置检测方法.pdf

    "基于深度学习的机器人抓取位置检测方法" 摘要:本文提出了一种基于深度学习的机器人抓取位置检测方法,该方法使用无监督学习和监督学习相结合的方式对目标物体的最优抓取位置进行学习。在无监督学习阶段,使用压缩...

    基于全卷积深度学习模型的可抓取物品识别.pdf

    基于全卷积深度学习模型的可抓取物品识别 本文介绍了一种基于全卷积深度学习模型的可抓取物品识别方法,该方法能够识别工业机器人作业场景中的可抓取物品。该方法使用全卷积网络(Fully Convolutional Networks,...

    网页抓取+表单提取源代码

    这个过程通常涉及以下步骤:(1) 定义起始URL,(2) 发送GET请求,(3) 接收服务器返回的HTML响应,(4) 解析HTML内容,(5) 可能地跟随链接进行深度抓取。在这个程序中,开发者可能使用了libcurl库来处理HTTP请求,因为...

    爬虫抓取小说(14).zip

    然后,它解析这些数据,提取所需信息,并可能进一步跟踪页面上的链接进行深度抓取。这个过程可以循环进行,构建出一个网站或特定领域的信息库。 二、常用爬虫工具 1. Python爬虫框架:如Scrapy,是一个强大的爬虫...

    基于深度学习的机器人抓取检测方法

    ### 基于深度学习的机器人抓取检测方法 #### 摘要与背景 近年来,随着深度学习技术的发展,其在人工智能领域的应用取得了显著的进步。特别是在计算机视觉、自然语言处理等方面,深度学习已经成为推动技术革新的...

    LinkedinSpider, Linkedin爬虫,根据公司名字抓取员工的linkedin信息.zip

    4. **深度抓取**:对于每个找到的员工,爬虫会进一步访问他们的个人页面,抓取更详细的信息,如教育背景、工作经验、技能等。 5. **数据存储**:所有抓取的数据会被存储到本地文件,通常是CSV或JSON格式,方便后续...

    基于PHP的虐神百度抓取开源系统源码.zip

    这个开源系统允许开发者或网站管理员模拟百度搜索引擎的行为,对特定网站进行深度抓取,以便分析网站的内容、结构和优化状况。 【描述】"基于PHP的虐神百度抓取开源系统源码.zip" 描述了一个基于PHP的项目,其目标...

    定时爬虫抓取电子报纸并发送邮件.zip

    1.6 跟踪链接:如果目标网站有分页或多个子页面,爬虫需要跟踪链接进行深度抓取。 1.7 尊重规则:爬虫应遵守robots.txt协议,不频繁访问,以免对目标服务器造成负担。 2. 电子邮件自动化: 电子邮件自动化是指使用...

    基于深度强化学习的机器人抓取及智能装配研究.caj

    基于深度强化学习的机器人抓取及智能装配研究.caj 基于深度强化学习的机器人抓取及智能装配研究.caj 基于深度强化学习的机器人抓取及智能装配研究.caj 基于深度强化学习的机器人抓取及智能装配研究.caj 基于深度强化...

    EECS-2018-120Efficient Policy Learning for Robust Robot Grasping.pdf

    本文提出的是一种结合传统分析方法和数据驱动方法的混合方法,用于提高深度抓取策略的学习效率。该混合方法能够利用物理模型和经验数据,改善机器人的抓取策略,使其在面对复杂物体和环境时更加鲁棒。混合方法不仅...

Global site tag (gtag.js) - Google Analytics