package parser;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import https://www.doczj.com/doc/8d10797189.html,.MalformedURLException;
import https://www.doczj.com/doc/8d10797189.html,.URL;
/**
* 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件*
* @author chenguoyong
*
*/
public class ScrubSelectedWeb {
private final static String CRLF = System.getProperty("line.separator");
/**
* @param args
*/
public static void main(String[] args) {
try {
URL ur = new URL("http://10.249.187.199:8083/injs100/");
InputStream instr = ur.openStream();
String s, str;
BufferedReader in = new BufferedReader(new InputStreamReader(instr));
StringBuffer sb = new StringBuffer();
BufferedWriter out = new BufferedWriter(new FileWriter(
"D:/outPut.txt"));
while ((s = in.readLine()) != null) {
sb.append(s + CRLF);
}
System.out.println(sb);
str = new String(sb);
out.write(str);
out.close();
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
基本能实现网页抓取,不过要手动输入URL,此外没有重构。只是一个简单的思路。1.htmlparser 使用
htmlparser是一个纯的java写的html解析的库,htmlparser不依赖于其它的java库,htmlparser主要用于改造或提取html。htmlparser能超高速解析html,而且不会出错。毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。由于htmlparser 结构设计精良,所以扩展htmlparser 非常便利。
Htmlparser中文论坛. https://www.doczj.com/doc/8d10797189.html,/thread.php?fid=6
Parser()
Parser(URLConnection connection)
Construct a parser using the provided URLConnection.
Method:
static Parser createParser(String html, String charset)
Creates the parser on an input string.
void visitAllNodesWith(NodeVisitor visitor)
Apply the given visitor to the current page.
NodeList extractAllNodesThatMatch(NodeFilter filter)
Filter the list with the given filter non-recursively.
NodeList extractAllNodesThatMatch(NodeFilter filter, boolean recursive) Filter the list with the given filter.
Node elementAt(int i)
1. html代码里面所有的链接地址和链接名称
package parser;
import org.htmlparser.Parser;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
/**
* htmlparser取得一段html代码里面所有的链接地址和链接名称
*
* @author chenguoyong
*
*/
public class Testhtmlparser {
/**
* @param args
*/
public static void main(String[] args) {
String htmlcode = "
+ "连接1"
+ "连接2";
// 创建Parser对象根据传给字符串和指定的编码
Parser parser = Parser.createParser(htmlcode, "GBK");
// 创建HtmlPage对象HtmlPage(Parser parser)
HtmlPage page = new HtmlPage(parser);
try {
// HtmlPage extends visitor,Apply the given visitor to the current
// page.
parser.visitAllNodesWith(page);
} catch (ParserException e1) {
e1 = null;
}
// 所有的节点
NodeList nodelist = page.getBody();
// 建立一个节点filter用于过滤节点
NodeFilter filter = new TagNameFilter("A");
// 得到所有过滤后,想要的节点
nodelist = nodelist.extractAllNodesThatMatch(filter, true);
for (int i = 0; i < nodelist.size(); i++) {
LinkTag link = (LinkTag) nodelist.elementAt(i);
// 链接地址
System.out.println(link.getAttribute("href") + "\n");
// 链接名称
System.out.println(link.getStringText());
}
}
}
结果如下:
https://www.doczj.com/doc/8d10797189.html,/u/20080522/14/0ff402ef-c382-499a-8213-ba6b2f550 425.html
连接1
https://www.doczj.com/doc/8d10797189.html,
连接2
2. 使用HtmlParser抓去网页内容
package parser;
import org.htmlparser.Parser;
import org.htmlparser.beans.StringBean;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.parserapplications.StringExtractor;
import org.htmlparser.tags.BodyTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 使用HtmlParser抓去网页内容: 要抓去页面的内容最方便的方法就是使用StringBean. 里面有几个控制页面内容的几个参数.
* 在后面的代码中会有说明. Htmlparser包中还有一个示例StringExtractor 里面有个直接得到内容的方法,
* 其中也是使用了StringBean . 另外直接解析Parser的每个标签也可以的.
*
* @author chenguoyong
*
*/
public class GetContent {
public void getContentUsingStringBean(String url) {
StringBean sb = new StringBean();
sb.setLinks(true); // 是否显示web页面的连接(Links)
// 为了取得页面的整洁美观一般设置上面两项为true , 如果要保持页面的原有格式, 如代码页面的空格缩进可以设置为false
sb.setCollapse(true); // 如果是true的话把一系列空白字符用一个字符替代.
sb.setReplaceNonBreakingSpaces(true);// If true regular space
sb
.setURL("https://www.doczj.com/doc/8d10797189.html,/51AOP/archive/2006/07/19/59064.html");
System.out.println("The Content is :\n" + sb.getStrings());
}
public void getContentUsingStringExtractor(String url, boolean link) {
// StringExtractor内部机制和上面的一样.做了一下包装
StringExtractor se = new StringExtractor(url);
String text = null;
try {
text = se.extractStrings(link);
System.out.println("The content is :\n" + text);
} catch (ParserException e) {
e.printStackTrace();
}
}
public void getContentUsingParser(String url) {
NodeList nl;
try {
Parser p = new Parser(url);
nl = p.parse(new NodeClassFilter(BodyTag.class));
BodyTag bt = (BodyTag) nl.elementAt(0);
System.out.println(bt.toPlainTextString()); // 保留原来的内容格式. 包含js代码} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
String url = "https://www.doczj.com/doc/8d10797189.html,/51AOP/archive/2006/07/19/59064.html";
//new GetContent().getContentUsingParser(url);
//--------------------------------------------------
new GetContent().getContentUsingStringBean(url);
}
}
3.将整个html内容保存到指定文件
package parser;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import https://www.doczj.com/doc/8d10797189.html,.MalformedURLException;
import https://www.doczj.com/doc/8d10797189.html,.URL;
* 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件*
* @author chenguoyong
*
*/
public class ScrubSelectedWeb {
private final static String CRLF = System.getProperty("line.separator");
/**
* @param args
*/
public static void main(String[] args) {
try {
URL ur = new URL("https://www.doczj.com/doc/8d10797189.html,/");
InputStream instr = ur.openStream();
String s, str;
BufferedReader in = new BufferedReader(new InputStreamReader(instr));
StringBuffer sb = new StringBuffer();
BufferedWriter out = new BufferedWriter(new FileWriter(
"D:/outPut.txt"));
while ((s = in.readLine()) != null) {
sb.append(s + CRLF);
}
System.out.println(sb);
str = new String(sb);
out.write(str);
out.close();
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4利用htmlparser提取网页纯文本的例子
package parser;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
/**
* 标题:利用htmlparser提取网页纯文本的例子
*/
public class TestHTMLParser2 {
/**
* 读取目标html内容
*
*/
public static void testHtml() {
try {
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
java.io.InputStream l_urlStream;
https://www.doczj.com/doc/8d10797189.html,.URL l_url = new https://www.doczj.com/doc/8d10797189.html,.URL(
"http://10.249.187.199:8083/injs100/");
https://www.doczj.com/doc/8d10797189.html,.HttpURLConnection l_connection = (https://www.doczj.com/doc/8d10797189.html,.HttpURLConnection) l_url
.openConnection();
l_connection.connect();
l_urlStream = l_connection.getInputStream();
java.io.BufferedReader l_reader = new java.io.BufferedReader(
new java.io.InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine + "\r\n";
}
String testText = extractText(sTotalString);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 抽取纯文本信息
* @param inputHtml:html文本
* @return
* @throws Exception
*/
public static String extractText(String inputHtml) throws Exception { StringBuffer text = new StringBuffer();
Parser parser = Parser.createParser(new String(inputHtml.getBytes(), "GBK"), "GBK");
// 遍历所有的节点
NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() { public boolean accept(Node node) {
return true;
}
});
System.out.println(nodes.size());
for (int i = 0; i < nodes.size(); i++) {
Node nodet = nodes.elementAt(i);
//字符串的代表性节点:节点的描述
text.append(new String(nodet.toPlainTextString().getBytes("GBK"))
+ "\r\n");
}
return text.toString();
}
/**
* 读取文件的方式/utl 来分析内容. filePath也可以是一个Url.
* @param resource :文件/Url
* @throws Exception
*/
public static void test5(String resource) throws Exception {
Parser myParser = new Parser(resource);
myParser.setEncoding("GBK");
String filterStr = "table";
NodeFilter filter = new TagNameFilter(filterStr);
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
/*for(int i=0;i { TableTag tabletag = (TableTag) nodeList.elementAt(i); //标签名称 System.out.println(tabletag.getTagName()); System.out.println(tabletag.getText()); }*/ TableTag tabletag = (TableTag) nodeList.elementAt(1); } public static void main(String[] args) throws Exception { test5("http://10.249.187.199:8083/injs100/"); //testHtml(); } } 5.html解析table package parser; import org.apache.log4j.Logger; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.NodeClassFilter; import org.htmlparser.filters.OrFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.TableColumn; import org.htmlparser.tags.TableRow; import org.htmlparser.tags.TableTag; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import junit.framework.TestCase; public class ParserTestCase extends TestCase { private static final Logger logger = Logger.getLogger(ParserTestCase.class); public ParserTestCase(String name) { super(name); } /** * 测试对 * * * *
的解析
*/
public void testTable() {
Parser myParser;
NodeList nodeList = null;
myParser = Parser
.createParser(
"
"+ "
1-11 | 1-12 | 1-13 |
1-21 | 1-22 | 1-23 |
1-31 | 1-32 | 1-33 |
+ "
2-11 | 2-12 | 2-13 |
2-21 | 2-22 | 2-23 |
2-31 | 2-32 | 2-33 |
+ "", "GBK");
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
try {
nodeList = myParser.parse(lastFilter);
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
System.out.println(tr.getAttribute("id"));
if (tr.getAttribute("id").equalsIgnoreCase("tro1")) {
TableColumn[] td = tr.getColumns();
for (int k = 0; k < td.length; k++) {
// logger.fatal("
// td[k].toPlainTextString());
System.out.println("
+ td[k].toPlainTextString());
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 得到目标数据
*
* @param url:目标url
* @throws Exception
*/
public static void getDatabyUrl(String url) throws Exception {
Parser myParser = new Parser(url);
NodeList nodeList = null;
myParser.setEncoding("gb2312");
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table的size:19-21开始到结束
for (int i = 15; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
if (tr.getAttribute("id") != null
&& tr.getAttribute("id").equalsIgnoreCase(
"tr02")) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 1) {
System.out.println("对不起,没有你要查询的记录");
} else {
for (int k = 0; k < td.length; k++) {
System.out.println("
+ td[k].toPlainTextString().trim());
}
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 测试已经得出有数据时table:22个,没有数据时table:19个
*
* @param args
*/
public static void main(String[] args) {
try {
//
getDatabyUrl("https://www.doczj.com/doc/8d10797189.html,/user/querytonebytype.do?field=tonecode&condition=619505 000000008942&type=1006&pkValue=619505000000008942");
getDatabyUrl("https://www.doczj.com/doc/8d10797189.html,/user/querytonebytype.do?field=tonecode&condition=61 9272000000001712&type=1006&pkValue=619272000000001712");
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.html解析常用
package com.jscud.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
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.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.TextExtractingVisitor;
import com.jscud.util.LogMan; //一个日志记录类
/**
* 演示了Html Parse的应用.
*
* @author scud https://www.doczj.com/doc/8d10797189.html, (https://www.doczj.com/doc/8d10797189.html,/)
*/
public class ParseHtmlTest
{
public static void main(String[] args) throws Exception
{
String aFile = "e:/jscud/temp/test.htm";
String content = readTextFile(aFile, "GBK");
test1(content);
System.out.println("====================================");
test2(content);
System.out.println("====================================");
test3(content);
System.out.println("====================================");
test4(content);
System.out.println("====================================");
test5(aFile);
System.out.println("====================================");
//访问外部资源,相对慢
test5("https://www.doczj.com/doc/8d10797189.html, (https://www.doczj.com/doc/8d10797189.html,/)");
System.out.println("===================================="); }
/**
* 读取文件的方式来分析内容.
* filePath也可以是一个Url.
*
* @param resource 文件/Url
*/
public static void test5(String resource) throws Exception
{
Parser myParser = new Parser(resource);
//设置编码
myParser.setEncoding("GBK");
HtmlPage visitor = new HtmlPage(myParser);
myParser.visitAllNodesWith(visitor);
String textInPage = visitor.getTitle();
System.out.println(textInPage);
}
/**
* 按页面方式处理.对一个标准的Html页面,推荐使用此种方式.
*/
public static void test4(String content) throws Exception
{
Parser myParser;
myParser = Parser.createParser(content, "GBK");
HtmlPage visitor = new HtmlPage(myParser);
myParser.visitAllNodesWith(visitor);
String textInPage = visitor.getTitle();
System.out.println(textInPage);
}
/**
* 利用Visitor模式解析html页面.
*
* 小优点:翻译了<>等符号
* 缺点:好多空格,无法提取link
*
*/
public static void test3(String content) throws Exception
{
Parser myParser;
myParser = Parser.createParser(content, "GBK"); TextExtractingVisitor visitor = new TextExtractingVisitor(); myParser.visitAllNodesWith(visitor);
String textInPage = visitor.getExtractedText();
System.out.println(textInPage);
}
/**
* 得到普通文本和链接的内容.
*
* 使用了过滤条件.
*/
public static void test2(String content) throws ParserException {
Parser myParser;
NodeList nodeList = null;
myParser = Parser.createParser(content, "GBK");
NodeFilter textFilter = new NodeClassFilter(TextNode.class); NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);
//暂时不处理meta
//NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter }); nodeList = myParser.parse(lastFilter);
Node[] nodes = nodeList.toNodeArray();
for (int i = 0; i < nodes.length; i++)
{
Node anode = (Node) nodes[i];
String line = "";
if (anode instanceof TextNode)
{
TextNode textnode = (TextNode) anode;
//line = textnode.toPlainTextString().trim();
line = textnode.getText();
}
else if (anode instanceof LinkTag)
{
LinkTag linknode = (LinkTag) anode;
line = linknode.getLink();
//@todo ("") 过滤jsp标签:可以自己实现这个函数
//line = StringFunc.replace(line, "<%.*%>", "");
}
if (isTrimEmpty(line))
continue;
System.out.println(line);
}
}
/**
* 解析普通文本节点.
*
* @param content
* @throws ParserException
*/
public static void test1(String content) throws ParserException {
Parser myParser;
Node[] nodes = null;
myParser = Parser.createParser(content, null);
nodes = myParser.extractAllNodesThatAre(TextNode.class); //exception could be thrown here
for (int i = 0; i < nodes.length; i++)
{
TextNode textnode = (TextNode) nodes[i];
String line = textnode.toPlainTextString().trim();
if (line.equals(""))
continue;
System.out.println(line);
}
}
/**
* 读取一个文件到字符串里.
*
* @param sFileName 文件名
* @param sEncode String
* @return 文件内容
*/
public static String readTextFile(String sFileName, String sEncode)
{
StringBuffer sbStr = new StringBuffer();
try
{
File ff = new File(sFileName);
InputStreamReader read = new InputStreamReader(new FileInputStream(ff),
sEncode);
BufferedReader ins = new BufferedReader(read);
String dataLine = "";
while (null != (dataLine = ins.readLine()))
{
sbStr.append(dataLine);
sbStr.append("\r\n");
}
ins.close();
catch (Exception e)
{
LogMan.error("read Text File Error", e);
}
return sbStr.toString();
}
/**
* 去掉左右空格后字符串是否为空
* @param astr String
* @return boolean
*/
public static boolean isTrimEmpty(String astr) {
if ((null == astr) || (astr.length() == 0))
{
return true;
}
if (isBlank(astr.trim()))
{
return true;
}
return false;
}
/**
* 字符串是否为空:null或者长度为0.
* @param astr 源字符串.
* @return boolean
*/
public static boolean isBlank(String astr) {
if ((null == astr) || (astr.length() == 0))
{
return true;
}
else
{
return false;
}
}
2.使用HttpClient 和HtmlParser 实现简易爬虫
本小结简单的介绍一下HttpClinet 和HtmlParser 两个开源的项目,以及他们的网站和提供下载的地址。
HttpClient 简介
HTTP 协议是现在的因特网最重要的协议之一。除了WEB 浏览器之外,WEB 服务,基于网络的应用程序以及日益增长的网络计算不断扩展着HTTP 协议的角色,使得越来越多的应用程序需要HTTP 协议的支持。虽然JA V A 类库.net 包提供了基本功能,来使用HTTP 协议访问网络资源,但是其灵活性和功能远不能满足很多应用程序的需要。而Jakarta Commons HttpClient 组件寻求提供更为灵活,更加高效的HTTP 协议支持,简化基于HTTP 协议的应用程序的创建。HttpClient 提供了很多的特性,支持最新的HTTP 标准,可以访问这里了解更多关于HttpClinet 的详细信息。目前有很多的开源项目都用到了HttpClient 提供的HTTP功能,登陆网址可以查看这些项目。本文中使用HttpClinet 提供的类库来访问和下载Internet上面的网页,在后续部分会详细介绍到其提供的两种请求网络资源的方法:Get 请求和Post 请求。Apatche 提供免费的HTTPClien t源码和JAR 包下载,可以登陆这里下载最新的HttpClient 组件。笔者使用的是HttpClient3.1。
HtmlParser 简介
当今的Internet 上面有数亿记的网页,越来越多应用程序将这些网页作为分析和处理的数据对象。这些网页多为半结构化的文本,有着大量的标签和嵌套的结构。当我们自己开发一些处理网页的应用程序时,会想到要开发一个单独的网页解析器,这一部分的工作必定需要付出相当的精力和时间。事实上,做为JA V A 应用程序开发者,HtmlParser 为其提供了强大而灵活易用的开源类库,大大节省了写一个网页解析器的开销。HtmlParser 是https://www.doczj.com/doc/8d10797189.html, 上活跃的一个开源项目,它提供了线性和嵌套两种方式来解析网页,主要用于html 网页的转换(Transformation) 以及网页内容的抽取(Extraction)。HtmlParser 有如下一些易于使用的特性:过滤器(Filters),访问者模式(Visitors),处理自定义标签以及易于使用的JavaBeans。正如HtmlParser 首页所说:它是一个快速,健壮以及严格测试过的组件;以它设计的简洁,程序运行的速度以及处理Internet 上真实网页的能力吸引着越来越多的开发者。本文中就是利用HtmlParser 里提取网页里的链接,实现简易爬虫里的关键部分。HtmlParser 最新的版本是HtmlParser1.6,可以登陆这里下载其源码、API 参考文档以及JAR 包。
简单强大的StringBean
如果你想要网页中去掉所有的标签后剩下的文本,那就是用StringBean 吧。以下简单的代码可以帮你解决这样的问题:
清单5
StringBean sb = new StringBean();
sb.setLinks(false);//设置结果中去点链接
sb.setURL(url);//设置你所需要滤掉网页标签的页面url
System.out.println(sb.getStrings());//打印结果
HtmlParser 提供了强大的类库来处理网页,由于本文旨在简单的介绍,因此只是将与笔者后续爬虫部分有关的关键类库进行了示例说明。感兴趣的读者可以专门来研究一下HtmlParser 更为强大的类库。
如何抓取网页数据,以抓取安居客举例 互联网时代,网页上有丰富的数据资源。我们在工作项目、学习过程或者学术研究等情况下,往往需要大量数据的支持。那么,该如何抓取这些所需的网页数据呢? 对于有编程基础的同学而言,可以写个爬虫程序,抓取网页数据。对于没有编程基础的同学而言,可以选择一款合适的爬虫工具,来抓取网页数据。 高度增长的抓取网页数据需求,推动了爬虫工具这一市场的成型与繁荣。目前,市面上有诸多爬虫工具可供选择(八爪鱼、集搜客、火车头、神箭手、造数等)。每个爬虫工具功能、定位、适宜人群不尽相同,大家可按需选择。本文使用的是操作简单、功能强大的八爪鱼采集器。以下是一个使用八爪鱼抓取网页数据的完整示例。示例中采集的是安居客-深圳-新房-全部楼盘的数据。 采集网站:https://https://www.doczj.com/doc/8d10797189.html,/loupan/all/p2/ 步骤1:创建采集任务 1)进入主界面,选择“自定义模式”
如何抓取网页数据,以抓取安居客举例图1 2)将要采集的网址复制粘贴到网站输入框中,点击“保存网址”
如何抓取网页数据,以抓取安居客举例图2 步骤2:创建翻页循环 1)在页面右上角,打开“流程”,以展现出“流程设计器”和“定制当前操作”两个板块。将页面下拉到底部,点击“下一页”按钮,在右侧的操作提示框中,选择“循环点击下一页”,以建立一个翻页循环
如何抓取网页数据,以抓取安居客举例图3 步骤3:创建列表循环并提取数据 1)移动鼠标,选中页面里的第一个楼盘信息区块。系统会识别此区块中的子元素,在操作提示框中,选择“选中子元素”
如何抓取网页数据,以抓取安居客举例图4 2)系统会自动识别出页面中的其他同类元素,在操作提示框中,选择“选中全部”,以建立一个列表循环
https://www.doczj.com/doc/8d10797189.html, python抓取网页数据的常见方法 很多时候爬虫去抓取数据,其实更多是模拟的人操作,只不过面向网页,我们看到的是html在CSS样式辅助下呈现的样子,但爬虫面对的是带着各类标签的html。下面介绍python抓取网页数据的常见方法。 一、Urllib抓取网页数据 Urllib是python内置的HTTP请求库 包括以下模块:urllib.request 请求模块、urllib.error 异常处理模块、urllib.parse url解析模块、urllib.robotparser robots.txt解析模块urlopen 关于urllib.request.urlopen参数的介绍: urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) url参数的使用 先写一个简单的例子:
https://www.doczj.com/doc/8d10797189.html, import urllib.request response = urllib.request.urlopen(' print(response.read().decode('utf-8')) urlopen一般常用的有三个参数,它的参数如下: urllib.requeset.urlopen(url,data,timeout) response.read()可以获取到网页的内容,如果没有read(),将返回如下内容 data参数的使用 上述的例子是通过请求百度的get请求获得百度,下面使用urllib的post请求 这里通过https://www.doczj.com/doc/8d10797189.html,/post网站演示(该网站可以作为练习使用urllib的一个站点使用,可以 模拟各种请求操作)。 import urllib.parse import urllib.request data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
https://www.doczj.com/doc/8d10797189.html, 如何抓取网页数据 很多用户不懂爬虫代码,但是却对网页数据有迫切的需求。那么怎么抓取网页数据呢? 本文便教大家如何通过八爪鱼采集器来采集数据,八爪鱼是一款通用的网页数据采集器,可以在很短的时间内,轻松从各种不同的网站或者网页获取大量的规范化数据,帮助任何需要从网页获取信息的客户实现数据自动化采集,编辑,规范化,摆脱对人工搜索及收集数据的依赖,从而降低获取信息的成本,提高效率。 本文示例以京东评论网站为例 京东评价采集采集数据字段:会员ID,会员级别,评价星级,评价内容,评价时间,点赞数,评论数,追评时间,追评内容,页面网址,页面标题,采集时间。 需要采集京东内容的,在网页简易模式界面里点击京东进去之后可以看到所有关于京东的规则信息,我们直接使用就可以的。
https://www.doczj.com/doc/8d10797189.html, 京东评价采集步骤1 采集京东商品评论(下图所示)即打开京东主页输入关键词进行搜索,采集搜索到的内容。 1、找到京东商品评论规则然后点击立即使用
https://www.doczj.com/doc/8d10797189.html, 京东评价采集步骤2 2、简易模式中京东商品评论的任务界面介绍 查看详情:点开可以看到示例网址 任务名:自定义任务名,默认为京东商品评论 任务组:给任务划分一个保存任务的组,如果不设置会有一个默认组 商品评论URL列表:提供要采集的网页网址,即商品评论页的链接。每个商品的链接必须以#comment结束,这个链接可以在商品列表点评论数打开后进行复制。或者自己打开商品链接后手动添加,如果没有这个后缀可能会报错。多个商品评论输入多个商品网址即可。 将鼠标移动到?号图标可以查看详细的注释信息。 示例数据:这个规则采集的所有字段信息。
网页抓取工具如何进行http模拟请求 在使用网页抓取工具采集网页是,进行http模拟请求可以通过浏览器自动获取登录cookie、返回头信息,查看源码等。具体如何操作呢?这里分享给大家网页抓取工具火车采集器V9中的http模拟请求。许多请求工具都是仿照火车采集器中的请求工具所写,因此大家可以此为例学习一下。 http模拟请求可以设置如何发起一个http请求,包括设置请求信息,返回头信息等。并具有自动提交的功能。工具主要包含两大部分:一个MDI父窗体和请求配置窗体。 1.1请求地址:正确填写请求的链接。 1.2请求信息:常规设置和更高级设置两部分。 (1)常规设置: ①来源页:正确填写请求页来源页地址。 ②发送方式:get和post,当选择post时,请在发送数据文本框正确填写发布数据。 ③客户端:选择或粘贴浏览器类型至此处。 ④cookie值:读取本地登录信息和自定义两种选择。 高级设置:包含如图所示系列设置,当不需要以上高级设置时,点击关闭按钮即可。 ①网页压缩:选择压缩方式,可全选,对应请求头信息的Accept-Encoding。 ②网页编码:自动识别和自定义两种选择,若选中自定义,自定义后面会出现编
码选择框,在选择框选择请求的编码。 ③Keep-Alive:决定当前请求是否与internet资源建立持久性链接。 ④自动跳转:决定当前请求是否应跟随重定向响应。 ⑤基于Windows身份验证类型的表单:正确填写用户名,密码,域即可,无身份认证时不必填写。 ⑥更多发送头信息:显示发送的头信息,以列表形式显示更清晰直观的了解到请求的头信息。此处的头信息供用户选填的,若要将某一名称的头信息进行请求,勾选Header名对应的复选框即可,Header名和Header值都是可以进行编辑的。 1.3返回头信息:将详细罗列请求成功之后返回的头信息,如下图。 1.4源码:待请求完毕后,工具会自动跳转到源码选项,在此可查看请求成功之后所返回的页面源码信息。 1.5预览:可在此预览请求成功之后返回的页面。 1.6自动操作选项:可设置自动刷新/提交的时间间隔和运行次数,启用此操作后,工具会自动的按一定的时间间隔和运行次数向服务器自动请求,若想取消此操作,点击后面的停止按钮即可。 配置好上述信息后,点击“开始查看”按钮即可查看请求信息,返回头信息等,为避免填写请求信息,可以点击“粘贴外部监视HTTP请求数据”按钮粘贴请求的头信息,然后点击开始查看按钮即可。这种捷径是在粘贴的头信息格式正确的前提下,否则会弹出错误提示框。 更多有关网页抓取工具或网页采集的教程都可以从火车采集器的系列教程中学习借鉴。
https://www.doczj.com/doc/8d10797189.html, 网页数据抓取方法详解 互联网时代,网络上有海量的信息,有时我们需要筛选找到我们需要的信息。很多朋友对于如何简单有效获取数据毫无头绪,今天给大家详解网页数据抓取方法,希望对大家有帮助。 八爪鱼是一款通用的网页数据采集器,可实现全网数据(网页、论坛、移动互联网、QQ空间、电话号码、邮箱、图片等信息)的自动采集。同时八爪鱼提供单机采集和云采集两种采集方式,另外针对不同的用户还有自定义采集和简易采集等主要采集模式可供选择。
https://www.doczj.com/doc/8d10797189.html, 如果想要自动抓取数据呢,八爪鱼的自动采集就派上用场了。 定时采集是八爪鱼采集器为需要持续更新网站信息的用户提供的精确到分钟的,可以设定采集时间段的功能。在设置好正确的采集规则后,八爪鱼会根据设置的时间在云服务器启动采集任务进行数据的采集。定时采集的功能必须使用云采集的时候,才会进行数据的采集,单机采集是无法进行定时采集的。 定时云采集的设置有两种方法: 方法一:任务字段配置完毕后,点击‘选中全部’→‘采集以下数据’→‘保存并开始采集’,进入到“运行任务”界面,点击‘设置定时云采集’,弹出‘定时云采集’配置页面。
https://www.doczj.com/doc/8d10797189.html, 第一、如果需要保存定时设置,在‘已保存的配置’输入框内输入名称,再保存配置,保存成功之后,下次如果其他任务需要同样的定时配置时可以选择这个配置。 第二、定时方式的设置有4种,可以根据自己的需求选择启动方式和启动时间。所有设置完成之后,如果需要启动定时云采集选择下方‘保存并启动’定时采集,然后点击确定即可。如果不需要启动只需点击下方‘保存’定时采集设置即可。
国内主要信息抓取软件盘点 近年来,随着国内大数据战略越来越清晰,数据抓取和信息采集系列产品迎来了巨大的发展 机遇,采集产品数量也出现迅猛增长。然而与产品种类快速增长相反的是,信息采集技术相 对薄弱、市场竞争激烈、质量良莠不齐。在此,本文列出当前信息采集和数据抓取市场最具 影响力的六大品牌,供各大数据和情报中心建设单位采购时参考: TOP.1 乐思网络信息采集系统 乐思网络信息采系统的主要目标就是解决网络信息采集和网络数据抓取问题。是根据用户自定义的任务配置,批量而精确地抽取因特网目标网页中的半结构化与非结构化数据,转化为结构化的记录,保存在本地数据库中,用于内部使用或外网发布,快速实现外部信息的获取。 主要用于:大数据基础建设,舆情监测,品牌监测,价格监测,门户网站新闻采集,行业资讯采集,竞争情报获取,商业数据整合,市场研究,数据库营销等领域。 TOP.2 火车采集器 火车采集器是一款专业的网络数据采集/信息挖掘处理软件,通过灵活的配置,可以很轻松迅速地从网页上抓取结构化的文本、图片、文件等资源信息,可编辑筛选处理后选择发布到网站后台,各类文件或其他数据库系统中。被广泛应用于数据采集挖掘、垂直搜索、信息汇聚和门户、企业网信息汇聚、商业情报、论坛或博客迁移、智能信息代理、个人信息检索等领域,适用于各类对数据有采集挖掘需求的群体。 TOP.3 熊猫采集软件 熊猫采集软件利用熊猫精准搜索引擎的解析内核,实现对网页内容的仿浏览器解析,在此基础上利用原创的技术实现对网页框架内容与核心内容的分离、抽取,并实现相似页面的有效比对、匹配。因此,用户只需要指定一个参考页面,熊猫采集软件系统就可以据此来匹配类似的页面,来实现用户需要采集资料的批量采集。 TOP.4 狂人采集器 狂人采集器是一套专业的网站内容采集软件,支持各类论坛的帖子和回复采集,网站和博客文章内容抓取,通过相关配置,能轻松的采集80%的网站内容为己所用。根据各建站程序
我用ajax获取后台数据并展示在前端页面的方法【源码】 WEB前端开发与传统的网页制作最大的一个区别就是:以前的网页制作只是涉及到一些图片制作、切图、然后实现静态页面的布局;而WEB前端开发既然涉及到开发,就会和后台打交道,后台或数据库里边的信息要根据用户的需求显示在前端特定的位置上,供用户查看。所以现在的前端开发不仅仅是会点div、css或者是简单的javascript特效就可以了。 今天为大家说一下如何运用Ajax调用后台数据显示在前端页面。 源码中有详细的注释说明,只要懂得Ajax的基本工作原理和javascript和运行机制,就能看得懂。 下面是我在本地环境中测试的案例源代码: HTML部分:
国内6大网络信息采集和页面数据抓取工具 近年来,随着国内大数据战略越来越清晰,数据抓取和信息采集系列产品迎来了巨大的发展机遇,采集产品数量也出现迅猛增长。然而与产品种类快速增长相反的是,信息采集技术相对薄弱、市场竞争激烈、质量良莠不齐。在此,本文列出当前信息采集和数据抓取市场最具影响力的六大品牌,供各大数据和情报中心建设单位采购时参考: TOP.1 乐思网络信息采集系统(https://www.doczj.com/doc/8d10797189.html,) 乐思网络信息采系统的主要目标就是解决网络信息采集和网络数据抓取问题。是根据用户自定义的任务配置,批量而精确地抽取因特网目标网页中的半结构化与非结构化数据,转化为结构化的记录,保存在本地数据库中,用于内部使用或外网发布,快速实现外部信息的获取。 该系统主要用于:大数据基础建设,舆情监测,品牌监测,价格监测,门户网站新闻采集,行业资讯采集,竞争情报获取,商业数据整合,市场研究,数据库营销等领域。 TOP.2 火车采集器(https://www.doczj.com/doc/8d10797189.html,) 火车采集器是一款专业的网络数据采集/信息挖掘处理软件,通过灵活的配置,可以很轻松迅速地从网页上抓取结构化的文本、图片、文件等资源信息,可编辑筛选处理后选择发布到网站后台,各类文件或其他数据库系统中。被广泛应用于数据采集挖掘、垂直搜索、信息汇聚和门户、企业网信息汇聚、商业情报、论坛或博客迁移、智能信息代理、个人信息检索等领域,适用于各类对数据有采集挖掘需求的群体。 TOP.3 熊猫采集软件(https://www.doczj.com/doc/8d10797189.html,) 熊猫采集软件利用熊猫精准搜索引擎的解析内核,实现对网页内容的仿浏览器解析,在此基础上利用原创的技术实现对网页框架内容与核心内容的分离、抽取,并实现相似页面的有效比对、匹配。因此,用户只需要指定一个参考页面,熊猫采集软件系统就可以据此来匹配类似的页面,来实现用户需要采集资料的批量采集。 TOP.4 狂人采集器(https://www.doczj.com/doc/8d10797189.html,) 狂人采集器是一套专业的网站内容采集软件,支持各类论坛的帖子和回复采集,网站和博客文章内容抓取,通过相关配置,能轻松的采集80%的网站内容为己所用。根据各建站程序的区别,狂人采集器分论坛采集器、CMS采集器和博客采集器三类,总计支持近40种主流建站程序的上百个版本的数据采集和发布任务,支持图片本地化,支持网站登陆采集,分页抓取,全面模拟人工登陆发布,软件运行快速安全稳定!论坛采集器还支持论坛会员无限注册,自动增加帖子查看人数,自动顶贴等。 TOP.5 网络神采(https://www.doczj.com/doc/8d10797189.html,) 网络神采是一款专业的网络信息采集系统,通过灵活的规则可以从任何类型的网站采集信息,
https://www.doczj.com/doc/8d10797189.html, 网页内容如何批量提取 网站上有许多优质的内容或者是文章,我们想批量采集下来慢慢研究,但内容太多,分布在不同的网站,这时如何才能高效、快速地把这些有价值的内容收集到一起呢? 本文向大家介绍一款网络数据采集工具【八爪鱼数据采集】,以【新浪博客】为例,教大家如何使用八爪鱼采集软件采集新浪博客文章内容的方法。 采集网站: https://www.doczj.com/doc/8d10797189.html,/s/articlelist_1406314195_0_1.html 采集的内容包括:博客文章正文,标题,标签,分类,日期。 步骤1:创建新浪博客文章采集任务 1)进入主界面,选择“自定义采集”
https://www.doczj.com/doc/8d10797189.html, 2)将要采集的网址URL复制粘贴到网站输入框中,点击“保存网址”
https://www.doczj.com/doc/8d10797189.html, 步骤2:创建翻页循环
https://www.doczj.com/doc/8d10797189.html, 1)打开网页之后,打开右上角的流程按钮,使制作的流程可见状态。点击页面下方的“下一页”,如图,选择“循环点击单个链接”,翻页循环创建完成。(可在左上角流程中手动点击“循环翻页”和“点击翻页”几次,测试是否正常翻页。) 2)由于进入详情页时网页加载很慢,网址一直在转圈状态,无法立即执行下一个步骤,因此在“循环翻页”的高级选项里设置“ajax加载数据”,超时时间设置为5秒,点击“确定”。
https://www.doczj.com/doc/8d10797189.html, 步骤3:创建列表循环 1)鼠标点击列表目录中第一个博文,选择操作提示框中的“选中全部”。 2)鼠标点击“循环点击每个链接”,列表循环就创建完成,并进入到第一个循环项的详情页面。
https://www.doczj.com/doc/8d10797189.html, 网站数据爬取方法 网站数据主要是指网页上的文字,图像,声音,视频这几类,在告诉的信息化时代,如何去爬取这些网站数据显得至关重要。对于程序员或开发人员来说,拥有编程能力使得他们能轻松构建一个网页数据抓取程序,但是对于大多数没有任何编程知识的用户来说,一些好用的网络爬虫软件则显得非常的重要了。以下是一些使用八爪鱼采集器抓取网页数据的几种解决方案: 1、从动态网页中提取内容。 网页可以是静态的也可以是动态的。通常情况下,您想要提取的网页内容会随着访问网站的时间而改变。通常,这个网站是一个动态网站,它使用AJAX技术或其他技术来使网页内容能够及时更新。AJAX即延时加载、异步更新的一种脚本技术,通过在后台与服务器进行少量数据交换,可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
https://www.doczj.com/doc/8d10797189.html, 表现特征为点击网页中某个选项时,大部分网站的网址不会改变;网页不是完全加载,只是局部进行了数据加载,有所变化。这个时候你可以在八爪鱼的元素“高级选项”的“Ajax加载”中可以设置,就能抓取Ajax加载的网页数据了。 八爪鱼中的AJAX加载设置
https://www.doczj.com/doc/8d10797189.html, 2.从网页中抓取隐藏的内容。 你有没有想过从网站上获取特定的数据,但是当你触发链接或鼠标悬停在某处时,内容会出现?例如,下图中的网站需要鼠标移动到选择彩票上才能显示出分类,这对这种可以设置“鼠标移动到该链接上”的功能,就能抓取网页中隐藏的内容了。 鼠标移动到该链接上的内容采集方法
https://www.doczj.com/doc/8d10797189.html, 在滚动到网页底部之后,有些网站只会出现一部分你要提取的数据。例如今日头条首页,您需要不停地滚动到网页的底部以此加载更多文章内容,无限滚动的网站通常会使用AJAX或JavaScript来从网站请求额外的内容。在这种情况下,您可以设置AJAX超时设置并选择滚动方法和滚动时间以从网页中提取内容。
https://www.doczj.com/doc/8d10797189.html, 大数据抓取工具推荐 大数据已经成了互联网时代最热门的词之一,采集器也成了数据行业人人都需要的工具。作为一个不会打代码的小白,如何进行数据采集呢?市面上有一些大数据抓取工具。八爪鱼和造数就是其中两款采集器,对于不会写爬虫代码的朋友来说,找到一款合适的采集器,可以达到事半功倍的效果。本文就两款采集器的优缺点做一个对比,仅供大家参考。 造数是一个基于云端爬取的智能云爬虫服务站点,通过一套网页分析的算法,分析出网页中结构化的数据,然后再爬取页面中的数据,无需编程基础,只需输入网址,选取所需的数据,就可轻松获取互联网的公开数据,并以 Excel 表格等形式下载,或使用 API 与企业内部系统深度整合。 造数有什么优缺点呢? 优点: 云端采集网页,不需要占用电脑资源下载软件 采集到数据以后可以设置数据自动推送 缺点: 1、不支持全自动网站登录采集,也不支持本地采集,采集比较容易受到限制 2、不能采集滚动页面,最多支持两个层级的采集,采集不是很灵活 然后我们看一下八爪鱼 八爪鱼是非常适合技术小白的一款采集器,技术比较成熟,功能强大,操作简单。八爪鱼采集器的各方面的功能都比较完善,云采集是它的一大特色,相比其他采集软件,云采集能够做到更加精准、高效和大规模。还有识别验证码、提供优质代理IP 、UA 自动切换等智能防封的组合功能,在采集过程都不用担心网站的限制。如果不想创建采集任务,可以到客户端直接使用简易采集模式,选择模板,设置参数马上就可以拿到数据。
https://www.doczj.com/doc/8d10797189.html, 八爪鱼有什么优缺点呢? 1、功能强大。八爪鱼采集器是一款通用爬虫,可应对各种网页的复杂结构(瀑布流等)和防采集措施(登录、验证码、封IP),实现百分之九十九的网页数据抓取。 2、入门容易。7.0版本推出的简易网页采集,内置主流网站大量数据源和已经写好的采集规则。用户只需输入关键词,即可采集到大量所需数据 3、流程可视化。真正意义上实现了操作流程可视化,用户可打开流程按钮,直接可见操作流程,并对每一步骤,进行高级选项的设置(修改ajax/ xpath等)。 缺点: 1、不能提供文件托管,不能直接发布采集到的数据 2、不支持视频和app采集 相关链接: 八爪鱼使用功能点视频教程 https://www.doczj.com/doc/8d10797189.html,/tutorial/videotutorial/videognd 八爪鱼爬虫软件入门准备 https://www.doczj.com/doc/8d10797189.html,/tutorial/xsksrm/rmzb
百度贴吧内容抓取工具-让你的网站一夜之间内容丰富 [hide]
var $getreplytime=1; var $showimg=1; var $showcon=1; var $showauthor=1; var $showreplytime=1; var $showsn=0; var $showhr=0; var $replylista=array(); var $pat_reply="<\/a>(.+?)
<\/td>\r\n<\/tr><\/table>"; var $pat_pagecount="尾页<\/font><\/a>"; var $pat_title="(.+?)<\/font>"; var $pat_replycon="<\/td>\r\n \r\n