
java爬虫抓取网页数据
java爬虫抓取网页数据(UI自动化月前写的一些事儿--)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-10-20 11:05
写在前面
本来这个文章是几个月前写的,后来忙忘了。
ps:事情太多有时会耽误事情。
几个月前,记得群里有个朋友说要用selenium来爬取数据。关于爬取数据,我一般是模拟访问一些固定的网站,爬取我关心的信息,然后爬出来。数据被处理。
他的需求是将文章直接导入富文本编辑器进行发布。其实这也是爬虫的一种。
其实这并不难,就是UI自动化的过程,我们开始吧。
准备工具/原材料
1、java 语言
2、IDEA 开发工具
3、jdk1.8
4、selenium-server-standalone (3.0 及以上)
步骤 1、 分解需求:2、 代码实现思路:3、 示例代码
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
/**
* @author rongrong
* Selenium模拟访问网站爬虫操作代码示例
*/
public class Demo {
private static WebDriver driver;
static final int MAX_TIMEOUT_IN_SECONDS = 5;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = new ChromeDriver();
String url = "https://temai.snssdk.com/artic ... 3B%3B
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(MAX_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
driver.get(url);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (driver != null) {
System.out.println("运行结束!");
driver.quit();
}
}
@Test
public void test() throws InterruptedException {
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
driver.get("https://ueditor.baidu.com/webs ... 6quot;);
Thread.sleep(2000);
driver.switchTo().frame(0);
driver.findElement(By.tagName("body")).click();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(2000);
}
}
写在后面
作者不特别推荐使用selenium作为爬虫,原因如下:
每次运行爬虫都要打开浏览器,初始化需要加载图片、JS渲染等很多东西;
有人说改成无头浏览器的原理是一样的。就是打开浏览器,很多网站都会验证参数。如果对方看到您的恶意访问请求,就会执行您的请求。然后你必须考虑更改请求头。不知道事情有多复杂,还要改代码,很麻烦。
加载了很多可能对你没有价值的补充文件(比如css、js、图片文件)。与真正需要的资源(使用单独的 HTTP 请求)相比,这可能会产生更多的流量。 查看全部
java爬虫抓取网页数据(UI自动化月前写的一些事儿--)
写在前面
本来这个文章是几个月前写的,后来忙忘了。
ps:事情太多有时会耽误事情。
几个月前,记得群里有个朋友说要用selenium来爬取数据。关于爬取数据,我一般是模拟访问一些固定的网站,爬取我关心的信息,然后爬出来。数据被处理。
他的需求是将文章直接导入富文本编辑器进行发布。其实这也是爬虫的一种。
其实这并不难,就是UI自动化的过程,我们开始吧。
准备工具/原材料
1、java 语言
2、IDEA 开发工具
3、jdk1.8
4、selenium-server-standalone (3.0 及以上)
步骤 1、 分解需求:2、 代码实现思路:3、 示例代码
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
/**
* @author rongrong
* Selenium模拟访问网站爬虫操作代码示例
*/
public class Demo {
private static WebDriver driver;
static final int MAX_TIMEOUT_IN_SECONDS = 5;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = new ChromeDriver();
String url = "https://temai.snssdk.com/artic ... 3B%3B
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(MAX_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
driver.get(url);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (driver != null) {
System.out.println("运行结束!");
driver.quit();
}
}
@Test
public void test() throws InterruptedException {
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
driver.get("https://ueditor.baidu.com/webs ... 6quot;);
Thread.sleep(2000);
driver.switchTo().frame(0);
driver.findElement(By.tagName("body")).click();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(2000);
}
}
写在后面
作者不特别推荐使用selenium作为爬虫,原因如下:
每次运行爬虫都要打开浏览器,初始化需要加载图片、JS渲染等很多东西;
有人说改成无头浏览器的原理是一样的。就是打开浏览器,很多网站都会验证参数。如果对方看到您的恶意访问请求,就会执行您的请求。然后你必须考虑更改请求头。不知道事情有多复杂,还要改代码,很麻烦。
加载了很多可能对你没有价值的补充文件(比如css、js、图片文件)。与真正需要的资源(使用单独的 HTTP 请求)相比,这可能会产生更多的流量。
java爬虫抓取网页数据(网络爬虫的基本工作流程及流程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-10-19 22:00
本文主要介绍一个网络爬虫的小案例。有很好的参考价值。跟小编一起来看看吧
网络爬虫(也称为网络蜘蛛、网络机器人,在FOAF 社区中,更常见的是网络追逐者),是一种程序或脚本,可以根据一定的规则自动抓取万维网上的信息。它已被广泛使用。用于互联网领域。搜索引擎利用网络爬虫抓取网页、文档,甚至图片、音频、视频等资源,通过相应的索引技术将这些信息组织起来,提供给搜索用户查询。网络爬虫也为中小型网站的推广提供了有效的途径。网站 搜索引擎爬虫优化曾经风靡一时。
网络爬虫的基本工作流程如下:
1.首先选择一些精心挑选的种子网址;
2.将这些URL放入URL队列进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页,并存入下载的网页库中。另外,将这些 URL 放入爬取的 URL 队列中。
4.对抓取到的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待抓取的URL队列中,从而进入下一个循环。
当然,我不明白我上面说的。以我目前的理解,我们请求一个 URL,服务器返回给我们一个超大文本,我们的浏览器可以将这个超大文本解析成我们所说的我们看到的华丽。页面
那么,我们只需要把这个超大文本当成一个足够大的String字符串就可以了。
下面是我的代码
package main.spider; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; /** * Created by 1755790963 on 2017/3/10. */ public class Second { public static void main(String[] args) throws IOException { System.out.println("begin"); Document document = Jsoup.connect("http://tieba.baidu.com/p/2356694991").get(); String selector="div[class=d_post_content j_d_post_content clearfix]"; Elements elements = document.select(selector); for (Element element:elements){ String word= element.text(); if(word.indexOf("@")>0){ word=word.substring(0,word.lastIndexOf("@")+7); System.out.println(word); } System.out.println(word); } } }
我在这里使用了提供的 jsoup jar 包。Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
代码中,我们可以直接使用Jsoup类,导出Jsoup的connect()方法。该方法返回一个org.jsoup.Connection对象,参数为网站的url地址。Connection 对象有一个 get() 方法返回 Document 对象
document对象的select方法可以返回一个Elements对象,Elements对象是Element对象的集合,但是select()方法需要我们传入一个String参数,也就是我们的selector
字符串选择器="div[class=d_post_content j_d_post_content clearfix]";
我们的选择器语法类似于 jquery 的选择器语法。您可以在 html 页面中选择元素。选中后可以方便的进行Elements集合,通过Element的text()方法获取html中的代码
这样一个最简单的网络爬虫就完成了。
我选择的网站是豆瓣。留下你的邮箱,我给你发百度这样的邮箱贴吧,我取大家的邮箱
附上结果:
以上是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。同时希望多多支持html中文网站!
以上就是网络爬虫案例分析的详细内容。更多详情请关注其他相关html中文网站文章! 查看全部
java爬虫抓取网页数据(网络爬虫的基本工作流程及流程)
本文主要介绍一个网络爬虫的小案例。有很好的参考价值。跟小编一起来看看吧
网络爬虫(也称为网络蜘蛛、网络机器人,在FOAF 社区中,更常见的是网络追逐者),是一种程序或脚本,可以根据一定的规则自动抓取万维网上的信息。它已被广泛使用。用于互联网领域。搜索引擎利用网络爬虫抓取网页、文档,甚至图片、音频、视频等资源,通过相应的索引技术将这些信息组织起来,提供给搜索用户查询。网络爬虫也为中小型网站的推广提供了有效的途径。网站 搜索引擎爬虫优化曾经风靡一时。
网络爬虫的基本工作流程如下:
1.首先选择一些精心挑选的种子网址;
2.将这些URL放入URL队列进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页,并存入下载的网页库中。另外,将这些 URL 放入爬取的 URL 队列中。
4.对抓取到的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待抓取的URL队列中,从而进入下一个循环。
当然,我不明白我上面说的。以我目前的理解,我们请求一个 URL,服务器返回给我们一个超大文本,我们的浏览器可以将这个超大文本解析成我们所说的我们看到的华丽。页面
那么,我们只需要把这个超大文本当成一个足够大的String字符串就可以了。
下面是我的代码
package main.spider; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; /** * Created by 1755790963 on 2017/3/10. */ public class Second { public static void main(String[] args) throws IOException { System.out.println("begin"); Document document = Jsoup.connect("http://tieba.baidu.com/p/2356694991").get(); String selector="div[class=d_post_content j_d_post_content clearfix]"; Elements elements = document.select(selector); for (Element element:elements){ String word= element.text(); if(word.indexOf("@")>0){ word=word.substring(0,word.lastIndexOf("@")+7); System.out.println(word); } System.out.println(word); } } }
我在这里使用了提供的 jsoup jar 包。Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
代码中,我们可以直接使用Jsoup类,导出Jsoup的connect()方法。该方法返回一个org.jsoup.Connection对象,参数为网站的url地址。Connection 对象有一个 get() 方法返回 Document 对象
document对象的select方法可以返回一个Elements对象,Elements对象是Element对象的集合,但是select()方法需要我们传入一个String参数,也就是我们的selector
字符串选择器="div[class=d_post_content j_d_post_content clearfix]";
我们的选择器语法类似于 jquery 的选择器语法。您可以在 html 页面中选择元素。选中后可以方便的进行Elements集合,通过Element的text()方法获取html中的代码
这样一个最简单的网络爬虫就完成了。
我选择的网站是豆瓣。留下你的邮箱,我给你发百度这样的邮箱贴吧,我取大家的邮箱
附上结果:

以上是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。同时希望多多支持html中文网站!
以上就是网络爬虫案例分析的详细内容。更多详情请关注其他相关html中文网站文章!
java爬虫抓取网页数据(网络爬虫的实现原理:网络蜘蛛又叫蜘蛛,流程 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-10-19 08:14
)
网络爬虫的实现原理:
网络爬虫也被称为蜘蛛。过程为:网络蜘蛛通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,阅读网页内容,找到网页中的其他链接。地址,通过这些链接地址找到下一个网页,一直循环下去,直到这个网站的所有网页都被抓取完毕。根据特定的网页规则,在抓取的网页中提取你想要的信息。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对数据进行处理和过滤的服务器。爬虫抓取的数据量越大,对服务器的性能要求就越高。.
根据这个原理,编写一个简单的网络爬虫程序。该程序的作用是获取网站发回的数据,并在该过程中提取URL。获取的 URL 存储在文件夹中。如何使用网站获取的URL进一步循环获取数据,提取其他数据。我不打算在这里写。它只是模拟最简单的原理。实际的 网站 爬虫比这里复杂得多。有太多深入的讨论。除了提取URL,我们还可以提取我们想要的各种其他信息。
结构目录:
源代码:
package com.sun.crawl;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import sun.jdbc.odbc.JdbcOdbc;
import java.io.IOException;
/**
* 下载此超链接的页面源代码.
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrlAndDownloadGoalContent(String url) {
/* 实例化一个HttpClient客户端 */
HttpClient client = new DefaultHttpClient();
HttpGet getHttp = new HttpGet(url);
String content = null;
HttpResponse response;
try {
/* 获得信息载体 */
response = client.execute(getHttp);
HttpEntity entity = response.getEntity();
VisitedUrlQueue.addElem(url);
if (entity != null) {
/* 转化为文本信息 */
content = EntityUtils.toString(entity);
/* 判断是否符合下载网页源代码到本地的条件 */
if (FunctionUtils.isCreateFile(url)
&& FunctionUtils.isHasGoalContent(content) != -1) {
/*
//将抓包的数据存到磁盘上(D盘下)
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);*/
FoodMessageBean foodMessageBean = FunctionUtils.CutHtml(FunctionUtils.getGoalContent(content));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
package com.sun.crawl;
/**
* Created by lenovo on 2017/8/3.
*/
public class FoodMessageBean {
private String name = "";
private String property = "";
private String content = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "FoodMessageBean{" +
"name='" + name + '\'' +
", property='" + property + '\'' +
", content='" + content + '\'' +
'}';
}
}
<p>package com.sun.crawl;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FunctionUtils {
public static FoodMessageBean CutHtml(String content) {
FoodMessageBean f = new FoodMessageBean();
// 过滤文章内容中的html
String[] split = content.split(":");
String s = split[0].replaceAll(" 查看全部
java爬虫抓取网页数据(网络爬虫的实现原理:网络蜘蛛又叫蜘蛛,流程
)
网络爬虫的实现原理:
网络爬虫也被称为蜘蛛。过程为:网络蜘蛛通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,阅读网页内容,找到网页中的其他链接。地址,通过这些链接地址找到下一个网页,一直循环下去,直到这个网站的所有网页都被抓取完毕。根据特定的网页规则,在抓取的网页中提取你想要的信息。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对数据进行处理和过滤的服务器。爬虫抓取的数据量越大,对服务器的性能要求就越高。.
根据这个原理,编写一个简单的网络爬虫程序。该程序的作用是获取网站发回的数据,并在该过程中提取URL。获取的 URL 存储在文件夹中。如何使用网站获取的URL进一步循环获取数据,提取其他数据。我不打算在这里写。它只是模拟最简单的原理。实际的 网站 爬虫比这里复杂得多。有太多深入的讨论。除了提取URL,我们还可以提取我们想要的各种其他信息。
结构目录:
源代码:
package com.sun.crawl;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import sun.jdbc.odbc.JdbcOdbc;
import java.io.IOException;
/**
* 下载此超链接的页面源代码.
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrlAndDownloadGoalContent(String url) {
/* 实例化一个HttpClient客户端 */
HttpClient client = new DefaultHttpClient();
HttpGet getHttp = new HttpGet(url);
String content = null;
HttpResponse response;
try {
/* 获得信息载体 */
response = client.execute(getHttp);
HttpEntity entity = response.getEntity();
VisitedUrlQueue.addElem(url);
if (entity != null) {
/* 转化为文本信息 */
content = EntityUtils.toString(entity);
/* 判断是否符合下载网页源代码到本地的条件 */
if (FunctionUtils.isCreateFile(url)
&& FunctionUtils.isHasGoalContent(content) != -1) {
/*
//将抓包的数据存到磁盘上(D盘下)
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);*/
FoodMessageBean foodMessageBean = FunctionUtils.CutHtml(FunctionUtils.getGoalContent(content));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
package com.sun.crawl;
/**
* Created by lenovo on 2017/8/3.
*/
public class FoodMessageBean {
private String name = "";
private String property = "";
private String content = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "FoodMessageBean{" +
"name='" + name + '\'' +
", property='" + property + '\'' +
", content='" + content + '\'' +
'}';
}
}
<p>package com.sun.crawl;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FunctionUtils {
public static FoodMessageBean CutHtml(String content) {
FoodMessageBean f = new FoodMessageBean();
// 过滤文章内容中的html
String[] split = content.split(":");
String s = split[0].replaceAll("
java爬虫抓取网页数据(某个站点对数据的显示方式略有不同演示怎样抓取站点的数据)
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-10-19 08:11
有时因为各种原因,我们需要从某个站点采集数据,但是因为不同站点显示的数据略有不同!
本文使用Java向大家展示如何抓取网站数据:(1)抓取原创网页数据;(2)抓取网页Javascript返回的数据。
一、 抓取原创网页。
在这个例子中,我们将从上面获取 ip 查询的结果:
第一步:打开这个网页,输入IP:111.142.55.73,点击查询按钮,可以看到网页显示的结果:
第二步:查看网页的源码,我们在源码中看到这一段:
由此可以看出,再次请求网页后,显示查询的结果。
查询后看网页地址:
换句话说,我们只能通过访问这种 URL 来获取 ip 查询的结果。接下来看代码:
public void captureHtml(String ip) 抛出异常 {
字符串 strURL = "" + ip;
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
String buf = contentBuf.toString();
int beginIx = buf.indexOf("查询结果[");
int endIx = buf.indexOf("以上四项依次显示");
String result = buf.substring(beginIx, endIx);
System.out.println("captureHtml() 结果:\n" + result);
}使用HttpURLConnection连接站点,使用bufReader保存网页返回的数据,然后通过自己定义的解析方法展示结果。
这里我只是随便解析了一下,想要解析准确,就需要自己处理了。
分析结果如下:
captureHtml() 的结果:
查询结果[1]:111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市手机
二、 抓取网页的 JavaScript 返回的结果。
有时,网站为了保护自己的数据,不会直接在网页的源代码中返回数据,而是使用异步的方式用JS返回数据,这样可以避免网站数据被诸如搜索引擎。
首先看这个页面:
我用第一种方法查看网页源代码,但是没有找到运单的跟踪信息,因为是通过JS获取的结果。
但是有时候我们非常需要获取JS数据,这个时候我们该怎么办呢?
这时候我们就需要用到一个工具:HTTP Analyzer,这个工具可以拦截Http的交互内容,我们使用这个工具来达到我们的目的。
先点击开始按钮后,它开始监控网页的交互行为。
我们打开网页:,可以看到HTTP Analyzer列出了网页的所有请求数据和结果:
为了更方便的查看JS的结果,我们先清空数据,然后输入快递单号:7,点击查询按钮,然后查看HTTP Analyzer的结果:
这是点击查询按钮后HTTP Analyzer的结果。让我们继续检查:
从上两图可以看出,HTTP Analyzer可以拦截JS返回的数据,并在Response Content中展示。同时可以看到JS请求的网页地址。
在这种情况下,我们只需要分析HTTP Analyzer的结果,然后模拟JS的行为来获取数据,即我们只需要访问JS请求的网页地址就可以获取数据。当然,前提是数据没有加密。记下 JS 请求的 URL:
然后让程序请求这个页面的结果!
这是代码:
public void captureJavascript(String postid) 抛出异常 {
字符串 strURL = "" + postid
+ "&channel=&rnd=0";
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
System.out.println("captureJavascript():\n" + contentBuf.toString()的结果);
}你看,抓取JS的方式和抓取原创网页的代码完全一样,我们只是做了一个解析JS的过程。
下面是程序运行的结果:
captureJavascript() 的结果:
运单跟踪信息 [7]
这些数据就是JS返回的结果,我们的目的就达到了!
希望这篇文章能对需要的朋友有所帮助。如果您需要程序源代码,请点击这里下载! 查看全部
java爬虫抓取网页数据(某个站点对数据的显示方式略有不同演示怎样抓取站点的数据)
有时因为各种原因,我们需要从某个站点采集数据,但是因为不同站点显示的数据略有不同!
本文使用Java向大家展示如何抓取网站数据:(1)抓取原创网页数据;(2)抓取网页Javascript返回的数据。
一、 抓取原创网页。
在这个例子中,我们将从上面获取 ip 查询的结果:
第一步:打开这个网页,输入IP:111.142.55.73,点击查询按钮,可以看到网页显示的结果:

第二步:查看网页的源码,我们在源码中看到这一段:

由此可以看出,再次请求网页后,显示查询的结果。
查询后看网页地址:

换句话说,我们只能通过访问这种 URL 来获取 ip 查询的结果。接下来看代码:
public void captureHtml(String ip) 抛出异常 {
字符串 strURL = "" + ip;
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
String buf = contentBuf.toString();
int beginIx = buf.indexOf("查询结果[");
int endIx = buf.indexOf("以上四项依次显示");
String result = buf.substring(beginIx, endIx);
System.out.println("captureHtml() 结果:\n" + result);
}使用HttpURLConnection连接站点,使用bufReader保存网页返回的数据,然后通过自己定义的解析方法展示结果。
这里我只是随便解析了一下,想要解析准确,就需要自己处理了。
分析结果如下:
captureHtml() 的结果:
查询结果[1]:111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市手机
二、 抓取网页的 JavaScript 返回的结果。
有时,网站为了保护自己的数据,不会直接在网页的源代码中返回数据,而是使用异步的方式用JS返回数据,这样可以避免网站数据被诸如搜索引擎。
首先看这个页面:

我用第一种方法查看网页源代码,但是没有找到运单的跟踪信息,因为是通过JS获取的结果。
但是有时候我们非常需要获取JS数据,这个时候我们该怎么办呢?
这时候我们就需要用到一个工具:HTTP Analyzer,这个工具可以拦截Http的交互内容,我们使用这个工具来达到我们的目的。
先点击开始按钮后,它开始监控网页的交互行为。
我们打开网页:,可以看到HTTP Analyzer列出了网页的所有请求数据和结果:

为了更方便的查看JS的结果,我们先清空数据,然后输入快递单号:7,点击查询按钮,然后查看HTTP Analyzer的结果:

这是点击查询按钮后HTTP Analyzer的结果。让我们继续检查:


从上两图可以看出,HTTP Analyzer可以拦截JS返回的数据,并在Response Content中展示。同时可以看到JS请求的网页地址。
在这种情况下,我们只需要分析HTTP Analyzer的结果,然后模拟JS的行为来获取数据,即我们只需要访问JS请求的网页地址就可以获取数据。当然,前提是数据没有加密。记下 JS 请求的 URL:
然后让程序请求这个页面的结果!
这是代码:
public void captureJavascript(String postid) 抛出异常 {
字符串 strURL = "" + postid
+ "&channel=&rnd=0";
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
System.out.println("captureJavascript():\n" + contentBuf.toString()的结果);
}你看,抓取JS的方式和抓取原创网页的代码完全一样,我们只是做了一个解析JS的过程。
下面是程序运行的结果:
captureJavascript() 的结果:
运单跟踪信息 [7]
这些数据就是JS返回的结果,我们的目的就达到了!
希望这篇文章能对需要的朋友有所帮助。如果您需要程序源代码,请点击这里下载!
java爬虫抓取网页数据(parserparser )
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-10-17 07:22
)
问题:
一些网页数据是由js动态生成的。一般我们通过抓包就可以看到真正的数据实体是哪个异步请求获取的,但是获取数据的请求链接也可能是其他js生成的。这时候我们希望直接拿到js加载后的最终网页数据。
解决方案:
幻象
1.下载phantomjs,【官网】:
2.我们是windows平台,解压,bin目录下会看到exe可执行文件。就够了。
3.写一个parser.js:
system = require('system')
address = system.args[1];
var page = require('webpage').create();
var url = address;
page.settings.resourceTimeout = 1000*10; // 10 seconds
page.onResourceTimeout = function(e) {
console.log(page.content);
phantom.exit(1);
};
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log(page.content);
}
phantom.exit();
});
4.java 调用
Runtime rt = Runtime.getRuntime();
Process process = null;
try {
process = rt.exec("C:/phantomjs.exe C:/parser.js " +url);
InputStream in = process.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null; 查看全部
java爬虫抓取网页数据(parserparser
)
问题:
一些网页数据是由js动态生成的。一般我们通过抓包就可以看到真正的数据实体是哪个异步请求获取的,但是获取数据的请求链接也可能是其他js生成的。这时候我们希望直接拿到js加载后的最终网页数据。
解决方案:
幻象
1.下载phantomjs,【官网】:
2.我们是windows平台,解压,bin目录下会看到exe可执行文件。就够了。
3.写一个parser.js:
system = require('system')
address = system.args[1];
var page = require('webpage').create();
var url = address;
page.settings.resourceTimeout = 1000*10; // 10 seconds
page.onResourceTimeout = function(e) {
console.log(page.content);
phantom.exit(1);
};
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log(page.content);
}
phantom.exit();
});
4.java 调用
Runtime rt = Runtime.getRuntime();
Process process = null;
try {
process = rt.exec("C:/phantomjs.exe C:/parser.js " +url);
InputStream in = process.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-17 07:19
Java爬虫介绍(二)——Jsoup解析原创HTML页面链接:
在上一节中,我们获取了页面的 HTML 源代码,但这些源代码是提供给浏览器解析的。我们需要的数据其实就是页面上博客的标题、作者、简介、发布日期等。我们需要一种方法来从 HTML 源代码中解析和提取这些信息,然后将其存储在文本或数据库中。在本篇博客中,我们将介绍使用Jsoup包来帮助我们解析页面和提取数据。
Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址或解析 HTML 内容。它的主要功能包括解析 HTML 页面、通过 DOM 或 CSS 选择器搜索和提取数据以及更改 HTML 内容。Jsoup的使用也很简单。使用Jsoup.parse(String str)方法解析我们之前获取的HTML内容,得到一个Documend类。剩下的工作就是从Document中选择我们需要的数据。例如,假设我们有一个收录以下内容的 HTML 页面:
第一篇博客
第二篇博客
第三篇博客
通过Jsoup,我们可以将上述三个博客的标题提取成一个List。使用方法如下:
首先我们通过maven引入Jsoup
org.jsoup
jsoup
1.10.3
然后写Java进行分析。
package org.hfutec.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
List titles = new ArrayList();
List urls = new ArrayList();
//假设我们获取的HTML的字符内容如下
String html = "<a href=\"url1\">第一篇博客</a><a href=\"url2\">第二篇博客</a><a href=\"url3\">第三篇博客</a>";
//第一步,将字符内容解析成一个Document类
Document doc = Jsoup.parse(html);
//第二步,根据我们需要得到的标签,选择提取相应标签的内容
Elements elements = doc.select("div[id=blog_list]").select("div[class=blog_title]");
for( Element element : elements ){
String title = element.text();
titles.add(title);
urls.add(element.select("a").attr("href"));
}
//输出测试
for( String title : titles ){
System.out.println(title);
}
for( String url : urls ){
System.out.println(url);
}
}
}
我们简单介绍一下Jsoup的解析过程。第一步是调用parse()方法将字符对象变成Document对象,然后我们对这个对象进行操作。通常,提取数据是根据标签选择数据。select() 方法和 /css 选择器的语法格式相同。一般提取某个标签,其属性值就是指定的内容。结果是一个Elements的集合,也就是Elements(因为可能有很多合格的标签,所以结果是一个集合)。select() 方法可以一直持续到我们想要的标签集被选中为止(注意我们不必逐级选择标签,直接在我们需要的标签上写select()方法即可这里的代码可以直接写成 Elements elements = doc.select("
e39b4f52-98fc-4ed5-9c43-15b1dc04f823.jpg
更多Jsoup解析操作请参考:1、 2、
一个实例
下面我们就按照前面爬取数据的例子学习官方网站博客列表来讲解一个例子。我们已经知道可以使用 Jsoup 来解析抓取到的 HTML 页面内容。那么如何查看我们需要的内容对应的标签呢?以Chrome浏览器为例,我们需要抓取这个页面的博客。首先用Chrome浏览器打开网址,然后右击博客标题,点击“检查”,得到HTML页面。如下所示。
94f6bf06-312a-4781-97c8-99d2b9d57884.jpg
d810463f-c23d-4dae-98cc-08764fbbef85.jpg
d310a4ae-c2e0-45f1-8637-9f8b390baa3b.jpg
图4 确认当前博客HTML代码的一致性
经过上面的操作,我们已经可以看到所有的博客标题等信息都存储在了class=card div中。所以,我们只需要关注这个标签中的内容是如何组织的。如下图所示,我们需要的信息所属的标签,点击小三角展开即可。
7e161a6f-bbff-44e3-a422-08d18102cbb3.jpg
因此,解析博客列表的代码可以写成如下。
package org.hfutec.example;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
String url = "http://www.datalearner.com/blog_list";
String rawHTML = null;
try {
rawHTML = getHTMLContent(url);
} catch (IOException e) {
e.printStackTrace();
}
//将当前页面转换成Jsoup的Document对象
Document doc = Jsoup.parse(rawHTML);
//获取所有的博客列表集合
Elements blogList = doc.select("div[class=card]");
//针对每个博客内容进行解析,并输出
for( Element element : blogList ){
String title = element.select("h4[class=card-title]").text();
String introduction = element.select("p[class=card-text]").text();
String author = element.select("span[class=fa fa-user]").text();
System.out.println("Title:\t"+title);
System.out.println("introduction:\t"+introduction);
System.out.println("Author:\t"+author);
System.out.println("--------------------------");
}
}
//根据url地址获取对应页面的HTML内容,我们将上一节中的内容打包成了一个方法,方便调用
private static String getHTMLContent( String url ) throws IOException {
//建立一个新的请求客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
//使用HttpGet方式请求网址
HttpGet httpGet = new HttpGet(url);
//获取网址的返回结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取返回结果中的实体
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
//关闭HttpEntity流
EntityUtils.consume(entity);
return content;
}
}
e248e590-b1c7-4df3-b9ab-074fb86095ec.jpg 查看全部
java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)
Java爬虫介绍(二)——Jsoup解析原创HTML页面链接:
在上一节中,我们获取了页面的 HTML 源代码,但这些源代码是提供给浏览器解析的。我们需要的数据其实就是页面上博客的标题、作者、简介、发布日期等。我们需要一种方法来从 HTML 源代码中解析和提取这些信息,然后将其存储在文本或数据库中。在本篇博客中,我们将介绍使用Jsoup包来帮助我们解析页面和提取数据。
Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址或解析 HTML 内容。它的主要功能包括解析 HTML 页面、通过 DOM 或 CSS 选择器搜索和提取数据以及更改 HTML 内容。Jsoup的使用也很简单。使用Jsoup.parse(String str)方法解析我们之前获取的HTML内容,得到一个Documend类。剩下的工作就是从Document中选择我们需要的数据。例如,假设我们有一个收录以下内容的 HTML 页面:
第一篇博客
第二篇博客
第三篇博客
通过Jsoup,我们可以将上述三个博客的标题提取成一个List。使用方法如下:
首先我们通过maven引入Jsoup
org.jsoup
jsoup
1.10.3
然后写Java进行分析。
package org.hfutec.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
List titles = new ArrayList();
List urls = new ArrayList();
//假设我们获取的HTML的字符内容如下
String html = "<a href=\"url1\">第一篇博客</a><a href=\"url2\">第二篇博客</a><a href=\"url3\">第三篇博客</a>";
//第一步,将字符内容解析成一个Document类
Document doc = Jsoup.parse(html);
//第二步,根据我们需要得到的标签,选择提取相应标签的内容
Elements elements = doc.select("div[id=blog_list]").select("div[class=blog_title]");
for( Element element : elements ){
String title = element.text();
titles.add(title);
urls.add(element.select("a").attr("href"));
}
//输出测试
for( String title : titles ){
System.out.println(title);
}
for( String url : urls ){
System.out.println(url);
}
}
}
我们简单介绍一下Jsoup的解析过程。第一步是调用parse()方法将字符对象变成Document对象,然后我们对这个对象进行操作。通常,提取数据是根据标签选择数据。select() 方法和 /css 选择器的语法格式相同。一般提取某个标签,其属性值就是指定的内容。结果是一个Elements的集合,也就是Elements(因为可能有很多合格的标签,所以结果是一个集合)。select() 方法可以一直持续到我们想要的标签集被选中为止(注意我们不必逐级选择标签,直接在我们需要的标签上写select()方法即可这里的代码可以直接写成 Elements elements = doc.select("
e39b4f52-98fc-4ed5-9c43-15b1dc04f823.jpg
更多Jsoup解析操作请参考:1、 2、
一个实例
下面我们就按照前面爬取数据的例子学习官方网站博客列表来讲解一个例子。我们已经知道可以使用 Jsoup 来解析抓取到的 HTML 页面内容。那么如何查看我们需要的内容对应的标签呢?以Chrome浏览器为例,我们需要抓取这个页面的博客。首先用Chrome浏览器打开网址,然后右击博客标题,点击“检查”,得到HTML页面。如下所示。
94f6bf06-312a-4781-97c8-99d2b9d57884.jpg
d810463f-c23d-4dae-98cc-08764fbbef85.jpg
d310a4ae-c2e0-45f1-8637-9f8b390baa3b.jpg
图4 确认当前博客HTML代码的一致性
经过上面的操作,我们已经可以看到所有的博客标题等信息都存储在了class=card div中。所以,我们只需要关注这个标签中的内容是如何组织的。如下图所示,我们需要的信息所属的标签,点击小三角展开即可。
7e161a6f-bbff-44e3-a422-08d18102cbb3.jpg
因此,解析博客列表的代码可以写成如下。
package org.hfutec.example;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
String url = "http://www.datalearner.com/blog_list";
String rawHTML = null;
try {
rawHTML = getHTMLContent(url);
} catch (IOException e) {
e.printStackTrace();
}
//将当前页面转换成Jsoup的Document对象
Document doc = Jsoup.parse(rawHTML);
//获取所有的博客列表集合
Elements blogList = doc.select("div[class=card]");
//针对每个博客内容进行解析,并输出
for( Element element : blogList ){
String title = element.select("h4[class=card-title]").text();
String introduction = element.select("p[class=card-text]").text();
String author = element.select("span[class=fa fa-user]").text();
System.out.println("Title:\t"+title);
System.out.println("introduction:\t"+introduction);
System.out.println("Author:\t"+author);
System.out.println("--------------------------");
}
}
//根据url地址获取对应页面的HTML内容,我们将上一节中的内容打包成了一个方法,方便调用
private static String getHTMLContent( String url ) throws IOException {
//建立一个新的请求客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
//使用HttpGet方式请求网址
HttpGet httpGet = new HttpGet(url);
//获取网址的返回结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取返回结果中的实体
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
//关闭HttpEntity流
EntityUtils.consume(entity);
return content;
}
}
e248e590-b1c7-4df3-b9ab-074fb86095ec.jpg
java爬虫抓取网页数据( 主流好用java爬虫框架的选择介绍,推荐的都是主流)
网站优化 • 优采云 发表了文章 • 0 个评论 • 119 次浏览 • 2021-10-15 21:17
主流好用java爬虫框架的选择介绍,推荐的都是主流)
Crawler 可以看作是一种检测器。它的基本操作是模拟人类行为。通过各种网站,点击按钮查看数据,或者将看到的信息返回给用户。
1、Scrapy
Scrapy是一个用于抓取网站数据并提取结构化数据的应用框架。可应用于数据挖掘、信息处理或存储历史数据等一系列程序。这是一个非常强大的爬虫框架,可以满足简单的页面爬取,比如对urlpattern有清晰的认识。使用此框架,您可以轻松捕获亚马逊产品信息等数据。但是对于稍微复杂一点的页面,比如微博的页面信息,这个框架就不能满足需求了。
2、webmgaic
WebMagic 是一个简单灵活的 Java 爬虫框架。可以根据网页图片快速开发一个高效且易于维护的爬虫程序。
3、美汤
集成一些常见的爬虫需求。它也是一个 Python 库,可以从 HTML 或 XML 文件中提取数据。通过您喜欢的转换器,可以实现常用的文档导航、搜索和修改文档。BeautifulSoup 可以帮助您节省数小时甚至数天的工作时间。BeautifulSoup 的缺点是无法加载 JS。
4、Apache Nutch2
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
以上就是java爬虫框架的介绍。在爬虫框架的选择上,我们还有很多选择的机会。下面介绍一些主流的好用的java爬虫框架。如果一个网络爬虫想要采集大量数据,需要HTTP代理IP的配合,希望对大家有所帮助。
推荐运行环境:windows7系统,java10版本,DELL G3电脑。 查看全部
java爬虫抓取网页数据(
主流好用java爬虫框架的选择介绍,推荐的都是主流)

Crawler 可以看作是一种检测器。它的基本操作是模拟人类行为。通过各种网站,点击按钮查看数据,或者将看到的信息返回给用户。
1、Scrapy
Scrapy是一个用于抓取网站数据并提取结构化数据的应用框架。可应用于数据挖掘、信息处理或存储历史数据等一系列程序。这是一个非常强大的爬虫框架,可以满足简单的页面爬取,比如对urlpattern有清晰的认识。使用此框架,您可以轻松捕获亚马逊产品信息等数据。但是对于稍微复杂一点的页面,比如微博的页面信息,这个框架就不能满足需求了。
2、webmgaic
WebMagic 是一个简单灵活的 Java 爬虫框架。可以根据网页图片快速开发一个高效且易于维护的爬虫程序。
3、美汤
集成一些常见的爬虫需求。它也是一个 Python 库,可以从 HTML 或 XML 文件中提取数据。通过您喜欢的转换器,可以实现常用的文档导航、搜索和修改文档。BeautifulSoup 可以帮助您节省数小时甚至数天的工作时间。BeautifulSoup 的缺点是无法加载 JS。
4、Apache Nutch2
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
以上就是java爬虫框架的介绍。在爬虫框架的选择上,我们还有很多选择的机会。下面介绍一些主流的好用的java爬虫框架。如果一个网络爬虫想要采集大量数据,需要HTTP代理IP的配合,希望对大家有所帮助。
推荐运行环境:windows7系统,java10版本,DELL G3电脑。
java爬虫抓取网页数据( 流行的Python库和框架是怎样的?(二))
网站优化 • 优采云 发表了文章 • 0 个评论 • 85 次浏览 • 2021-10-14 15:07
流行的Python库和框架是怎样的?(二))
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
post_points = int(points_list[idx].get_text().replace(' points', ''))
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
上述脚本仅从 Hacker News 的第一页获取热门帖子。但是,根据所需的目标,我们需要从前五页或可能输入的任意页数中获取列表。因此,您可以相应地修改脚本。
import requests
from bs4 import BeautifulSoup
import pprint
import time
BASE_URL = 'https://news.ycombinator.com'
# response = requests.get(BASE_URL)
def get_lists_and_points(soup):
# extract all the links using the class selector
links_list = soup.select('.storylink')
# extract all the points using the class selector
points_list = soup.select('.score')
return (links_list, points_list)
def parse_response(response):
# extract the text content of the web page
response_text = response.text
# parse HTML
soup = BeautifulSoup(response_text, 'html.parser')
return soup
def get_paginated_data(pages):
total_links_list = []
total_points_list = []
for page in range(pages):
URL = BASE_URL + f'?p={page+1}'
response = requests.get(URL)
soup = parse_response(response)
links_list, points_list = get_lists_and_points(soup)
for link in links_list:
total_links_list.append(link)
for point in points_list:
total_points_list.append(point)
# add 30 seconds delay as per hacker news robots.txt rules
time.sleep(30)
return (total_links_list, total_points_list)
def generate_popular_posts(links_list, points_list):
# create an empty popular posts list
popular_posts = []
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
# if points data is not available, assign it a default of 0
try:
post_points = int(
points_list[idx].get_text().replace(' points', ''))
except:
points_list = 0
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
return popular_posts
def sort_posts_by_points(posts):
return sorted(posts, key=lambda x: x['points'], reverse=True)
def main():
total_links_list, total_points_list = get_paginated_data(5)
popular_posts = generate_popular_posts(total_links_list, total_points_list)
sorted_posts = sort_posts_by_points(popular_posts)
# print posts sorted by highest to lowest
pprint.pprint(sorted_posts)
if(__name__ == '__main__'):
main()
现在使用这个脚本,我们甚至不需要访问黑客新闻和搜索热门新闻。我们可以从控制台运行这个脚本并获取最新消息。随意根据您的需要调整脚本并对其进行试验或尝试从您最喜欢的 网站 中获取数据。
我们可以用上面的数据做很多事情,比如
热门爬虫库
Beautiful Soup 在从 网站 获取数据时有其局限性。使用起来非常简单,但是为了从客户端呈现的复杂网站(Angular,基于React的网站)中抓取数据,网站@时HTML标签将不可用> 已加载。要从这样的 网站 获取数据,您可以使用更高级的库。以下是一些流行的 Python 库和框架。
网页抓取是一个广阔的领域。对于 Beautiful Soup,我们可能只是触及了表面。这个领域有很多可能性,我会在探索更多使用Python进行数据分析的同时探索更多。希望我已经能够涵盖进一步探索所需的基本概念。
明天我将讨论使用 Python 进行 Web 开发的概念。 查看全部
java爬虫抓取网页数据(
流行的Python库和框架是怎样的?(二))
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
post_points = int(points_list[idx].get_text().replace(' points', ''))
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
上述脚本仅从 Hacker News 的第一页获取热门帖子。但是,根据所需的目标,我们需要从前五页或可能输入的任意页数中获取列表。因此,您可以相应地修改脚本。
import requests
from bs4 import BeautifulSoup
import pprint
import time
BASE_URL = 'https://news.ycombinator.com'
# response = requests.get(BASE_URL)
def get_lists_and_points(soup):
# extract all the links using the class selector
links_list = soup.select('.storylink')
# extract all the points using the class selector
points_list = soup.select('.score')
return (links_list, points_list)
def parse_response(response):
# extract the text content of the web page
response_text = response.text
# parse HTML
soup = BeautifulSoup(response_text, 'html.parser')
return soup
def get_paginated_data(pages):
total_links_list = []
total_points_list = []
for page in range(pages):
URL = BASE_URL + f'?p={page+1}'
response = requests.get(URL)
soup = parse_response(response)
links_list, points_list = get_lists_and_points(soup)
for link in links_list:
total_links_list.append(link)
for point in points_list:
total_points_list.append(point)
# add 30 seconds delay as per hacker news robots.txt rules
time.sleep(30)
return (total_links_list, total_points_list)
def generate_popular_posts(links_list, points_list):
# create an empty popular posts list
popular_posts = []
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
# if points data is not available, assign it a default of 0
try:
post_points = int(
points_list[idx].get_text().replace(' points', ''))
except:
points_list = 0
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
return popular_posts
def sort_posts_by_points(posts):
return sorted(posts, key=lambda x: x['points'], reverse=True)
def main():
total_links_list, total_points_list = get_paginated_data(5)
popular_posts = generate_popular_posts(total_links_list, total_points_list)
sorted_posts = sort_posts_by_points(popular_posts)
# print posts sorted by highest to lowest
pprint.pprint(sorted_posts)
if(__name__ == '__main__'):
main()
现在使用这个脚本,我们甚至不需要访问黑客新闻和搜索热门新闻。我们可以从控制台运行这个脚本并获取最新消息。随意根据您的需要调整脚本并对其进行试验或尝试从您最喜欢的 网站 中获取数据。
我们可以用上面的数据做很多事情,比如
热门爬虫库
Beautiful Soup 在从 网站 获取数据时有其局限性。使用起来非常简单,但是为了从客户端呈现的复杂网站(Angular,基于React的网站)中抓取数据,网站@时HTML标签将不可用> 已加载。要从这样的 网站 获取数据,您可以使用更高级的库。以下是一些流行的 Python 库和框架。
网页抓取是一个广阔的领域。对于 Beautiful Soup,我们可能只是触及了表面。这个领域有很多可能性,我会在探索更多使用Python进行数据分析的同时探索更多。希望我已经能够涵盖进一步探索所需的基本概念。
明天我将讨论使用 Python 进行 Web 开发的概念。
java爬虫抓取网页数据(Java的Http协议客户端HttpClient来实现抓取网页数据(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2021-10-14 15:03
爬虫抓取网页上的数据,我们同样点击链接访问网页数据。就是使用Http协议访问网页。这里我们使用Java Http协议客户端HttpClient来实现网页数据的爬取。
你好,世界
获取带参数的请求
使用参数发布请求
帖子也很简单,和上面的差不多,只是改变了发起请求的方式,如下:
当然,如果没有参数,则不需要创建表单对象,只需一个 HttpPost 对象即可。
代码中对象的说明:
代码优化:连接池
在我们爬取数据的过程中,HttpClient连接对象的创建和销毁是非常频繁的,这里我们使用连接池进行优化
public class poolTest {
public static void main(String[] args) {
//创建连接池管理器
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(100); //设置池内最大连接数
pcm.setDefaultMaxPerRoute(10); //设置每个坠机的最大连接数
//从连接池中获取连接对象,而不是单独创建连接对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build();
HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen");
System.out.println(httpGet);
//使用httpClient发起请求,获得响应
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpGet);
//解析响应,获取到数据
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity,"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (response != null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//因为我们是连接池中获取到的连接,所以这里不能再给他关闭了
//httpClient.close();
}
}
}
}
获取资源的相关时间配置
Jsoup 不是 Jsonp
经过我们上面的学习,我们已经可以通过HttpClient抓取页面了。抓取页面后,我们可以解析它。您可以使用字符串解析工具来解析页面,也可以使用正则表达式。对于解析,但是这两种方案的开发成本都很高,不推荐使用,这里我们学习了一个专门解析html页面的技术,Jsonp
汤品介绍
jsonp 是一个 Java Html 解析器,可以自行解析 URL 地址和 html 文本内容。它有一组现成的 API 来删除和操作数据。
jsonp的作用:
Jsoup 解析 URL
添加 Jsoup 依赖以使用 Jsoup
注意:Jsoup 只限于使用 Html 解析工具,而不是替代 HttpClient 来发起请求,因为 HttpClient 支持多线程、连接池、代理等技术,而 Jsoup 对此的支持并不理想。专业的事情交给专业的人,HttpClient发送请求抓取数据,Jsoup做解析
Jsoup 解析字符串
Jsoup解析文件
这是上面的静态页面。除了转换成String再解析,我们也可以直接解析文件
使用 Dom 遍历文档
记得还有一个sax解析,比较麻烦,现在差点忘了;
Dom解析,不知道大家有没有听过或者用过。反正我之前用过,但是解析的确实是XML。先简单介绍一个Dmo方法。
Dmo 解析会将目标文档视为一个对象。首先将整个文档加载到内存中。如果文档太大,内存可能会溢出(一般不会)。加载到内存后,会构建一个Dom树,然后Just开始提供访问和修改操作
如果你之前没有学习过,我们通过一个小Demo来学习。如果您使用过它,我们有权对其进行审核:
Java代码如下: 我演示了几个常用的获取页面数据的API
从元素中获取属性
选择器
下面是上述always选择器的使用演示
选择器选择器组合使用
Hello World 类爬虫案例列表
在上面的学习中,我们已经知道HttpClient是用来爬取数据的,Jsoup是用来分析HttpClient爬取到的数据的。下面我们来练习一下这两个工具的使用。
搁浅了一会儿,暂时……以后更新 查看全部
java爬虫抓取网页数据(Java的Http协议客户端HttpClient来实现抓取网页数据(组图))
爬虫抓取网页上的数据,我们同样点击链接访问网页数据。就是使用Http协议访问网页。这里我们使用Java Http协议客户端HttpClient来实现网页数据的爬取。
你好,世界
获取带参数的请求
使用参数发布请求
帖子也很简单,和上面的差不多,只是改变了发起请求的方式,如下:
当然,如果没有参数,则不需要创建表单对象,只需一个 HttpPost 对象即可。
代码中对象的说明:
代码优化:连接池
在我们爬取数据的过程中,HttpClient连接对象的创建和销毁是非常频繁的,这里我们使用连接池进行优化
public class poolTest {
public static void main(String[] args) {
//创建连接池管理器
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(100); //设置池内最大连接数
pcm.setDefaultMaxPerRoute(10); //设置每个坠机的最大连接数
//从连接池中获取连接对象,而不是单独创建连接对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build();
HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen");
System.out.println(httpGet);
//使用httpClient发起请求,获得响应
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpGet);
//解析响应,获取到数据
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity,"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (response != null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//因为我们是连接池中获取到的连接,所以这里不能再给他关闭了
//httpClient.close();
}
}
}
}
获取资源的相关时间配置
Jsoup 不是 Jsonp
经过我们上面的学习,我们已经可以通过HttpClient抓取页面了。抓取页面后,我们可以解析它。您可以使用字符串解析工具来解析页面,也可以使用正则表达式。对于解析,但是这两种方案的开发成本都很高,不推荐使用,这里我们学习了一个专门解析html页面的技术,Jsonp
汤品介绍
jsonp 是一个 Java Html 解析器,可以自行解析 URL 地址和 html 文本内容。它有一组现成的 API 来删除和操作数据。
jsonp的作用:
Jsoup 解析 URL
添加 Jsoup 依赖以使用 Jsoup
注意:Jsoup 只限于使用 Html 解析工具,而不是替代 HttpClient 来发起请求,因为 HttpClient 支持多线程、连接池、代理等技术,而 Jsoup 对此的支持并不理想。专业的事情交给专业的人,HttpClient发送请求抓取数据,Jsoup做解析
Jsoup 解析字符串
Jsoup解析文件
这是上面的静态页面。除了转换成String再解析,我们也可以直接解析文件
使用 Dom 遍历文档
记得还有一个sax解析,比较麻烦,现在差点忘了;
Dom解析,不知道大家有没有听过或者用过。反正我之前用过,但是解析的确实是XML。先简单介绍一个Dmo方法。
Dmo 解析会将目标文档视为一个对象。首先将整个文档加载到内存中。如果文档太大,内存可能会溢出(一般不会)。加载到内存后,会构建一个Dom树,然后Just开始提供访问和修改操作
如果你之前没有学习过,我们通过一个小Demo来学习。如果您使用过它,我们有权对其进行审核:
Java代码如下: 我演示了几个常用的获取页面数据的API
从元素中获取属性
选择器
下面是上述always选择器的使用演示
选择器选择器组合使用
Hello World 类爬虫案例列表
在上面的学习中,我们已经知道HttpClient是用来爬取数据的,Jsoup是用来分析HttpClient爬取到的数据的。下面我们来练习一下这两个工具的使用。
搁浅了一会儿,暂时……以后更新
java爬虫抓取网页数据(对网页爬虫的调查结果调查人:王杨斌对于爬虫工具以及代码的调查)
网站优化 • 优采云 发表了文章 • 0 个评论 • 113 次浏览 • 2021-10-11 15:33
网络爬虫调查结果调查员:王阳斌对爬虫工具和代码的调查,调查的主要内容是关于PHP和Java的工具代码。1.Java类爬虫1.1.JAVA爬虫WebCollector爬虫介绍:WebCollector[]是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,只需少量代码即可实现强大的爬虫。爬虫内核:WebCollector 致力于维护一个稳定可扩展的爬虫内核,方便开发者进行灵活的二次开发。内核非常强大。1.2.Web-HarvestWeb-Harvest[] 是一个用Java语言编写的网络爬虫工具,应用广泛。它可以采集指定的页面并从这些页面中提取有用的数据。Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。
JSpider 的默认配置类型很少,也不是很有用。但是JSpider非常容易扩展,你可以用它来开发强大的网络爬虫和数据分析工具。为此,您需要深入了解JSpider 的原理,然后根据您的需要开发插件并编写配置文件。1.4.网络爬虫 HeritrixHeritrix[] 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循robots.txt 文件中的排除说明和METArobots 标签。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。Heritrix是一个爬虫框架,其组织结构包括整个组件和爬虫过程。1.5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。
您可以使用它来构建多线程 Web 爬虫。1.7.Java 网络蜘蛛/网络爬虫 SpidermanSpiderman[] 是一个基于微内核+插件架构的网络蜘蛛。它的目标是以简单的方式捕获复杂的目标网页信息,并将其解析为您需要的业务数据。2.C/C++类爬虫2.1.网站爬虫 GrubNextGenerationGrubNextGeneration[] 是一个分布式的网络爬虫系统,包括客户端和服务端,可以用来维护网页 。其开发语言:C/C++PerlC#。2.2.网络爬虫甲醇甲醇[]是一款模块化、可定制的网络爬虫软件。主要优点是速度快。2.3.网络爬虫/网络蜘蛛 larbinLarbin[] 是一个开源的网络爬虫/网络蜘蛛, 查看全部
java爬虫抓取网页数据(对网页爬虫的调查结果调查人:王杨斌对于爬虫工具以及代码的调查)
网络爬虫调查结果调查员:王阳斌对爬虫工具和代码的调查,调查的主要内容是关于PHP和Java的工具代码。1.Java类爬虫1.1.JAVA爬虫WebCollector爬虫介绍:WebCollector[]是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,只需少量代码即可实现强大的爬虫。爬虫内核:WebCollector 致力于维护一个稳定可扩展的爬虫内核,方便开发者进行灵活的二次开发。内核非常强大。1.2.Web-HarvestWeb-Harvest[] 是一个用Java语言编写的网络爬虫工具,应用广泛。它可以采集指定的页面并从这些页面中提取有用的数据。Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。
JSpider 的默认配置类型很少,也不是很有用。但是JSpider非常容易扩展,你可以用它来开发强大的网络爬虫和数据分析工具。为此,您需要深入了解JSpider 的原理,然后根据您的需要开发插件并编写配置文件。1.4.网络爬虫 HeritrixHeritrix[] 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循robots.txt 文件中的排除说明和METArobots 标签。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。Heritrix是一个爬虫框架,其组织结构包括整个组件和爬虫过程。1.5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。
您可以使用它来构建多线程 Web 爬虫。1.7.Java 网络蜘蛛/网络爬虫 SpidermanSpiderman[] 是一个基于微内核+插件架构的网络蜘蛛。它的目标是以简单的方式捕获复杂的目标网页信息,并将其解析为您需要的业务数据。2.C/C++类爬虫2.1.网站爬虫 GrubNextGenerationGrubNextGeneration[] 是一个分布式的网络爬虫系统,包括客户端和服务端,可以用来维护网页 。其开发语言:C/C++PerlC#。2.2.网络爬虫甲醇甲醇[]是一款模块化、可定制的网络爬虫软件。主要优点是速度快。2.3.网络爬虫/网络蜘蛛 larbinLarbin[] 是一个开源的网络爬虫/网络蜘蛛,
java爬虫抓取网页数据(用到抓取网页数据的功能:抓取数据功能详解)
网站优化 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2021-10-09 21:22
经常用到抓取网页数据的功能。它已在以前的工作中使用。今天总结了一下:
1、 通过指定的 URL 抓取网页数据获取页面信息,然后用 DOM 对页面进行 NODE 分析,处理得到原创的 HTML 数据,这样做的好处是可以灵活处理一个某条数据高 难点在于分段算法的优化。当页面HTML信息量较大时,算法不好,会影响处理效率。
2、htmlparser框架,对于html页面处理的数据结构,HtmlParser采用经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode、Tag来描述HTML页面的元素。 Htmlparser基本可以满足垂直搜索引擎页面处理分析的需要,映射HTML标签,可以方便的获取标签中的HTMLCODE。
Htmlparser官方介绍:htmlparser是一个纯java的html解析库,不依赖其他java库文件,主要用于转换或提取html。可以超高速解析html,不会出错。最新版本的 htmlparser 现在是 2.0。可以毫不夸张地说,htmlparser是目前最好的html解析分析工具。
3、nekohtml框架,nekohtml在容错性和性能(包括htmlunit和nekohtml)方面比htmlparser有更好的口碑,nokehtml类似xml解析原理,html标签正确解析为dom 它们对应DOM树中对应的元素进行处理。
NekoHTML 官方介绍:NekoHTML 是一个 Java 语言的 HTML 扫描器和标签平衡器,它使程序能够解析 HTML 文档并使用标准的 XML 接口来访问其中的信息。这个解析器可以扫描 HTML 文件并“纠正”作者(人或机器)在编写 HTML 文档过程中经常犯的许多错误。
NekoHTML 可以添加缺失的父元素,自动关闭带有结束标签的对应元素,以及不匹配的内联元素标签。 NekoHTML 的开发使用 XercesNativeInterface (XNI),它是 Xerces2 的基础。 查看全部
java爬虫抓取网页数据(用到抓取网页数据的功能:抓取数据功能详解)
经常用到抓取网页数据的功能。它已在以前的工作中使用。今天总结了一下:
1、 通过指定的 URL 抓取网页数据获取页面信息,然后用 DOM 对页面进行 NODE 分析,处理得到原创的 HTML 数据,这样做的好处是可以灵活处理一个某条数据高 难点在于分段算法的优化。当页面HTML信息量较大时,算法不好,会影响处理效率。
2、htmlparser框架,对于html页面处理的数据结构,HtmlParser采用经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode、Tag来描述HTML页面的元素。 Htmlparser基本可以满足垂直搜索引擎页面处理分析的需要,映射HTML标签,可以方便的获取标签中的HTMLCODE。
Htmlparser官方介绍:htmlparser是一个纯java的html解析库,不依赖其他java库文件,主要用于转换或提取html。可以超高速解析html,不会出错。最新版本的 htmlparser 现在是 2.0。可以毫不夸张地说,htmlparser是目前最好的html解析分析工具。
3、nekohtml框架,nekohtml在容错性和性能(包括htmlunit和nekohtml)方面比htmlparser有更好的口碑,nokehtml类似xml解析原理,html标签正确解析为dom 它们对应DOM树中对应的元素进行处理。
NekoHTML 官方介绍:NekoHTML 是一个 Java 语言的 HTML 扫描器和标签平衡器,它使程序能够解析 HTML 文档并使用标准的 XML 接口来访问其中的信息。这个解析器可以扫描 HTML 文件并“纠正”作者(人或机器)在编写 HTML 文档过程中经常犯的许多错误。
NekoHTML 可以添加缺失的父元素,自动关闭带有结束标签的对应元素,以及不匹配的内联元素标签。 NekoHTML 的开发使用 XercesNativeInterface (XNI),它是 Xerces2 的基础。
java爬虫抓取网页数据( MaterialDesign重构了自己的新闻App,数据来源过程Get)
网站优化 • 优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-10-08 17:34
MaterialDesign重构了自己的新闻App,数据来源过程Get)
Java实现爬虫向App提供数据(Jsoup网络爬虫)
更新时间:2020年7月31日11:57:06 作者:学习编程知识
本文文章主要介绍Java爬虫为App提供数据的实现,即Jsoup网络爬虫。文章中的示例代码很详细,有一定的参考价值。有兴趣的朋友可以参考一下。
一、要求
最近,我基于 Material Design 重构了我的新闻应用。数据源有问题。
前人分析了知乎每日新闻和凤凰新闻等API。根据对应的URL,可以得到新闻的JSON数据。为了锻炼写代码的能力,打算自己爬新闻页面,获取数据来搭建API。
二、效果图
下图为原版网站
爬虫获取数据并显示在APP移动端
三、爬虫想法
App的实现过程请参考这些文章文章。本文主要讲解如何抓取数据。
Android下记录App操作生成Gif动态图的全过程:///article/78236.htm
学习 Android Material Design(RecyclerView 而不是 ListView):///article/78232.htm
Android项目实战页面(RecyclerView):///article/78230.htm
Jsoup 简介
Jsoup 是一个 Java 开源 HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。
Jsoup主要有以下功能:
四、爬取过程
获取获取网页 HTML 的请求
新闻页面Html的DOM树如下:
下面这段代码使用代码根据指定的url获取get请求返回的html源代码。
public static String doGet(String urlStr) throws CommonException {
URL url;
String html = "";
try {
url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
html = StreamTool.inToStringByByte(in);
} else {
throw new CommonException("新闻服务器返回值不为200");
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("get请求失败");
}
return html;
}
InputStream in = connection.getInputStream();将输入流转换为字符串是一个常见的要求。我们把它抽象出来,写一个工具方法。
public class StreamTool {
public static String inToStringByByte(InputStream in) throws Exception {
ByteArrayOutputStream outStr = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
StringBuilder content = new StringBuilder();
while ((len = in.read(buffer)) != -1) {
content.append(new String(buffer, 0, len, "UTF-8"));
}
outStr.close();
return content.toString();
}
}
五、解析 HTML 获取标题
使用谷歌浏览器的审查元素,找出新闻标题的html代码:
关于举办《经典音乐作品欣赏与人文审美》讲座的通知
我们需要从上面的 HTML 中找到 id="article_title" 的部分,使用 getElementById(String id) 方法
String htmlStr = HttpTool.doGet(urlStr);
// 将获取的网页 HTML 源代码转化为 Document
Document doc = Jsoup.parse(htmlStr);
Element articleEle = doc.getElementById("article");
// 标题
Element titleEle = articleEle.getElementById("article_title");
String titleStr = titleEle.text();
六、获取发布日期和信息来源
还要找出对应的HTML代码
2015-05-28
??Դ:
浏览次数:
477
思路和上面类似。使用 getElementById(String id) 方法找出 id="article_detail" 作为 Element,然后使用 getElementsByTag 获取 span 部分。因为有 3 个 ...,它返回 Elements 而不是 Element。
// article_detail包括了 2016-01-15 来源: 浏览次数:177
Element detailEle = articleEle.getElementById("article_detail");
Elements details = detailEle.getElementsByTag("span");
// 发布时间
String dateStr = details.get(0).text();
// 新闻来源
String sourceStr = details.get(1).text();
七、分析浏览量
如果打印出上面的details.get(2).text(),你只会得到 查看全部
java爬虫抓取网页数据(
MaterialDesign重构了自己的新闻App,数据来源过程Get)
Java实现爬虫向App提供数据(Jsoup网络爬虫)
更新时间:2020年7月31日11:57:06 作者:学习编程知识
本文文章主要介绍Java爬虫为App提供数据的实现,即Jsoup网络爬虫。文章中的示例代码很详细,有一定的参考价值。有兴趣的朋友可以参考一下。
一、要求
最近,我基于 Material Design 重构了我的新闻应用。数据源有问题。
前人分析了知乎每日新闻和凤凰新闻等API。根据对应的URL,可以得到新闻的JSON数据。为了锻炼写代码的能力,打算自己爬新闻页面,获取数据来搭建API。
二、效果图
下图为原版网站

爬虫获取数据并显示在APP移动端

三、爬虫想法

App的实现过程请参考这些文章文章。本文主要讲解如何抓取数据。
Android下记录App操作生成Gif动态图的全过程:///article/78236.htm
学习 Android Material Design(RecyclerView 而不是 ListView):///article/78232.htm
Android项目实战页面(RecyclerView):///article/78230.htm
Jsoup 简介
Jsoup 是一个 Java 开源 HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。
Jsoup主要有以下功能:
四、爬取过程
获取获取网页 HTML 的请求
新闻页面Html的DOM树如下:

下面这段代码使用代码根据指定的url获取get请求返回的html源代码。
public static String doGet(String urlStr) throws CommonException {
URL url;
String html = "";
try {
url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
html = StreamTool.inToStringByByte(in);
} else {
throw new CommonException("新闻服务器返回值不为200");
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("get请求失败");
}
return html;
}
InputStream in = connection.getInputStream();将输入流转换为字符串是一个常见的要求。我们把它抽象出来,写一个工具方法。
public class StreamTool {
public static String inToStringByByte(InputStream in) throws Exception {
ByteArrayOutputStream outStr = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
StringBuilder content = new StringBuilder();
while ((len = in.read(buffer)) != -1) {
content.append(new String(buffer, 0, len, "UTF-8"));
}
outStr.close();
return content.toString();
}
}
五、解析 HTML 获取标题
使用谷歌浏览器的审查元素,找出新闻标题的html代码:
关于举办《经典音乐作品欣赏与人文审美》讲座的通知
我们需要从上面的 HTML 中找到 id="article_title" 的部分,使用 getElementById(String id) 方法
String htmlStr = HttpTool.doGet(urlStr);
// 将获取的网页 HTML 源代码转化为 Document
Document doc = Jsoup.parse(htmlStr);
Element articleEle = doc.getElementById("article");
// 标题
Element titleEle = articleEle.getElementById("article_title");
String titleStr = titleEle.text();
六、获取发布日期和信息来源
还要找出对应的HTML代码
2015-05-28
??Դ:
浏览次数:
477
思路和上面类似。使用 getElementById(String id) 方法找出 id="article_detail" 作为 Element,然后使用 getElementsByTag 获取 span 部分。因为有 3 个 ...,它返回 Elements 而不是 Element。
// article_detail包括了 2016-01-15 来源: 浏览次数:177
Element detailEle = articleEle.getElementById("article_detail");
Elements details = detailEle.getElementsByTag("span");
// 发布时间
String dateStr = details.get(0).text();
// 新闻来源
String sourceStr = details.get(1).text();
七、分析浏览量
如果打印出上面的details.get(2).text(),你只会得到
java爬虫抓取网页数据(Java解析xml文件遇到特殊符号会出现异常的解决方案(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-08 01:20
猜猜你在找什么 Java 相关的文章
一个简单的记账小程序(java)
感觉自己学到了很多基础知识,但是一直没有搞清楚一个项目的实际开发过程,所以就用这个小记账小程序来梳理一下。由于楼主也是学习阶段的菜鸟,程序可能存在各种玄学上的bug,希望大家一起改进。向站长学习了很多
Java实现哈夫曼树
O(∩_∩)O~~ 概述 我想所有学过数据结构的朋友都知道霍夫曼。这位大神发明了著名的“最优二叉树”。为了纪念他,我们称它为“哈夫曼树”。哈夫曼树可以用于哈夫曼编码,编码知识可以很大,例如
java笔记和对象
现在编程的思想分为两个阵营,面向过程和面向对象。现在说说什么是面向对象。作为单身狗,说起“对象”(;′⌒`)还是很心酸的……我们来看看百度是怎么说的?嗯,百度说的太抽象了,简单说一下
java笔记中变量的存储方法
1.java变量存储区java变量的存储区主要放在以下几个地方:(1)寄存器:可以说是最快的存储区。寄存器变量可以在C/C++,但是在java中不能声明Register变量,而是编译器在编译时确定的。
Java解析xml文件遇到特殊符号&会异常解决方法
文/朱继倩Java解析xml文件开发过程中,使用SAX解析时出现异常信息:Error on line 60 of document: For entity "xxx"
布尔源剖析
一. 继承Boolean的类的源码定义部分如下: 1 public final class Boolean 实现java.io.Serializable, 2 Comparable&l
策略枚举:杜绝项目中大量使用if-else的优雅姿势
文/朱继谦记得刚开始接触JAVA面向对象编程的时候,如果遇到大量的进程判断语句,几乎满屏都是if-else语句,多到忘记在哪头和哪里是尽头,不过就算是满屏也是if-else,不过当时我也没觉得太别扭。等待
Java源码分析:Guava的不可变集合ImmutableMap源码分析
一、 案例场景遇到了这样的场景。定义静态修改Map时,使用了大量的put()方法赋值,类似于this-public static final Map 查看全部
java爬虫抓取网页数据(Java解析xml文件遇到特殊符号会出现异常的解决方案(组图))
猜猜你在找什么 Java 相关的文章
一个简单的记账小程序(java)
感觉自己学到了很多基础知识,但是一直没有搞清楚一个项目的实际开发过程,所以就用这个小记账小程序来梳理一下。由于楼主也是学习阶段的菜鸟,程序可能存在各种玄学上的bug,希望大家一起改进。向站长学习了很多
Java实现哈夫曼树
O(∩_∩)O~~ 概述 我想所有学过数据结构的朋友都知道霍夫曼。这位大神发明了著名的“最优二叉树”。为了纪念他,我们称它为“哈夫曼树”。哈夫曼树可以用于哈夫曼编码,编码知识可以很大,例如
java笔记和对象
现在编程的思想分为两个阵营,面向过程和面向对象。现在说说什么是面向对象。作为单身狗,说起“对象”(;′⌒`)还是很心酸的……我们来看看百度是怎么说的?嗯,百度说的太抽象了,简单说一下
java笔记中变量的存储方法
1.java变量存储区java变量的存储区主要放在以下几个地方:(1)寄存器:可以说是最快的存储区。寄存器变量可以在C/C++,但是在java中不能声明Register变量,而是编译器在编译时确定的。
Java解析xml文件遇到特殊符号&会异常解决方法
文/朱继倩Java解析xml文件开发过程中,使用SAX解析时出现异常信息:Error on line 60 of document: For entity "xxx"
布尔源剖析
一. 继承Boolean的类的源码定义部分如下: 1 public final class Boolean 实现java.io.Serializable, 2 Comparable&l
策略枚举:杜绝项目中大量使用if-else的优雅姿势
文/朱继谦记得刚开始接触JAVA面向对象编程的时候,如果遇到大量的进程判断语句,几乎满屏都是if-else语句,多到忘记在哪头和哪里是尽头,不过就算是满屏也是if-else,不过当时我也没觉得太别扭。等待
Java源码分析:Guava的不可变集合ImmutableMap源码分析
一、 案例场景遇到了这样的场景。定义静态修改Map时,使用了大量的put()方法赋值,类似于this-public static final Map
java爬虫抓取网页数据(WebCollector2.20线程安全教程演示2.20 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 134 次浏览 • 2021-10-07 03:38
)
本教程演示webcollector2.20的新功能
下载
webcollector的最新jar包可以从webcollector GitHub的主页下载
元数据:
元数据是每个爬网任务的附加信息。元数据的灵活应用可以大大简化爬虫的设计
例如,post请求通常需要收录参数,而传统的爬虫程序只是使用URL保存参数,这不适合复杂的post请求
有些爬行任务需要获取遍历树的深度信息,也可以通过元数据轻松实现
请参阅教程DemocepthCrawler
RamCrawler:
Ramcrawler不需要依赖文件系统或数据库,适合于一次性爬网任务
如果您想编写长期任务,请使用breadthcrawler
本教程实现了一个爬虫程序,它对Bing搜索的前N个页面的结果进行爬虫,并将爬虫结果直接输出到标准输出流
如果要将爬网结果输出到数据结构(如ArrayList),请在类中定义ArrayList的成员变量
输出时将结果插入ArrayList。请注意,爬虫程序是多线程的,而ArrayList不是线程化的
它是安全的。因此,在执行插入操作时,可以使用以下方法锁定以确保安全
synchronized(this){
//插入操作
}
本教程中Bing搜索的解析规则可能会随着Bing搜索的修订而过期
<p><br />import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import java.net.URLEncoder;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
public class DemoBingCrawler extends RamCrawler {
public DemoBingCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum 查看全部
java爬虫抓取网页数据(WebCollector2.20线程安全教程演示2.20
)
本教程演示webcollector2.20的新功能
下载
webcollector的最新jar包可以从webcollector GitHub的主页下载
元数据:
元数据是每个爬网任务的附加信息。元数据的灵活应用可以大大简化爬虫的设计
例如,post请求通常需要收录参数,而传统的爬虫程序只是使用URL保存参数,这不适合复杂的post请求
有些爬行任务需要获取遍历树的深度信息,也可以通过元数据轻松实现
请参阅教程DemocepthCrawler
RamCrawler:
Ramcrawler不需要依赖文件系统或数据库,适合于一次性爬网任务
如果您想编写长期任务,请使用breadthcrawler
本教程实现了一个爬虫程序,它对Bing搜索的前N个页面的结果进行爬虫,并将爬虫结果直接输出到标准输出流
如果要将爬网结果输出到数据结构(如ArrayList),请在类中定义ArrayList的成员变量
输出时将结果插入ArrayList。请注意,爬虫程序是多线程的,而ArrayList不是线程化的
它是安全的。因此,在执行插入操作时,可以使用以下方法锁定以确保安全
synchronized(this){
//插入操作
}
本教程中Bing搜索的解析规则可能会随着Bing搜索的修订而过期
<p><br />import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import java.net.URLEncoder;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
public class DemoBingCrawler extends RamCrawler {
public DemoBingCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum
java爬虫抓取网页数据(小奇和一张张求知若渴的表情流程(一)(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 175 次浏览 • 2021-10-07 03:36
看着后面的小七和渴求知识的表情,我对未知充满了好奇,想起当年的我也是这样。长老们也很高兴,继续解释着自己的解释。我们来谈谈数据爬取。取的过程。
数据爬取主要分为四个步骤:爬取对象准备-->页面数据抓取-->数据分析处理-->数据持久化存储。
爬取对象准备:数据爬取的入口点,即我们要爬取的种子网址,将需要爬取的网址统一到一个指定的集合中进行分配和爬取。
URL队列:抓取页面的URL时,如果发现新的URL,会重新放入URL队列进行爬取。
URL 重复数据删除:重复删除放置的 URL。如果 URL 已经在队列中,请删除重复的 URL 以避免重复抓取。
URL去重方法:将其存储在内存或缓存服务器中进行去重,常见的有布隆过滤、redis数据库去重等。
网页数据抓取:网页数据抓取,即网页下载。通过网页爬虫工具Jsoup、HttpClient等下载URL队列中的目标网页,从下载的网页中抓取需要的内容进行处理。内容处理方式:1.无需存储,实时分析处理,2.无需存储,结构化分布式存储(hadoop分布式存储等)
数据分析与处理:数据分析按照采集规则进行,主要是将非结构化数据转化为结构化数据。常用的解析工具:Xpath解析、Jsoup选择器解析、HtmlUtil动态解析、Selenium自动化工具等。
数据持久化存储:数据持久化存储主要是对经过解析、去重、去干、检索后的结构化数据进行存储。
数据去干:通过数据挖掘,过滤掉垃圾,保证数据的可用性。
重复数据删除:判断数据库中是否已经存在数据,进行重复数据删除。通常,重复数据删除是针对文本类型的数据,使用simhahs算法进行判断。
数据存储:对分析后的数据进行结构化处理,三种数据存储方式:1.分布式nosql数据库(redis/mongdb/hbase),2.关系分布式数据库(mysql/Oracle等),< @3. 索引存储(elasticsearch/solr 等)等。
数据爬取流程图解决方案:
“好了,基本的理论知识就讲解到这里,接下来讲解网络爬虫技术的实战,继续巩固今天的知识,为接下来的学习做准备。” 说完,长老看着小七和一些还在思索的弟子,便自己离开了。
更多视频java爬虫视频课程: 查看全部
java爬虫抓取网页数据(小奇和一张张求知若渴的表情流程(一)(图))
看着后面的小七和渴求知识的表情,我对未知充满了好奇,想起当年的我也是这样。长老们也很高兴,继续解释着自己的解释。我们来谈谈数据爬取。取的过程。
数据爬取主要分为四个步骤:爬取对象准备-->页面数据抓取-->数据分析处理-->数据持久化存储。
爬取对象准备:数据爬取的入口点,即我们要爬取的种子网址,将需要爬取的网址统一到一个指定的集合中进行分配和爬取。
URL队列:抓取页面的URL时,如果发现新的URL,会重新放入URL队列进行爬取。

URL 重复数据删除:重复删除放置的 URL。如果 URL 已经在队列中,请删除重复的 URL 以避免重复抓取。
URL去重方法:将其存储在内存或缓存服务器中进行去重,常见的有布隆过滤、redis数据库去重等。

网页数据抓取:网页数据抓取,即网页下载。通过网页爬虫工具Jsoup、HttpClient等下载URL队列中的目标网页,从下载的网页中抓取需要的内容进行处理。内容处理方式:1.无需存储,实时分析处理,2.无需存储,结构化分布式存储(hadoop分布式存储等)
数据分析与处理:数据分析按照采集规则进行,主要是将非结构化数据转化为结构化数据。常用的解析工具:Xpath解析、Jsoup选择器解析、HtmlUtil动态解析、Selenium自动化工具等。
数据持久化存储:数据持久化存储主要是对经过解析、去重、去干、检索后的结构化数据进行存储。
数据去干:通过数据挖掘,过滤掉垃圾,保证数据的可用性。
重复数据删除:判断数据库中是否已经存在数据,进行重复数据删除。通常,重复数据删除是针对文本类型的数据,使用simhahs算法进行判断。
数据存储:对分析后的数据进行结构化处理,三种数据存储方式:1.分布式nosql数据库(redis/mongdb/hbase),2.关系分布式数据库(mysql/Oracle等),< @3. 索引存储(elasticsearch/solr 等)等。
数据爬取流程图解决方案:

“好了,基本的理论知识就讲解到这里,接下来讲解网络爬虫技术的实战,继续巩固今天的知识,为接下来的学习做准备。” 说完,长老看着小七和一些还在思索的弟子,便自己离开了。
更多视频java爬虫视频课程:
java爬虫抓取网页数据(本文爬虫:Java代码更多的关于robot.txt的具体)
网站优化 • 优采云 发表了文章 • 0 个评论 • 314 次浏览 • 2021-10-05 05:13
记得刚找工作的时候,隔壁的一个同学在面试的时候用大胆的文字认识了一个网络爬虫。后来在做图片搜索的时候,需要大量的测试图片,于是萌生了从亚马逊爬取书籍封面图片的想法,也从网上学习了一些之前的经验,一个简单但足够的爬虫系统实现了。
网络爬虫是一种自动提取网页的程序。它从万维网下载网页以供搜索引擎使用。它是搜索引擎的重要组成部分。其基本结构如下图所示:
传统爬虫从一个或几个初始网页的网址开始,获取初始网页上的网址。在抓取网页的过程中,它不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。对于垂直搜索,聚焦爬虫,即针对特定主题抓取网页的爬虫更合适。
本文爬虫程序的核心代码如下:
Java代码
public void crawl() throws Throwable { while (continueCrawling()) { CrawlerUrl url = getNextUrl(); //获取待爬取队列中的下一个URL if (url != null) { printCrawlInfo(); String content = getContent(url); //获取URL的文本信息 //聚焦爬虫只爬取与主题内容相关的网页,这里采用正则匹配简单处理 if (isContentRelevant(content, this.regexpSearchPattern)) { saveContent(url, content); //保存网页至本地 //获取网页内容中的链接,并放入待爬取队列中 Collection urlStrings = extractUrls(content, url); addUrlsToUrlQueue(url, urlStrings); } else { System.out.println(url + " is not relevant ignoring ..."); } //延时防止被对方屏蔽 Thread.sleep(this.delayBetweenUrls); } } closeOutputStream(); }
整个函数由getNextUrl、getContent、isContentRelevant、extractUrls、addUrlsToUrlQueue等几个核心方法组成,下面将一一介绍。先看getNextUrl:
Java代码
private CrawlerUrl getNextUrl() throws Throwable { CrawlerUrl nextUrl = null; while ((nextUrl == null) && (!urlQueue.isEmpty())) { CrawlerUrl crawlerUrl = this.urlQueue.remove(); //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取 //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免 if (doWeHavePermissionToVisit(crawlerUrl) && (!isUrlAlreadyVisited(crawlerUrl)) && isDepthAcceptable(crawlerUrl)) { nextUrl = crawlerUrl; // System.out.println("Next url to be visited is " + nextUrl); } } return nextUrl; }
关于robot.txt更具体的写法,请参考以下文章:
getContent 使用apache的httpclient 4.1来获取网页的内容,具体代码如下:
Java代码
private String getContent(CrawlerUrl url) throws Throwable { //HttpClient4.1的调用与之前的方式不同 HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url.getUrlString()); StringBuffer strBuf = new StringBuffer(); HttpResponse response = client.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { HttpEntity entity = response.getEntity(); if (entity != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(entity.getContent(), "UTF-8")); String line = null; if (entity.getContentLength() > 0) { strBuf = new StringBuffer((int) entity.getContentLength()); while ((line = reader.readLine()) != null) { strBuf.append(line); } } } if (entity != null) { entity.consumeContent(); } } //将url标记为已访问 markUrlAsVisited(url); return strBuf.toString(); }
对于垂直应用,数据的准确性往往更为重要。聚焦爬虫的主要特点是只采集与主题相关的数据,这就是isContentRelevant方法的作用。这里,可以使用分类预测技术。为简单起见,改为使用常规匹配。主要代码如下:
Java代码
public static boolean isContentRelevant(String content, Pattern regexpPattern) { boolean retValue = false; if (content != null) { //是否符合正则表达式的条件 Matcher m = regexpPattern.matcher(content.toLowerCase()); retValue = m.find(); } return retValue; }
extractUrls 的主要功能是从网页中获取更多的 URL,包括内部链接和外部链接。代码如下:
Java代码
public List extractUrls(String text, CrawlerUrl crawlerUrl) { Map urlMap = new HashMap(); extractHttpUrls(urlMap, text); extractRelativeUrls(urlMap, text, crawlerUrl); return new ArrayList(urlMap.keySet()); } //处理外部链接 private void extractHttpUrls(Map urlMap, String text) { Matcher m = httpRegexp.matcher(text); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { // System.out.println("Term = " + term); if (term.startsWith("http")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } urlMap.put(term, term); System.out.println("Hyperlink: " + term); } } } } //处理内部链接 private void extractRelativeUrls(Map urlMap, String text, CrawlerUrl crawlerUrl) { Matcher m = relativeRegexp.matcher(text); URL textURL = crawlerUrl.getURL(); String host = textURL.getHost(); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { if (term.startsWith("/")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } String s = "http://" + host + term; urlMap.put(s, s); System.out.println("Relative url: " + s); } } } }
这样,一个简单的网络爬虫程序就搭建好了,可以使用如下程序进行测试:
Java代码
public static void main(String[] args) { try { String url = "http://www.amazon.com"; Queue urlQueue = new LinkedList(); String regexp = "java"; urlQueue.add(new CrawlerUrl(url, 0)); NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L, regexp); // boolean allowCrawl = crawler.areWeAllowedToVisit(url); // System.out.println("Allowed to crawl: " + url + " " + // allowCrawl); crawler.crawl(); } catch (Throwable t) { System.out.println(t.toString()); t.printStackTrace(); } }
当然,你可以赋予它更高级的特性,比如多线程、更智能的焦点、使用 Lucene 索引等等。对于更复杂的情况,可以考虑使用一些开源的spider程序,比如Nutch或者Heritrix等,这些都超出了本文的范围。 查看全部
java爬虫抓取网页数据(本文爬虫:Java代码更多的关于robot.txt的具体)
记得刚找工作的时候,隔壁的一个同学在面试的时候用大胆的文字认识了一个网络爬虫。后来在做图片搜索的时候,需要大量的测试图片,于是萌生了从亚马逊爬取书籍封面图片的想法,也从网上学习了一些之前的经验,一个简单但足够的爬虫系统实现了。
网络爬虫是一种自动提取网页的程序。它从万维网下载网页以供搜索引擎使用。它是搜索引擎的重要组成部分。其基本结构如下图所示:

传统爬虫从一个或几个初始网页的网址开始,获取初始网页上的网址。在抓取网页的过程中,它不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。对于垂直搜索,聚焦爬虫,即针对特定主题抓取网页的爬虫更合适。
本文爬虫程序的核心代码如下:
Java代码
public void crawl() throws Throwable { while (continueCrawling()) { CrawlerUrl url = getNextUrl(); //获取待爬取队列中的下一个URL if (url != null) { printCrawlInfo(); String content = getContent(url); //获取URL的文本信息 //聚焦爬虫只爬取与主题内容相关的网页,这里采用正则匹配简单处理 if (isContentRelevant(content, this.regexpSearchPattern)) { saveContent(url, content); //保存网页至本地 //获取网页内容中的链接,并放入待爬取队列中 Collection urlStrings = extractUrls(content, url); addUrlsToUrlQueue(url, urlStrings); } else { System.out.println(url + " is not relevant ignoring ..."); } //延时防止被对方屏蔽 Thread.sleep(this.delayBetweenUrls); } } closeOutputStream(); }
整个函数由getNextUrl、getContent、isContentRelevant、extractUrls、addUrlsToUrlQueue等几个核心方法组成,下面将一一介绍。先看getNextUrl:
Java代码

private CrawlerUrl getNextUrl() throws Throwable { CrawlerUrl nextUrl = null; while ((nextUrl == null) && (!urlQueue.isEmpty())) { CrawlerUrl crawlerUrl = this.urlQueue.remove(); //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取 //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免 if (doWeHavePermissionToVisit(crawlerUrl) && (!isUrlAlreadyVisited(crawlerUrl)) && isDepthAcceptable(crawlerUrl)) { nextUrl = crawlerUrl; // System.out.println("Next url to be visited is " + nextUrl); } } return nextUrl; }
关于robot.txt更具体的写法,请参考以下文章:
getContent 使用apache的httpclient 4.1来获取网页的内容,具体代码如下:
Java代码
private String getContent(CrawlerUrl url) throws Throwable { //HttpClient4.1的调用与之前的方式不同 HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url.getUrlString()); StringBuffer strBuf = new StringBuffer(); HttpResponse response = client.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { HttpEntity entity = response.getEntity(); if (entity != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(entity.getContent(), "UTF-8")); String line = null; if (entity.getContentLength() > 0) { strBuf = new StringBuffer((int) entity.getContentLength()); while ((line = reader.readLine()) != null) { strBuf.append(line); } } } if (entity != null) { entity.consumeContent(); } } //将url标记为已访问 markUrlAsVisited(url); return strBuf.toString(); }
对于垂直应用,数据的准确性往往更为重要。聚焦爬虫的主要特点是只采集与主题相关的数据,这就是isContentRelevant方法的作用。这里,可以使用分类预测技术。为简单起见,改为使用常规匹配。主要代码如下:
Java代码
public static boolean isContentRelevant(String content, Pattern regexpPattern) { boolean retValue = false; if (content != null) { //是否符合正则表达式的条件 Matcher m = regexpPattern.matcher(content.toLowerCase()); retValue = m.find(); } return retValue; }
extractUrls 的主要功能是从网页中获取更多的 URL,包括内部链接和外部链接。代码如下:
Java代码
public List extractUrls(String text, CrawlerUrl crawlerUrl) { Map urlMap = new HashMap(); extractHttpUrls(urlMap, text); extractRelativeUrls(urlMap, text, crawlerUrl); return new ArrayList(urlMap.keySet()); } //处理外部链接 private void extractHttpUrls(Map urlMap, String text) { Matcher m = httpRegexp.matcher(text); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { // System.out.println("Term = " + term); if (term.startsWith("http")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } urlMap.put(term, term); System.out.println("Hyperlink: " + term); } } } } //处理内部链接 private void extractRelativeUrls(Map urlMap, String text, CrawlerUrl crawlerUrl) { Matcher m = relativeRegexp.matcher(text); URL textURL = crawlerUrl.getURL(); String host = textURL.getHost(); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { if (term.startsWith("/")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } String s = "http://" + host + term; urlMap.put(s, s); System.out.println("Relative url: " + s); } } } }
这样,一个简单的网络爬虫程序就搭建好了,可以使用如下程序进行测试:
Java代码
public static void main(String[] args) { try { String url = "http://www.amazon.com"; Queue urlQueue = new LinkedList(); String regexp = "java"; urlQueue.add(new CrawlerUrl(url, 0)); NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L, regexp); // boolean allowCrawl = crawler.areWeAllowedToVisit(url); // System.out.println("Allowed to crawl: " + url + " " + // allowCrawl); crawler.crawl(); } catch (Throwable t) { System.out.println(t.toString()); t.printStackTrace(); } }
当然,你可以赋予它更高级的特性,比如多线程、更智能的焦点、使用 Lucene 索引等等。对于更复杂的情况,可以考虑使用一些开源的spider程序,比如Nutch或者Heritrix等,这些都超出了本文的范围。
java爬虫抓取网页数据(如何知道这个网站是动态加载的动态数据?(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-05 00:08
大多数学习 Python 的人都在使用 Python 作为爬虫。毕竟,Python 是爬虫的最佳选择。
但是一般简单的静态页面网站还是很容易爬取的。对于很多动态加载的网站,我不知道该怎么办。今天给大家介绍两个动态爬虫js加载动态。数据,希望对爬虫有帮助!
今天就以高考查询网站为例!
我怎么知道这个 网站 是动态加载的数据?
使用浏览器,这里我建议使用火狐或者谷歌,大家一定都知道
打开你的网页,右键查看页面源码,ctrl+F查询输入293,源码没有这个值,说明数据是动态加载的。
它的网站是:数字代表的页数。共计165页
所以获取所有的url地址非常简单
对于动态加载数据,我们通常使用两种方法:
使用selenium分析网页元素,找到数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。
方法一硒:
为什么要写这个,代码注明注释!
总结:通过对数据的分析,写出上面的搜索方法,就可以得到所有的数据了。通过这种方式获取数据简单直观,但缺点是速度太慢。方法二分析网页元素,找出数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。:
既然要分析网页元素,首先要使用开发者工具。按 F12 打开浏览器自带的开发者工具。如下所示
分析显示json类型的列就是我们需要的数据
检查消息头中的请求网站:
真正的请求网站:
范围:
messtype=jsonp&callback=jQuery3805365803_58&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=03
也可以点击右边的参数栏查看参数
详细代码
方法非常简单。最主要的是自己练习。只有通过实践,你才能了解真相。学习在岸边游泳是不可能的。爬取JS加载的动态数据有两种简单的方法。方法很简单。你学会了吗?现在就试试! 查看全部
java爬虫抓取网页数据(如何知道这个网站是动态加载的动态数据?(组图))
大多数学习 Python 的人都在使用 Python 作为爬虫。毕竟,Python 是爬虫的最佳选择。
但是一般简单的静态页面网站还是很容易爬取的。对于很多动态加载的网站,我不知道该怎么办。今天给大家介绍两个动态爬虫js加载动态。数据,希望对爬虫有帮助!
今天就以高考查询网站为例!
我怎么知道这个 网站 是动态加载的数据?
使用浏览器,这里我建议使用火狐或者谷歌,大家一定都知道
打开你的网页,右键查看页面源码,ctrl+F查询输入293,源码没有这个值,说明数据是动态加载的。
它的网站是:数字代表的页数。共计165页
所以获取所有的url地址非常简单
对于动态加载数据,我们通常使用两种方法:
使用selenium分析网页元素,找到数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。
方法一硒:
为什么要写这个,代码注明注释!
总结:通过对数据的分析,写出上面的搜索方法,就可以得到所有的数据了。通过这种方式获取数据简单直观,但缺点是速度太慢。方法二分析网页元素,找出数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。:
既然要分析网页元素,首先要使用开发者工具。按 F12 打开浏览器自带的开发者工具。如下所示
分析显示json类型的列就是我们需要的数据
检查消息头中的请求网站:
真正的请求网站:
范围:
messtype=jsonp&callback=jQuery3805365803_58&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=03
也可以点击右边的参数栏查看参数
详细代码
方法非常简单。最主要的是自己练习。只有通过实践,你才能了解真相。学习在岸边游泳是不可能的。爬取JS加载的动态数据有两种简单的方法。方法很简单。你学会了吗?现在就试试!
java爬虫抓取网页数据( 目标网页用关键字在源代码中查找最终代码验证结果)
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2021-10-05 00:00
目标网页用关键字在源代码中查找最终代码验证结果)
概括
根据网站的结构和数据类型,做一个头条视频的爬虫,重点关注网站中数据的位置和抓取方法
并介绍一个类似的网站,简单解释一下数据抓取的方法
使用工具:python3.6 + pycharm + requests 库 + re 库
目标情况
这次我们的目标网站是Ajax加载的数据。首先打开网页后,直接使用浏览器自带的开发者工具(火狐),点击网页,然后将网页向下滑动,点击xhr,找到json数据,可以看到100条左右的内容
每个视频都有相关信息,我们只需要取出每个视频的url即可!然后去查看详情页
很容易就能找到视频的真实地址!复制地址,重新打开一个网页进行验证,确认地址正确,然后去源码查看地址是否存在
很明显,这个网站不是静态的网站,数据应该是存放在js文件中的,那我们怎么获取呢~?我需要分析js文件还是使用selenium?别担心,我偶然发现了这个
有没有发现网页源代码中存在URL中的关键字,虽然不完全相同,但是我们可以与上一个标签中的内容进行比较
可以确定,这里的值是网页渲染后出现在html标签中的值,在源码中有两个不同格式的视频地址!,很简单,我们来写代码吧!
代码
简单写一下,直接用requests请求内容,然后用re匹配,取出目标url
类似于 网站
其实还有一个网站和这种情况很相似,那就是第二个视频,但是如果你想看更多的视频,还是需要打开客户端,所以我们就简单的把一个视频作为一个例子。抓住它的真实地址!具体过程就不一一讲解了,直接看结果,先看登陆页面
使用关键字在源代码中查找
最终代码
验证结果
以上文章如有错误,请在留言区指出。如果这个文章对你有用,你喜欢并转发吗? 查看全部
java爬虫抓取网页数据(
目标网页用关键字在源代码中查找最终代码验证结果)
概括
根据网站的结构和数据类型,做一个头条视频的爬虫,重点关注网站中数据的位置和抓取方法
并介绍一个类似的网站,简单解释一下数据抓取的方法
使用工具:python3.6 + pycharm + requests 库 + re 库
目标情况
这次我们的目标网站是Ajax加载的数据。首先打开网页后,直接使用浏览器自带的开发者工具(火狐),点击网页,然后将网页向下滑动,点击xhr,找到json数据,可以看到100条左右的内容
每个视频都有相关信息,我们只需要取出每个视频的url即可!然后去查看详情页
很容易就能找到视频的真实地址!复制地址,重新打开一个网页进行验证,确认地址正确,然后去源码查看地址是否存在
很明显,这个网站不是静态的网站,数据应该是存放在js文件中的,那我们怎么获取呢~?我需要分析js文件还是使用selenium?别担心,我偶然发现了这个
有没有发现网页源代码中存在URL中的关键字,虽然不完全相同,但是我们可以与上一个标签中的内容进行比较
可以确定,这里的值是网页渲染后出现在html标签中的值,在源码中有两个不同格式的视频地址!,很简单,我们来写代码吧!
代码
简单写一下,直接用requests请求内容,然后用re匹配,取出目标url
类似于 网站
其实还有一个网站和这种情况很相似,那就是第二个视频,但是如果你想看更多的视频,还是需要打开客户端,所以我们就简单的把一个视频作为一个例子。抓住它的真实地址!具体过程就不一一讲解了,直接看结果,先看登陆页面
使用关键字在源代码中查找
最终代码
验证结果
以上文章如有错误,请在留言区指出。如果这个文章对你有用,你喜欢并转发吗?
java爬虫抓取网页数据(新浪新闻国内新闻页静态网页数据在函数中的应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 109 次浏览 • 2021-10-04 23:35
昨天,一个朋友来找我。新浪新闻国内新闻页面的其他部分是静态网页,但左下方的最新新闻部分不是静态网页,也没有json数据。让我帮你抓住它。大概看了一下,是js加载的,数据在js函数里,很有意思,所以分享给大家看看!
抓取目标
我们今天的目标是上图的红框部分。首先我们确定这部分内容不在网页源码中,属于js加载的部分,点击翻页后没有json数据传输!
但是发现有一个js请求,点击请求,是一行js函数代码,我们复制到json的view viewer中,然后格式化看看结果
发现可能有我们需要的内容,比如url、title、intro这3个参数,猜测是对应的新闻网址、标题、介绍
只是它的内容,需要处理,我们写在代码里看看
开始写代码
先导入库,因为需要截取字符串的最后一部分,所以使用requests库来获取请求,重新匹配内容即可。然后我们先匹配上面的3个item
可以看到,url中有\\,标题和介绍都是\\u539f\\u6807\\u9898的形式。这些是我们需要处理的后续步骤!
先用replace函数把\\放在url里,就可以得到url了,下面的\\u539f\\u6807\\u9898是unicode编码,可以直接解码内容直接写code
使用eval函数进行解码,可以将内容解码成u'unicode编码内容'的形式!
这样就把这个页面上所有新闻和URL相关的内容都取出来了,在外层加了一个循环来爬取所有的新闻页面,任务就完成了!
后记
新浪新闻的页面js功能比较简单,可以直接抓取数据。如果是比较复杂的功能,就需要了解前端知识。这就是学习爬虫需要学习前端知识的原因!
ps:上面使用的json查看器是第三方的网站,你可以直接百度找很多,当然你也可以直接修改上面抓包的内容,然后用json读取数据!
基本代码不多。有看不清楚的小伙伴可以私信我索取代码或者一起研究爬虫! 查看全部
java爬虫抓取网页数据(新浪新闻国内新闻页静态网页数据在函数中的应用)
昨天,一个朋友来找我。新浪新闻国内新闻页面的其他部分是静态网页,但左下方的最新新闻部分不是静态网页,也没有json数据。让我帮你抓住它。大概看了一下,是js加载的,数据在js函数里,很有意思,所以分享给大家看看!
抓取目标
我们今天的目标是上图的红框部分。首先我们确定这部分内容不在网页源码中,属于js加载的部分,点击翻页后没有json数据传输!
但是发现有一个js请求,点击请求,是一行js函数代码,我们复制到json的view viewer中,然后格式化看看结果
发现可能有我们需要的内容,比如url、title、intro这3个参数,猜测是对应的新闻网址、标题、介绍
只是它的内容,需要处理,我们写在代码里看看
开始写代码
先导入库,因为需要截取字符串的最后一部分,所以使用requests库来获取请求,重新匹配内容即可。然后我们先匹配上面的3个item
可以看到,url中有\\,标题和介绍都是\\u539f\\u6807\\u9898的形式。这些是我们需要处理的后续步骤!
先用replace函数把\\放在url里,就可以得到url了,下面的\\u539f\\u6807\\u9898是unicode编码,可以直接解码内容直接写code
使用eval函数进行解码,可以将内容解码成u'unicode编码内容'的形式!
这样就把这个页面上所有新闻和URL相关的内容都取出来了,在外层加了一个循环来爬取所有的新闻页面,任务就完成了!
后记
新浪新闻的页面js功能比较简单,可以直接抓取数据。如果是比较复杂的功能,就需要了解前端知识。这就是学习爬虫需要学习前端知识的原因!
ps:上面使用的json查看器是第三方的网站,你可以直接百度找很多,当然你也可以直接修改上面抓包的内容,然后用json读取数据!
基本代码不多。有看不清楚的小伙伴可以私信我索取代码或者一起研究爬虫!
java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-10-04 06:22
使用Java爬虫抓取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
抓取目标页面
1、使用Maven构建一个普通的Java项目
添加依赖:
org.jsoup
jsoup
1.11.2
org.apache.httpcomponents
httpclient
4.3.1
2、第一堂课,开始爬取入门类
package com.yomihu.spider;
import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mini-spider 单页面爬取启动类
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class SinglePageSpiderStarter {
/**
* 开始页面的URL(一个微信公众号的页面)
*/
private static final String START_URL = "https://mp.weixin.qq.com/s/zzk ... 3B%3B
/**
* 目标图片存放目录
*/
private static final String IMG_SAVE_PATH = "E:/jj";
public static void main(String[] args) throws Exception {
//使用Jsoup将目标Url的Html页面获取为Document变量
Document rootdocument = Jsoup.connect(START_URL).get();
List urlList = new ArrayList();
//将页面中的目标Url解析为列表
ParseHtml.singlePageParseImg(rootdocument, urlList);
//初始化HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//控制图片名称的变量
int i = 0;
for (String url : urlList) {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent();
//保存图片
File file = new File(IMG_SAVE_PATH);
if (!file.exists()) {
//不存在就创建该目录
file.mkdirs();
}
String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
//保存图片
FileOutputStream fos = new FileOutputStream(imgName);
i++;
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
fos.write(data, 0, len);
}
//释放资源
response.close();
}
httpClient.close();
}
}
3、 第二类,解析Html页面
package com.yomihu.parse;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
/**
* mini-spider Html页面结构解析
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class ParseHtml {
/**
* 微信单页面结构解析,这里我们只要将页面中的图片对应的URL取出
* (方法中的解析逻辑是根据分析页面结构和各元素的特征来解析的)
*
* @param document
* @param urls
*/
public static void singlePageParseImg(Document document, List urls) {
Elements divElements = document.select("[class=rich_media_content]");
Elements pElements = divElements.select("p");
Elements imgElements = pElements.select("img");
for (Element imgElement : imgElements) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
}
Elements spanElements = pElements.select("span");
Elements imgElemnets = spanElements.select("img");
for (Element imgElement : imgElemnets) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
System.out.println(imgElement.attr("data-src"));
}
}
}
4、在第一个类中启动main函数
检查我们抓取的目标图片是否已经存在于目录中。
总结
其实爬虫不难写。首先,我们首先要知道什么是爬虫。爬虫是用程序模拟浏览器不断连接获取分析并保存页面数据;这里我只是使用Apache成熟的开源框架进行开发,实现了简单的单页爬取,同样多页循环爬取Fetching需要在程序中不断迭代,不断更新爬取目标;即程序在解析页面时,将下一个目标页面的Url保存在待爬取的列表中。
爬虫不难实现。难的是分析目标页面,找到页面元素之间的规律,定期分析页面,得到我们想要的数据;当然,更难的是服务器上的一些大网站反爬虫机制。
下面我来实现一个多页面循环爬取的demo
示例代码 查看全部
java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
使用Java爬虫抓取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
抓取目标页面
1、使用Maven构建一个普通的Java项目
添加依赖:
org.jsoup
jsoup
1.11.2
org.apache.httpcomponents
httpclient
4.3.1
2、第一堂课,开始爬取入门类
package com.yomihu.spider;
import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mini-spider 单页面爬取启动类
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class SinglePageSpiderStarter {
/**
* 开始页面的URL(一个微信公众号的页面)
*/
private static final String START_URL = "https://mp.weixin.qq.com/s/zzk ... 3B%3B
/**
* 目标图片存放目录
*/
private static final String IMG_SAVE_PATH = "E:/jj";
public static void main(String[] args) throws Exception {
//使用Jsoup将目标Url的Html页面获取为Document变量
Document rootdocument = Jsoup.connect(START_URL).get();
List urlList = new ArrayList();
//将页面中的目标Url解析为列表
ParseHtml.singlePageParseImg(rootdocument, urlList);
//初始化HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//控制图片名称的变量
int i = 0;
for (String url : urlList) {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent();
//保存图片
File file = new File(IMG_SAVE_PATH);
if (!file.exists()) {
//不存在就创建该目录
file.mkdirs();
}
String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
//保存图片
FileOutputStream fos = new FileOutputStream(imgName);
i++;
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
fos.write(data, 0, len);
}
//释放资源
response.close();
}
httpClient.close();
}
}
3、 第二类,解析Html页面
package com.yomihu.parse;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
/**
* mini-spider Html页面结构解析
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class ParseHtml {
/**
* 微信单页面结构解析,这里我们只要将页面中的图片对应的URL取出
* (方法中的解析逻辑是根据分析页面结构和各元素的特征来解析的)
*
* @param document
* @param urls
*/
public static void singlePageParseImg(Document document, List urls) {
Elements divElements = document.select("[class=rich_media_content]");
Elements pElements = divElements.select("p");
Elements imgElements = pElements.select("img");
for (Element imgElement : imgElements) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
}
Elements spanElements = pElements.select("span");
Elements imgElemnets = spanElements.select("img");
for (Element imgElement : imgElemnets) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
System.out.println(imgElement.attr("data-src"));
}
}
}
4、在第一个类中启动main函数
检查我们抓取的目标图片是否已经存在于目录中。
总结
其实爬虫不难写。首先,我们首先要知道什么是爬虫。爬虫是用程序模拟浏览器不断连接获取分析并保存页面数据;这里我只是使用Apache成熟的开源框架进行开发,实现了简单的单页爬取,同样多页循环爬取Fetching需要在程序中不断迭代,不断更新爬取目标;即程序在解析页面时,将下一个目标页面的Url保存在待爬取的列表中。
爬虫不难实现。难的是分析目标页面,找到页面元素之间的规律,定期分析页面,得到我们想要的数据;当然,更难的是服务器上的一些大网站反爬虫机制。
下面我来实现一个多页面循环爬取的demo
示例代码
java爬虫抓取网页数据(UI自动化月前写的一些事儿--)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-10-20 11:05
写在前面
本来这个文章是几个月前写的,后来忙忘了。
ps:事情太多有时会耽误事情。
几个月前,记得群里有个朋友说要用selenium来爬取数据。关于爬取数据,我一般是模拟访问一些固定的网站,爬取我关心的信息,然后爬出来。数据被处理。
他的需求是将文章直接导入富文本编辑器进行发布。其实这也是爬虫的一种。
其实这并不难,就是UI自动化的过程,我们开始吧。
准备工具/原材料
1、java 语言
2、IDEA 开发工具
3、jdk1.8
4、selenium-server-standalone (3.0 及以上)
步骤 1、 分解需求:2、 代码实现思路:3、 示例代码
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
/**
* @author rongrong
* Selenium模拟访问网站爬虫操作代码示例
*/
public class Demo {
private static WebDriver driver;
static final int MAX_TIMEOUT_IN_SECONDS = 5;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = new ChromeDriver();
String url = "https://temai.snssdk.com/artic ... 3B%3B
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(MAX_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
driver.get(url);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (driver != null) {
System.out.println("运行结束!");
driver.quit();
}
}
@Test
public void test() throws InterruptedException {
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
driver.get("https://ueditor.baidu.com/webs ... 6quot;);
Thread.sleep(2000);
driver.switchTo().frame(0);
driver.findElement(By.tagName("body")).click();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(2000);
}
}
写在后面
作者不特别推荐使用selenium作为爬虫,原因如下:
每次运行爬虫都要打开浏览器,初始化需要加载图片、JS渲染等很多东西;
有人说改成无头浏览器的原理是一样的。就是打开浏览器,很多网站都会验证参数。如果对方看到您的恶意访问请求,就会执行您的请求。然后你必须考虑更改请求头。不知道事情有多复杂,还要改代码,很麻烦。
加载了很多可能对你没有价值的补充文件(比如css、js、图片文件)。与真正需要的资源(使用单独的 HTTP 请求)相比,这可能会产生更多的流量。 查看全部
java爬虫抓取网页数据(UI自动化月前写的一些事儿--)
写在前面
本来这个文章是几个月前写的,后来忙忘了。
ps:事情太多有时会耽误事情。
几个月前,记得群里有个朋友说要用selenium来爬取数据。关于爬取数据,我一般是模拟访问一些固定的网站,爬取我关心的信息,然后爬出来。数据被处理。
他的需求是将文章直接导入富文本编辑器进行发布。其实这也是爬虫的一种。
其实这并不难,就是UI自动化的过程,我们开始吧。
准备工具/原材料
1、java 语言
2、IDEA 开发工具
3、jdk1.8
4、selenium-server-standalone (3.0 及以上)
步骤 1、 分解需求:2、 代码实现思路:3、 示例代码
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
/**
* @author rongrong
* Selenium模拟访问网站爬虫操作代码示例
*/
public class Demo {
private static WebDriver driver;
static final int MAX_TIMEOUT_IN_SECONDS = 5;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = new ChromeDriver();
String url = "https://temai.snssdk.com/artic ... 3B%3B
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(MAX_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
driver.get(url);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (driver != null) {
System.out.println("运行结束!");
driver.quit();
}
}
@Test
public void test() throws InterruptedException {
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
driver.get("https://ueditor.baidu.com/webs ... 6quot;);
Thread.sleep(2000);
driver.switchTo().frame(0);
driver.findElement(By.tagName("body")).click();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(2000);
}
}
写在后面
作者不特别推荐使用selenium作为爬虫,原因如下:
每次运行爬虫都要打开浏览器,初始化需要加载图片、JS渲染等很多东西;
有人说改成无头浏览器的原理是一样的。就是打开浏览器,很多网站都会验证参数。如果对方看到您的恶意访问请求,就会执行您的请求。然后你必须考虑更改请求头。不知道事情有多复杂,还要改代码,很麻烦。
加载了很多可能对你没有价值的补充文件(比如css、js、图片文件)。与真正需要的资源(使用单独的 HTTP 请求)相比,这可能会产生更多的流量。
java爬虫抓取网页数据(网络爬虫的基本工作流程及流程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-10-19 22:00
本文主要介绍一个网络爬虫的小案例。有很好的参考价值。跟小编一起来看看吧
网络爬虫(也称为网络蜘蛛、网络机器人,在FOAF 社区中,更常见的是网络追逐者),是一种程序或脚本,可以根据一定的规则自动抓取万维网上的信息。它已被广泛使用。用于互联网领域。搜索引擎利用网络爬虫抓取网页、文档,甚至图片、音频、视频等资源,通过相应的索引技术将这些信息组织起来,提供给搜索用户查询。网络爬虫也为中小型网站的推广提供了有效的途径。网站 搜索引擎爬虫优化曾经风靡一时。
网络爬虫的基本工作流程如下:
1.首先选择一些精心挑选的种子网址;
2.将这些URL放入URL队列进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页,并存入下载的网页库中。另外,将这些 URL 放入爬取的 URL 队列中。
4.对抓取到的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待抓取的URL队列中,从而进入下一个循环。
当然,我不明白我上面说的。以我目前的理解,我们请求一个 URL,服务器返回给我们一个超大文本,我们的浏览器可以将这个超大文本解析成我们所说的我们看到的华丽。页面
那么,我们只需要把这个超大文本当成一个足够大的String字符串就可以了。
下面是我的代码
package main.spider; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; /** * Created by 1755790963 on 2017/3/10. */ public class Second { public static void main(String[] args) throws IOException { System.out.println("begin"); Document document = Jsoup.connect("http://tieba.baidu.com/p/2356694991").get(); String selector="div[class=d_post_content j_d_post_content clearfix]"; Elements elements = document.select(selector); for (Element element:elements){ String word= element.text(); if(word.indexOf("@")>0){ word=word.substring(0,word.lastIndexOf("@")+7); System.out.println(word); } System.out.println(word); } } }
我在这里使用了提供的 jsoup jar 包。Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
代码中,我们可以直接使用Jsoup类,导出Jsoup的connect()方法。该方法返回一个org.jsoup.Connection对象,参数为网站的url地址。Connection 对象有一个 get() 方法返回 Document 对象
document对象的select方法可以返回一个Elements对象,Elements对象是Element对象的集合,但是select()方法需要我们传入一个String参数,也就是我们的selector
字符串选择器="div[class=d_post_content j_d_post_content clearfix]";
我们的选择器语法类似于 jquery 的选择器语法。您可以在 html 页面中选择元素。选中后可以方便的进行Elements集合,通过Element的text()方法获取html中的代码
这样一个最简单的网络爬虫就完成了。
我选择的网站是豆瓣。留下你的邮箱,我给你发百度这样的邮箱贴吧,我取大家的邮箱
附上结果:
以上是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。同时希望多多支持html中文网站!
以上就是网络爬虫案例分析的详细内容。更多详情请关注其他相关html中文网站文章! 查看全部
java爬虫抓取网页数据(网络爬虫的基本工作流程及流程)
本文主要介绍一个网络爬虫的小案例。有很好的参考价值。跟小编一起来看看吧
网络爬虫(也称为网络蜘蛛、网络机器人,在FOAF 社区中,更常见的是网络追逐者),是一种程序或脚本,可以根据一定的规则自动抓取万维网上的信息。它已被广泛使用。用于互联网领域。搜索引擎利用网络爬虫抓取网页、文档,甚至图片、音频、视频等资源,通过相应的索引技术将这些信息组织起来,提供给搜索用户查询。网络爬虫也为中小型网站的推广提供了有效的途径。网站 搜索引擎爬虫优化曾经风靡一时。
网络爬虫的基本工作流程如下:
1.首先选择一些精心挑选的种子网址;
2.将这些URL放入URL队列进行抓取;
3. 从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页,并存入下载的网页库中。另外,将这些 URL 放入爬取的 URL 队列中。
4.对抓取到的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入待抓取的URL队列中,从而进入下一个循环。
当然,我不明白我上面说的。以我目前的理解,我们请求一个 URL,服务器返回给我们一个超大文本,我们的浏览器可以将这个超大文本解析成我们所说的我们看到的华丽。页面
那么,我们只需要把这个超大文本当成一个足够大的String字符串就可以了。
下面是我的代码
package main.spider; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; /** * Created by 1755790963 on 2017/3/10. */ public class Second { public static void main(String[] args) throws IOException { System.out.println("begin"); Document document = Jsoup.connect("http://tieba.baidu.com/p/2356694991").get(); String selector="div[class=d_post_content j_d_post_content clearfix]"; Elements elements = document.select(selector); for (Element element:elements){ String word= element.text(); if(word.indexOf("@")>0){ word=word.substring(0,word.lastIndexOf("@")+7); System.out.println(word); } System.out.println(word); } } }
我在这里使用了提供的 jsoup jar 包。Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
代码中,我们可以直接使用Jsoup类,导出Jsoup的connect()方法。该方法返回一个org.jsoup.Connection对象,参数为网站的url地址。Connection 对象有一个 get() 方法返回 Document 对象
document对象的select方法可以返回一个Elements对象,Elements对象是Element对象的集合,但是select()方法需要我们传入一个String参数,也就是我们的selector
字符串选择器="div[class=d_post_content j_d_post_content clearfix]";
我们的选择器语法类似于 jquery 的选择器语法。您可以在 html 页面中选择元素。选中后可以方便的进行Elements集合,通过Element的text()方法获取html中的代码
这样一个最简单的网络爬虫就完成了。
我选择的网站是豆瓣。留下你的邮箱,我给你发百度这样的邮箱贴吧,我取大家的邮箱
附上结果:

以上是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。同时希望多多支持html中文网站!
以上就是网络爬虫案例分析的详细内容。更多详情请关注其他相关html中文网站文章!
java爬虫抓取网页数据(网络爬虫的实现原理:网络蜘蛛又叫蜘蛛,流程 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-10-19 08:14
)
网络爬虫的实现原理:
网络爬虫也被称为蜘蛛。过程为:网络蜘蛛通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,阅读网页内容,找到网页中的其他链接。地址,通过这些链接地址找到下一个网页,一直循环下去,直到这个网站的所有网页都被抓取完毕。根据特定的网页规则,在抓取的网页中提取你想要的信息。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对数据进行处理和过滤的服务器。爬虫抓取的数据量越大,对服务器的性能要求就越高。.
根据这个原理,编写一个简单的网络爬虫程序。该程序的作用是获取网站发回的数据,并在该过程中提取URL。获取的 URL 存储在文件夹中。如何使用网站获取的URL进一步循环获取数据,提取其他数据。我不打算在这里写。它只是模拟最简单的原理。实际的 网站 爬虫比这里复杂得多。有太多深入的讨论。除了提取URL,我们还可以提取我们想要的各种其他信息。
结构目录:
源代码:
package com.sun.crawl;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import sun.jdbc.odbc.JdbcOdbc;
import java.io.IOException;
/**
* 下载此超链接的页面源代码.
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrlAndDownloadGoalContent(String url) {
/* 实例化一个HttpClient客户端 */
HttpClient client = new DefaultHttpClient();
HttpGet getHttp = new HttpGet(url);
String content = null;
HttpResponse response;
try {
/* 获得信息载体 */
response = client.execute(getHttp);
HttpEntity entity = response.getEntity();
VisitedUrlQueue.addElem(url);
if (entity != null) {
/* 转化为文本信息 */
content = EntityUtils.toString(entity);
/* 判断是否符合下载网页源代码到本地的条件 */
if (FunctionUtils.isCreateFile(url)
&& FunctionUtils.isHasGoalContent(content) != -1) {
/*
//将抓包的数据存到磁盘上(D盘下)
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);*/
FoodMessageBean foodMessageBean = FunctionUtils.CutHtml(FunctionUtils.getGoalContent(content));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
package com.sun.crawl;
/**
* Created by lenovo on 2017/8/3.
*/
public class FoodMessageBean {
private String name = "";
private String property = "";
private String content = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "FoodMessageBean{" +
"name='" + name + '\'' +
", property='" + property + '\'' +
", content='" + content + '\'' +
'}';
}
}
<p>package com.sun.crawl;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FunctionUtils {
public static FoodMessageBean CutHtml(String content) {
FoodMessageBean f = new FoodMessageBean();
// 过滤文章内容中的html
String[] split = content.split(":");
String s = split[0].replaceAll(" 查看全部
java爬虫抓取网页数据(网络爬虫的实现原理:网络蜘蛛又叫蜘蛛,流程
)
网络爬虫的实现原理:
网络爬虫也被称为蜘蛛。过程为:网络蜘蛛通过网页的链接地址搜索网页。从某个页面(通常是首页)开始,阅读网页内容,找到网页中的其他链接。地址,通过这些链接地址找到下一个网页,一直循环下去,直到这个网站的所有网页都被抓取完毕。根据特定的网页规则,在抓取的网页中提取你想要的信息。如果把整个互联网看作一个网站,那么网络蜘蛛就可以利用这个原理抓取互联网上的所有网页。因此,如果要抓取互联网上的数据,不仅需要一个爬虫程序,还需要一个能够接受“爬虫”发回的数据并对数据进行处理和过滤的服务器。爬虫抓取的数据量越大,对服务器的性能要求就越高。.
根据这个原理,编写一个简单的网络爬虫程序。该程序的作用是获取网站发回的数据,并在该过程中提取URL。获取的 URL 存储在文件夹中。如何使用网站获取的URL进一步循环获取数据,提取其他数据。我不打算在这里写。它只是模拟最简单的原理。实际的 网站 爬虫比这里复杂得多。有太多深入的讨论。除了提取URL,我们还可以提取我们想要的各种其他信息。
结构目录:
源代码:
package com.sun.crawl;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import sun.jdbc.odbc.JdbcOdbc;
import java.io.IOException;
/**
* 下载此超链接的页面源代码.
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrlAndDownloadGoalContent(String url) {
/* 实例化一个HttpClient客户端 */
HttpClient client = new DefaultHttpClient();
HttpGet getHttp = new HttpGet(url);
String content = null;
HttpResponse response;
try {
/* 获得信息载体 */
response = client.execute(getHttp);
HttpEntity entity = response.getEntity();
VisitedUrlQueue.addElem(url);
if (entity != null) {
/* 转化为文本信息 */
content = EntityUtils.toString(entity);
/* 判断是否符合下载网页源代码到本地的条件 */
if (FunctionUtils.isCreateFile(url)
&& FunctionUtils.isHasGoalContent(content) != -1) {
/*
//将抓包的数据存到磁盘上(D盘下)
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);*/
FoodMessageBean foodMessageBean = FunctionUtils.CutHtml(FunctionUtils.getGoalContent(content));
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
package com.sun.crawl;
/**
* Created by lenovo on 2017/8/3.
*/
public class FoodMessageBean {
private String name = "";
private String property = "";
private String content = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "FoodMessageBean{" +
"name='" + name + '\'' +
", property='" + property + '\'' +
", content='" + content + '\'' +
'}';
}
}
<p>package com.sun.crawl;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FunctionUtils {
public static FoodMessageBean CutHtml(String content) {
FoodMessageBean f = new FoodMessageBean();
// 过滤文章内容中的html
String[] split = content.split(":");
String s = split[0].replaceAll("
java爬虫抓取网页数据(某个站点对数据的显示方式略有不同演示怎样抓取站点的数据)
网站优化 • 优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-10-19 08:11
有时因为各种原因,我们需要从某个站点采集数据,但是因为不同站点显示的数据略有不同!
本文使用Java向大家展示如何抓取网站数据:(1)抓取原创网页数据;(2)抓取网页Javascript返回的数据。
一、 抓取原创网页。
在这个例子中,我们将从上面获取 ip 查询的结果:
第一步:打开这个网页,输入IP:111.142.55.73,点击查询按钮,可以看到网页显示的结果:
第二步:查看网页的源码,我们在源码中看到这一段:
由此可以看出,再次请求网页后,显示查询的结果。
查询后看网页地址:
换句话说,我们只能通过访问这种 URL 来获取 ip 查询的结果。接下来看代码:
public void captureHtml(String ip) 抛出异常 {
字符串 strURL = "" + ip;
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
String buf = contentBuf.toString();
int beginIx = buf.indexOf("查询结果[");
int endIx = buf.indexOf("以上四项依次显示");
String result = buf.substring(beginIx, endIx);
System.out.println("captureHtml() 结果:\n" + result);
}使用HttpURLConnection连接站点,使用bufReader保存网页返回的数据,然后通过自己定义的解析方法展示结果。
这里我只是随便解析了一下,想要解析准确,就需要自己处理了。
分析结果如下:
captureHtml() 的结果:
查询结果[1]:111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市手机
二、 抓取网页的 JavaScript 返回的结果。
有时,网站为了保护自己的数据,不会直接在网页的源代码中返回数据,而是使用异步的方式用JS返回数据,这样可以避免网站数据被诸如搜索引擎。
首先看这个页面:
我用第一种方法查看网页源代码,但是没有找到运单的跟踪信息,因为是通过JS获取的结果。
但是有时候我们非常需要获取JS数据,这个时候我们该怎么办呢?
这时候我们就需要用到一个工具:HTTP Analyzer,这个工具可以拦截Http的交互内容,我们使用这个工具来达到我们的目的。
先点击开始按钮后,它开始监控网页的交互行为。
我们打开网页:,可以看到HTTP Analyzer列出了网页的所有请求数据和结果:
为了更方便的查看JS的结果,我们先清空数据,然后输入快递单号:7,点击查询按钮,然后查看HTTP Analyzer的结果:
这是点击查询按钮后HTTP Analyzer的结果。让我们继续检查:
从上两图可以看出,HTTP Analyzer可以拦截JS返回的数据,并在Response Content中展示。同时可以看到JS请求的网页地址。
在这种情况下,我们只需要分析HTTP Analyzer的结果,然后模拟JS的行为来获取数据,即我们只需要访问JS请求的网页地址就可以获取数据。当然,前提是数据没有加密。记下 JS 请求的 URL:
然后让程序请求这个页面的结果!
这是代码:
public void captureJavascript(String postid) 抛出异常 {
字符串 strURL = "" + postid
+ "&channel=&rnd=0";
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
System.out.println("captureJavascript():\n" + contentBuf.toString()的结果);
}你看,抓取JS的方式和抓取原创网页的代码完全一样,我们只是做了一个解析JS的过程。
下面是程序运行的结果:
captureJavascript() 的结果:
运单跟踪信息 [7]
这些数据就是JS返回的结果,我们的目的就达到了!
希望这篇文章能对需要的朋友有所帮助。如果您需要程序源代码,请点击这里下载! 查看全部
java爬虫抓取网页数据(某个站点对数据的显示方式略有不同演示怎样抓取站点的数据)
有时因为各种原因,我们需要从某个站点采集数据,但是因为不同站点显示的数据略有不同!
本文使用Java向大家展示如何抓取网站数据:(1)抓取原创网页数据;(2)抓取网页Javascript返回的数据。
一、 抓取原创网页。
在这个例子中,我们将从上面获取 ip 查询的结果:
第一步:打开这个网页,输入IP:111.142.55.73,点击查询按钮,可以看到网页显示的结果:

第二步:查看网页的源码,我们在源码中看到这一段:

由此可以看出,再次请求网页后,显示查询的结果。
查询后看网页地址:

换句话说,我们只能通过访问这种 URL 来获取 ip 查询的结果。接下来看代码:
public void captureHtml(String ip) 抛出异常 {
字符串 strURL = "" + ip;
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
String buf = contentBuf.toString();
int beginIx = buf.indexOf("查询结果[");
int endIx = buf.indexOf("以上四项依次显示");
String result = buf.substring(beginIx, endIx);
System.out.println("captureHtml() 结果:\n" + result);
}使用HttpURLConnection连接站点,使用bufReader保存网页返回的数据,然后通过自己定义的解析方法展示结果。
这里我只是随便解析了一下,想要解析准确,就需要自己处理了。
分析结果如下:
captureHtml() 的结果:
查询结果[1]:111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市手机
二、 抓取网页的 JavaScript 返回的结果。
有时,网站为了保护自己的数据,不会直接在网页的源代码中返回数据,而是使用异步的方式用JS返回数据,这样可以避免网站数据被诸如搜索引擎。
首先看这个页面:

我用第一种方法查看网页源代码,但是没有找到运单的跟踪信息,因为是通过JS获取的结果。
但是有时候我们非常需要获取JS数据,这个时候我们该怎么办呢?
这时候我们就需要用到一个工具:HTTP Analyzer,这个工具可以拦截Http的交互内容,我们使用这个工具来达到我们的目的。
先点击开始按钮后,它开始监控网页的交互行为。
我们打开网页:,可以看到HTTP Analyzer列出了网页的所有请求数据和结果:

为了更方便的查看JS的结果,我们先清空数据,然后输入快递单号:7,点击查询按钮,然后查看HTTP Analyzer的结果:

这是点击查询按钮后HTTP Analyzer的结果。让我们继续检查:


从上两图可以看出,HTTP Analyzer可以拦截JS返回的数据,并在Response Content中展示。同时可以看到JS请求的网页地址。
在这种情况下,我们只需要分析HTTP Analyzer的结果,然后模拟JS的行为来获取数据,即我们只需要访问JS请求的网页地址就可以获取数据。当然,前提是数据没有加密。记下 JS 请求的 URL:
然后让程序请求这个页面的结果!
这是代码:
public void captureJavascript(String postid) 抛出异常 {
字符串 strURL = "" + postid
+ "&channel=&rnd=0";
URL url = 新 URL(strURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
字符串行 = "";
StringBuilder contentBuf = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
System.out.println("captureJavascript():\n" + contentBuf.toString()的结果);
}你看,抓取JS的方式和抓取原创网页的代码完全一样,我们只是做了一个解析JS的过程。
下面是程序运行的结果:
captureJavascript() 的结果:
运单跟踪信息 [7]
这些数据就是JS返回的结果,我们的目的就达到了!
希望这篇文章能对需要的朋友有所帮助。如果您需要程序源代码,请点击这里下载!
java爬虫抓取网页数据(parserparser )
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-10-17 07:22
)
问题:
一些网页数据是由js动态生成的。一般我们通过抓包就可以看到真正的数据实体是哪个异步请求获取的,但是获取数据的请求链接也可能是其他js生成的。这时候我们希望直接拿到js加载后的最终网页数据。
解决方案:
幻象
1.下载phantomjs,【官网】:
2.我们是windows平台,解压,bin目录下会看到exe可执行文件。就够了。
3.写一个parser.js:
system = require('system')
address = system.args[1];
var page = require('webpage').create();
var url = address;
page.settings.resourceTimeout = 1000*10; // 10 seconds
page.onResourceTimeout = function(e) {
console.log(page.content);
phantom.exit(1);
};
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log(page.content);
}
phantom.exit();
});
4.java 调用
Runtime rt = Runtime.getRuntime();
Process process = null;
try {
process = rt.exec("C:/phantomjs.exe C:/parser.js " +url);
InputStream in = process.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null; 查看全部
java爬虫抓取网页数据(parserparser
)
问题:
一些网页数据是由js动态生成的。一般我们通过抓包就可以看到真正的数据实体是哪个异步请求获取的,但是获取数据的请求链接也可能是其他js生成的。这时候我们希望直接拿到js加载后的最终网页数据。
解决方案:
幻象
1.下载phantomjs,【官网】:
2.我们是windows平台,解压,bin目录下会看到exe可执行文件。就够了。
3.写一个parser.js:
system = require('system')
address = system.args[1];
var page = require('webpage').create();
var url = address;
page.settings.resourceTimeout = 1000*10; // 10 seconds
page.onResourceTimeout = function(e) {
console.log(page.content);
phantom.exit(1);
};
page.open(url, function (status) {
//Page is loaded!
if (status !== 'success') {
console.log('Unable to post!');
} else {
console.log(page.content);
}
phantom.exit();
});
4.java 调用
Runtime rt = Runtime.getRuntime();
Process process = null;
try {
process = rt.exec("C:/phantomjs.exe C:/parser.js " +url);
InputStream in = process.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(reader);
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-17 07:19
Java爬虫介绍(二)——Jsoup解析原创HTML页面链接:
在上一节中,我们获取了页面的 HTML 源代码,但这些源代码是提供给浏览器解析的。我们需要的数据其实就是页面上博客的标题、作者、简介、发布日期等。我们需要一种方法来从 HTML 源代码中解析和提取这些信息,然后将其存储在文本或数据库中。在本篇博客中,我们将介绍使用Jsoup包来帮助我们解析页面和提取数据。
Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址或解析 HTML 内容。它的主要功能包括解析 HTML 页面、通过 DOM 或 CSS 选择器搜索和提取数据以及更改 HTML 内容。Jsoup的使用也很简单。使用Jsoup.parse(String str)方法解析我们之前获取的HTML内容,得到一个Documend类。剩下的工作就是从Document中选择我们需要的数据。例如,假设我们有一个收录以下内容的 HTML 页面:
第一篇博客
第二篇博客
第三篇博客
通过Jsoup,我们可以将上述三个博客的标题提取成一个List。使用方法如下:
首先我们通过maven引入Jsoup
org.jsoup
jsoup
1.10.3
然后写Java进行分析。
package org.hfutec.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
List titles = new ArrayList();
List urls = new ArrayList();
//假设我们获取的HTML的字符内容如下
String html = "<a href=\"url1\">第一篇博客</a><a href=\"url2\">第二篇博客</a><a href=\"url3\">第三篇博客</a>";
//第一步,将字符内容解析成一个Document类
Document doc = Jsoup.parse(html);
//第二步,根据我们需要得到的标签,选择提取相应标签的内容
Elements elements = doc.select("div[id=blog_list]").select("div[class=blog_title]");
for( Element element : elements ){
String title = element.text();
titles.add(title);
urls.add(element.select("a").attr("href"));
}
//输出测试
for( String title : titles ){
System.out.println(title);
}
for( String url : urls ){
System.out.println(url);
}
}
}
我们简单介绍一下Jsoup的解析过程。第一步是调用parse()方法将字符对象变成Document对象,然后我们对这个对象进行操作。通常,提取数据是根据标签选择数据。select() 方法和 /css 选择器的语法格式相同。一般提取某个标签,其属性值就是指定的内容。结果是一个Elements的集合,也就是Elements(因为可能有很多合格的标签,所以结果是一个集合)。select() 方法可以一直持续到我们想要的标签集被选中为止(注意我们不必逐级选择标签,直接在我们需要的标签上写select()方法即可这里的代码可以直接写成 Elements elements = doc.select("
e39b4f52-98fc-4ed5-9c43-15b1dc04f823.jpg
更多Jsoup解析操作请参考:1、 2、
一个实例
下面我们就按照前面爬取数据的例子学习官方网站博客列表来讲解一个例子。我们已经知道可以使用 Jsoup 来解析抓取到的 HTML 页面内容。那么如何查看我们需要的内容对应的标签呢?以Chrome浏览器为例,我们需要抓取这个页面的博客。首先用Chrome浏览器打开网址,然后右击博客标题,点击“检查”,得到HTML页面。如下所示。
94f6bf06-312a-4781-97c8-99d2b9d57884.jpg
d810463f-c23d-4dae-98cc-08764fbbef85.jpg
d310a4ae-c2e0-45f1-8637-9f8b390baa3b.jpg
图4 确认当前博客HTML代码的一致性
经过上面的操作,我们已经可以看到所有的博客标题等信息都存储在了class=card div中。所以,我们只需要关注这个标签中的内容是如何组织的。如下图所示,我们需要的信息所属的标签,点击小三角展开即可。
7e161a6f-bbff-44e3-a422-08d18102cbb3.jpg
因此,解析博客列表的代码可以写成如下。
package org.hfutec.example;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
String url = "http://www.datalearner.com/blog_list";
String rawHTML = null;
try {
rawHTML = getHTMLContent(url);
} catch (IOException e) {
e.printStackTrace();
}
//将当前页面转换成Jsoup的Document对象
Document doc = Jsoup.parse(rawHTML);
//获取所有的博客列表集合
Elements blogList = doc.select("div[class=card]");
//针对每个博客内容进行解析,并输出
for( Element element : blogList ){
String title = element.select("h4[class=card-title]").text();
String introduction = element.select("p[class=card-text]").text();
String author = element.select("span[class=fa fa-user]").text();
System.out.println("Title:\t"+title);
System.out.println("introduction:\t"+introduction);
System.out.println("Author:\t"+author);
System.out.println("--------------------------");
}
}
//根据url地址获取对应页面的HTML内容,我们将上一节中的内容打包成了一个方法,方便调用
private static String getHTMLContent( String url ) throws IOException {
//建立一个新的请求客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
//使用HttpGet方式请求网址
HttpGet httpGet = new HttpGet(url);
//获取网址的返回结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取返回结果中的实体
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
//关闭HttpEntity流
EntityUtils.consume(entity);
return content;
}
}
e248e590-b1c7-4df3-b9ab-074fb86095ec.jpg 查看全部
java爬虫抓取网页数据(JavaHTML解析器解析用包解析URL地址的应用)
Java爬虫介绍(二)——Jsoup解析原创HTML页面链接:
在上一节中,我们获取了页面的 HTML 源代码,但这些源代码是提供给浏览器解析的。我们需要的数据其实就是页面上博客的标题、作者、简介、发布日期等。我们需要一种方法来从 HTML 源代码中解析和提取这些信息,然后将其存储在文本或数据库中。在本篇博客中,我们将介绍使用Jsoup包来帮助我们解析页面和提取数据。
Jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址或解析 HTML 内容。它的主要功能包括解析 HTML 页面、通过 DOM 或 CSS 选择器搜索和提取数据以及更改 HTML 内容。Jsoup的使用也很简单。使用Jsoup.parse(String str)方法解析我们之前获取的HTML内容,得到一个Documend类。剩下的工作就是从Document中选择我们需要的数据。例如,假设我们有一个收录以下内容的 HTML 页面:
第一篇博客
第二篇博客
第三篇博客
通过Jsoup,我们可以将上述三个博客的标题提取成一个List。使用方法如下:
首先我们通过maven引入Jsoup
org.jsoup
jsoup
1.10.3
然后写Java进行分析。
package org.hfutec.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
List titles = new ArrayList();
List urls = new ArrayList();
//假设我们获取的HTML的字符内容如下
String html = "<a href=\"url1\">第一篇博客</a><a href=\"url2\">第二篇博客</a><a href=\"url3\">第三篇博客</a>";
//第一步,将字符内容解析成一个Document类
Document doc = Jsoup.parse(html);
//第二步,根据我们需要得到的标签,选择提取相应标签的内容
Elements elements = doc.select("div[id=blog_list]").select("div[class=blog_title]");
for( Element element : elements ){
String title = element.text();
titles.add(title);
urls.add(element.select("a").attr("href"));
}
//输出测试
for( String title : titles ){
System.out.println(title);
}
for( String url : urls ){
System.out.println(url);
}
}
}
我们简单介绍一下Jsoup的解析过程。第一步是调用parse()方法将字符对象变成Document对象,然后我们对这个对象进行操作。通常,提取数据是根据标签选择数据。select() 方法和 /css 选择器的语法格式相同。一般提取某个标签,其属性值就是指定的内容。结果是一个Elements的集合,也就是Elements(因为可能有很多合格的标签,所以结果是一个集合)。select() 方法可以一直持续到我们想要的标签集被选中为止(注意我们不必逐级选择标签,直接在我们需要的标签上写select()方法即可这里的代码可以直接写成 Elements elements = doc.select("
e39b4f52-98fc-4ed5-9c43-15b1dc04f823.jpg
更多Jsoup解析操作请参考:1、 2、
一个实例
下面我们就按照前面爬取数据的例子学习官方网站博客列表来讲解一个例子。我们已经知道可以使用 Jsoup 来解析抓取到的 HTML 页面内容。那么如何查看我们需要的内容对应的标签呢?以Chrome浏览器为例,我们需要抓取这个页面的博客。首先用Chrome浏览器打开网址,然后右击博客标题,点击“检查”,得到HTML页面。如下所示。
94f6bf06-312a-4781-97c8-99d2b9d57884.jpg
d810463f-c23d-4dae-98cc-08764fbbef85.jpg
d310a4ae-c2e0-45f1-8637-9f8b390baa3b.jpg
图4 确认当前博客HTML代码的一致性
经过上面的操作,我们已经可以看到所有的博客标题等信息都存储在了class=card div中。所以,我们只需要关注这个标签中的内容是如何组织的。如下图所示,我们需要的信息所属的标签,点击小三角展开即可。
7e161a6f-bbff-44e3-a422-08d18102cbb3.jpg
因此,解析博客列表的代码可以写成如下。
package org.hfutec.example;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/*******
* created by DuFei at 2017.08.25 21:00
* web crawler example
* ******/
public class DataLearnerCrawler {
public static void main(String[] args) {
String url = "http://www.datalearner.com/blog_list";
String rawHTML = null;
try {
rawHTML = getHTMLContent(url);
} catch (IOException e) {
e.printStackTrace();
}
//将当前页面转换成Jsoup的Document对象
Document doc = Jsoup.parse(rawHTML);
//获取所有的博客列表集合
Elements blogList = doc.select("div[class=card]");
//针对每个博客内容进行解析,并输出
for( Element element : blogList ){
String title = element.select("h4[class=card-title]").text();
String introduction = element.select("p[class=card-text]").text();
String author = element.select("span[class=fa fa-user]").text();
System.out.println("Title:\t"+title);
System.out.println("introduction:\t"+introduction);
System.out.println("Author:\t"+author);
System.out.println("--------------------------");
}
}
//根据url地址获取对应页面的HTML内容,我们将上一节中的内容打包成了一个方法,方便调用
private static String getHTMLContent( String url ) throws IOException {
//建立一个新的请求客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
//使用HttpGet方式请求网址
HttpGet httpGet = new HttpGet(url);
//获取网址的返回结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//获取返回结果中的实体
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
//关闭HttpEntity流
EntityUtils.consume(entity);
return content;
}
}
e248e590-b1c7-4df3-b9ab-074fb86095ec.jpg
java爬虫抓取网页数据( 主流好用java爬虫框架的选择介绍,推荐的都是主流)
网站优化 • 优采云 发表了文章 • 0 个评论 • 119 次浏览 • 2021-10-15 21:17
主流好用java爬虫框架的选择介绍,推荐的都是主流)
Crawler 可以看作是一种检测器。它的基本操作是模拟人类行为。通过各种网站,点击按钮查看数据,或者将看到的信息返回给用户。
1、Scrapy
Scrapy是一个用于抓取网站数据并提取结构化数据的应用框架。可应用于数据挖掘、信息处理或存储历史数据等一系列程序。这是一个非常强大的爬虫框架,可以满足简单的页面爬取,比如对urlpattern有清晰的认识。使用此框架,您可以轻松捕获亚马逊产品信息等数据。但是对于稍微复杂一点的页面,比如微博的页面信息,这个框架就不能满足需求了。
2、webmgaic
WebMagic 是一个简单灵活的 Java 爬虫框架。可以根据网页图片快速开发一个高效且易于维护的爬虫程序。
3、美汤
集成一些常见的爬虫需求。它也是一个 Python 库,可以从 HTML 或 XML 文件中提取数据。通过您喜欢的转换器,可以实现常用的文档导航、搜索和修改文档。BeautifulSoup 可以帮助您节省数小时甚至数天的工作时间。BeautifulSoup 的缺点是无法加载 JS。
4、Apache Nutch2
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
以上就是java爬虫框架的介绍。在爬虫框架的选择上,我们还有很多选择的机会。下面介绍一些主流的好用的java爬虫框架。如果一个网络爬虫想要采集大量数据,需要HTTP代理IP的配合,希望对大家有所帮助。
推荐运行环境:windows7系统,java10版本,DELL G3电脑。 查看全部
java爬虫抓取网页数据(
主流好用java爬虫框架的选择介绍,推荐的都是主流)

Crawler 可以看作是一种检测器。它的基本操作是模拟人类行为。通过各种网站,点击按钮查看数据,或者将看到的信息返回给用户。
1、Scrapy
Scrapy是一个用于抓取网站数据并提取结构化数据的应用框架。可应用于数据挖掘、信息处理或存储历史数据等一系列程序。这是一个非常强大的爬虫框架,可以满足简单的页面爬取,比如对urlpattern有清晰的认识。使用此框架,您可以轻松捕获亚马逊产品信息等数据。但是对于稍微复杂一点的页面,比如微博的页面信息,这个框架就不能满足需求了。
2、webmgaic
WebMagic 是一个简单灵活的 Java 爬虫框架。可以根据网页图片快速开发一个高效且易于维护的爬虫程序。
3、美汤
集成一些常见的爬虫需求。它也是一个 Python 库,可以从 HTML 或 XML 文件中提取数据。通过您喜欢的转换器,可以实现常用的文档导航、搜索和修改文档。BeautifulSoup 可以帮助您节省数小时甚至数天的工作时间。BeautifulSoup 的缺点是无法加载 JS。
4、Apache Nutch2
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
以上就是java爬虫框架的介绍。在爬虫框架的选择上,我们还有很多选择的机会。下面介绍一些主流的好用的java爬虫框架。如果一个网络爬虫想要采集大量数据,需要HTTP代理IP的配合,希望对大家有所帮助。
推荐运行环境:windows7系统,java10版本,DELL G3电脑。
java爬虫抓取网页数据( 流行的Python库和框架是怎样的?(二))
网站优化 • 优采云 发表了文章 • 0 个评论 • 85 次浏览 • 2021-10-14 15:07
流行的Python库和框架是怎样的?(二))
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
post_points = int(points_list[idx].get_text().replace(' points', ''))
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
上述脚本仅从 Hacker News 的第一页获取热门帖子。但是,根据所需的目标,我们需要从前五页或可能输入的任意页数中获取列表。因此,您可以相应地修改脚本。
import requests
from bs4 import BeautifulSoup
import pprint
import time
BASE_URL = 'https://news.ycombinator.com'
# response = requests.get(BASE_URL)
def get_lists_and_points(soup):
# extract all the links using the class selector
links_list = soup.select('.storylink')
# extract all the points using the class selector
points_list = soup.select('.score')
return (links_list, points_list)
def parse_response(response):
# extract the text content of the web page
response_text = response.text
# parse HTML
soup = BeautifulSoup(response_text, 'html.parser')
return soup
def get_paginated_data(pages):
total_links_list = []
total_points_list = []
for page in range(pages):
URL = BASE_URL + f'?p={page+1}'
response = requests.get(URL)
soup = parse_response(response)
links_list, points_list = get_lists_and_points(soup)
for link in links_list:
total_links_list.append(link)
for point in points_list:
total_points_list.append(point)
# add 30 seconds delay as per hacker news robots.txt rules
time.sleep(30)
return (total_links_list, total_points_list)
def generate_popular_posts(links_list, points_list):
# create an empty popular posts list
popular_posts = []
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
# if points data is not available, assign it a default of 0
try:
post_points = int(
points_list[idx].get_text().replace(' points', ''))
except:
points_list = 0
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
return popular_posts
def sort_posts_by_points(posts):
return sorted(posts, key=lambda x: x['points'], reverse=True)
def main():
total_links_list, total_points_list = get_paginated_data(5)
popular_posts = generate_popular_posts(total_links_list, total_points_list)
sorted_posts = sort_posts_by_points(popular_posts)
# print posts sorted by highest to lowest
pprint.pprint(sorted_posts)
if(__name__ == '__main__'):
main()
现在使用这个脚本,我们甚至不需要访问黑客新闻和搜索热门新闻。我们可以从控制台运行这个脚本并获取最新消息。随意根据您的需要调整脚本并对其进行试验或尝试从您最喜欢的 网站 中获取数据。
我们可以用上面的数据做很多事情,比如
热门爬虫库
Beautiful Soup 在从 网站 获取数据时有其局限性。使用起来非常简单,但是为了从客户端呈现的复杂网站(Angular,基于React的网站)中抓取数据,网站@时HTML标签将不可用> 已加载。要从这样的 网站 获取数据,您可以使用更高级的库。以下是一些流行的 Python 库和框架。
网页抓取是一个广阔的领域。对于 Beautiful Soup,我们可能只是触及了表面。这个领域有很多可能性,我会在探索更多使用Python进行数据分析的同时探索更多。希望我已经能够涵盖进一步探索所需的基本概念。
明天我将讨论使用 Python 进行 Web 开发的概念。 查看全部
java爬虫抓取网页数据(
流行的Python库和框架是怎样的?(二))
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
post_points = int(points_list[idx].get_text().replace(' points', ''))
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
上述脚本仅从 Hacker News 的第一页获取热门帖子。但是,根据所需的目标,我们需要从前五页或可能输入的任意页数中获取列表。因此,您可以相应地修改脚本。
import requests
from bs4 import BeautifulSoup
import pprint
import time
BASE_URL = 'https://news.ycombinator.com'
# response = requests.get(BASE_URL)
def get_lists_and_points(soup):
# extract all the links using the class selector
links_list = soup.select('.storylink')
# extract all the points using the class selector
points_list = soup.select('.score')
return (links_list, points_list)
def parse_response(response):
# extract the text content of the web page
response_text = response.text
# parse HTML
soup = BeautifulSoup(response_text, 'html.parser')
return soup
def get_paginated_data(pages):
total_links_list = []
total_points_list = []
for page in range(pages):
URL = BASE_URL + f'?p={page+1}'
response = requests.get(URL)
soup = parse_response(response)
links_list, points_list = get_lists_and_points(soup)
for link in links_list:
total_links_list.append(link)
for point in points_list:
total_points_list.append(point)
# add 30 seconds delay as per hacker news robots.txt rules
time.sleep(30)
return (total_links_list, total_points_list)
def generate_popular_posts(links_list, points_list):
# create an empty popular posts list
popular_posts = []
# loop though all links
for idx, link in enumerate(links_list):
# fetch the title of the post
post_title = link.get_text()
# fetch the link of the post
post_href = link.get('href')
# fetch the point text using the index of the link
# convert the point to integer
# if points data is not available, assign it a default of 0
try:
post_points = int(
points_list[idx].get_text().replace(' points', ''))
except:
points_list = 0
# append to popular posts as a dictionary object if points is atleast 100
if post_points >= 100:
popular_posts.append(
{'title': post_title, 'link': post_href, 'points': post_points})
return popular_posts
def sort_posts_by_points(posts):
return sorted(posts, key=lambda x: x['points'], reverse=True)
def main():
total_links_list, total_points_list = get_paginated_data(5)
popular_posts = generate_popular_posts(total_links_list, total_points_list)
sorted_posts = sort_posts_by_points(popular_posts)
# print posts sorted by highest to lowest
pprint.pprint(sorted_posts)
if(__name__ == '__main__'):
main()
现在使用这个脚本,我们甚至不需要访问黑客新闻和搜索热门新闻。我们可以从控制台运行这个脚本并获取最新消息。随意根据您的需要调整脚本并对其进行试验或尝试从您最喜欢的 网站 中获取数据。
我们可以用上面的数据做很多事情,比如
热门爬虫库
Beautiful Soup 在从 网站 获取数据时有其局限性。使用起来非常简单,但是为了从客户端呈现的复杂网站(Angular,基于React的网站)中抓取数据,网站@时HTML标签将不可用> 已加载。要从这样的 网站 获取数据,您可以使用更高级的库。以下是一些流行的 Python 库和框架。
网页抓取是一个广阔的领域。对于 Beautiful Soup,我们可能只是触及了表面。这个领域有很多可能性,我会在探索更多使用Python进行数据分析的同时探索更多。希望我已经能够涵盖进一步探索所需的基本概念。
明天我将讨论使用 Python 进行 Web 开发的概念。
java爬虫抓取网页数据(Java的Http协议客户端HttpClient来实现抓取网页数据(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2021-10-14 15:03
爬虫抓取网页上的数据,我们同样点击链接访问网页数据。就是使用Http协议访问网页。这里我们使用Java Http协议客户端HttpClient来实现网页数据的爬取。
你好,世界
获取带参数的请求
使用参数发布请求
帖子也很简单,和上面的差不多,只是改变了发起请求的方式,如下:
当然,如果没有参数,则不需要创建表单对象,只需一个 HttpPost 对象即可。
代码中对象的说明:
代码优化:连接池
在我们爬取数据的过程中,HttpClient连接对象的创建和销毁是非常频繁的,这里我们使用连接池进行优化
public class poolTest {
public static void main(String[] args) {
//创建连接池管理器
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(100); //设置池内最大连接数
pcm.setDefaultMaxPerRoute(10); //设置每个坠机的最大连接数
//从连接池中获取连接对象,而不是单独创建连接对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build();
HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen");
System.out.println(httpGet);
//使用httpClient发起请求,获得响应
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpGet);
//解析响应,获取到数据
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity,"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (response != null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//因为我们是连接池中获取到的连接,所以这里不能再给他关闭了
//httpClient.close();
}
}
}
}
获取资源的相关时间配置
Jsoup 不是 Jsonp
经过我们上面的学习,我们已经可以通过HttpClient抓取页面了。抓取页面后,我们可以解析它。您可以使用字符串解析工具来解析页面,也可以使用正则表达式。对于解析,但是这两种方案的开发成本都很高,不推荐使用,这里我们学习了一个专门解析html页面的技术,Jsonp
汤品介绍
jsonp 是一个 Java Html 解析器,可以自行解析 URL 地址和 html 文本内容。它有一组现成的 API 来删除和操作数据。
jsonp的作用:
Jsoup 解析 URL
添加 Jsoup 依赖以使用 Jsoup
注意:Jsoup 只限于使用 Html 解析工具,而不是替代 HttpClient 来发起请求,因为 HttpClient 支持多线程、连接池、代理等技术,而 Jsoup 对此的支持并不理想。专业的事情交给专业的人,HttpClient发送请求抓取数据,Jsoup做解析
Jsoup 解析字符串
Jsoup解析文件
这是上面的静态页面。除了转换成String再解析,我们也可以直接解析文件
使用 Dom 遍历文档
记得还有一个sax解析,比较麻烦,现在差点忘了;
Dom解析,不知道大家有没有听过或者用过。反正我之前用过,但是解析的确实是XML。先简单介绍一个Dmo方法。
Dmo 解析会将目标文档视为一个对象。首先将整个文档加载到内存中。如果文档太大,内存可能会溢出(一般不会)。加载到内存后,会构建一个Dom树,然后Just开始提供访问和修改操作
如果你之前没有学习过,我们通过一个小Demo来学习。如果您使用过它,我们有权对其进行审核:
Java代码如下: 我演示了几个常用的获取页面数据的API
从元素中获取属性
选择器
下面是上述always选择器的使用演示
选择器选择器组合使用
Hello World 类爬虫案例列表
在上面的学习中,我们已经知道HttpClient是用来爬取数据的,Jsoup是用来分析HttpClient爬取到的数据的。下面我们来练习一下这两个工具的使用。
搁浅了一会儿,暂时……以后更新 查看全部
java爬虫抓取网页数据(Java的Http协议客户端HttpClient来实现抓取网页数据(组图))
爬虫抓取网页上的数据,我们同样点击链接访问网页数据。就是使用Http协议访问网页。这里我们使用Java Http协议客户端HttpClient来实现网页数据的爬取。
你好,世界
获取带参数的请求
使用参数发布请求
帖子也很简单,和上面的差不多,只是改变了发起请求的方式,如下:
当然,如果没有参数,则不需要创建表单对象,只需一个 HttpPost 对象即可。
代码中对象的说明:
代码优化:连接池
在我们爬取数据的过程中,HttpClient连接对象的创建和销毁是非常频繁的,这里我们使用连接池进行优化
public class poolTest {
public static void main(String[] args) {
//创建连接池管理器
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(100); //设置池内最大连接数
pcm.setDefaultMaxPerRoute(10); //设置每个坠机的最大连接数
//从连接池中获取连接对象,而不是单独创建连接对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build();
HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen");
System.out.println(httpGet);
//使用httpClient发起请求,获得响应
CloseableHttpResponse response = null;
try {
response = httpClient.execute(httpGet);
//解析响应,获取到数据
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity,"utf8");
System.out.println(content.length());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (response != null){
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
//因为我们是连接池中获取到的连接,所以这里不能再给他关闭了
//httpClient.close();
}
}
}
}
获取资源的相关时间配置
Jsoup 不是 Jsonp
经过我们上面的学习,我们已经可以通过HttpClient抓取页面了。抓取页面后,我们可以解析它。您可以使用字符串解析工具来解析页面,也可以使用正则表达式。对于解析,但是这两种方案的开发成本都很高,不推荐使用,这里我们学习了一个专门解析html页面的技术,Jsonp
汤品介绍
jsonp 是一个 Java Html 解析器,可以自行解析 URL 地址和 html 文本内容。它有一组现成的 API 来删除和操作数据。
jsonp的作用:
Jsoup 解析 URL
添加 Jsoup 依赖以使用 Jsoup
注意:Jsoup 只限于使用 Html 解析工具,而不是替代 HttpClient 来发起请求,因为 HttpClient 支持多线程、连接池、代理等技术,而 Jsoup 对此的支持并不理想。专业的事情交给专业的人,HttpClient发送请求抓取数据,Jsoup做解析
Jsoup 解析字符串
Jsoup解析文件
这是上面的静态页面。除了转换成String再解析,我们也可以直接解析文件
使用 Dom 遍历文档
记得还有一个sax解析,比较麻烦,现在差点忘了;
Dom解析,不知道大家有没有听过或者用过。反正我之前用过,但是解析的确实是XML。先简单介绍一个Dmo方法。
Dmo 解析会将目标文档视为一个对象。首先将整个文档加载到内存中。如果文档太大,内存可能会溢出(一般不会)。加载到内存后,会构建一个Dom树,然后Just开始提供访问和修改操作
如果你之前没有学习过,我们通过一个小Demo来学习。如果您使用过它,我们有权对其进行审核:
Java代码如下: 我演示了几个常用的获取页面数据的API
从元素中获取属性
选择器
下面是上述always选择器的使用演示
选择器选择器组合使用
Hello World 类爬虫案例列表
在上面的学习中,我们已经知道HttpClient是用来爬取数据的,Jsoup是用来分析HttpClient爬取到的数据的。下面我们来练习一下这两个工具的使用。
搁浅了一会儿,暂时……以后更新
java爬虫抓取网页数据(对网页爬虫的调查结果调查人:王杨斌对于爬虫工具以及代码的调查)
网站优化 • 优采云 发表了文章 • 0 个评论 • 113 次浏览 • 2021-10-11 15:33
网络爬虫调查结果调查员:王阳斌对爬虫工具和代码的调查,调查的主要内容是关于PHP和Java的工具代码。1.Java类爬虫1.1.JAVA爬虫WebCollector爬虫介绍:WebCollector[]是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,只需少量代码即可实现强大的爬虫。爬虫内核:WebCollector 致力于维护一个稳定可扩展的爬虫内核,方便开发者进行灵活的二次开发。内核非常强大。1.2.Web-HarvestWeb-Harvest[] 是一个用Java语言编写的网络爬虫工具,应用广泛。它可以采集指定的页面并从这些页面中提取有用的数据。Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。
JSpider 的默认配置类型很少,也不是很有用。但是JSpider非常容易扩展,你可以用它来开发强大的网络爬虫和数据分析工具。为此,您需要深入了解JSpider 的原理,然后根据您的需要开发插件并编写配置文件。1.4.网络爬虫 HeritrixHeritrix[] 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循robots.txt 文件中的排除说明和METArobots 标签。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。Heritrix是一个爬虫框架,其组织结构包括整个组件和爬虫过程。1.5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。
您可以使用它来构建多线程 Web 爬虫。1.7.Java 网络蜘蛛/网络爬虫 SpidermanSpiderman[] 是一个基于微内核+插件架构的网络蜘蛛。它的目标是以简单的方式捕获复杂的目标网页信息,并将其解析为您需要的业务数据。2.C/C++类爬虫2.1.网站爬虫 GrubNextGenerationGrubNextGeneration[] 是一个分布式的网络爬虫系统,包括客户端和服务端,可以用来维护网页 。其开发语言:C/C++PerlC#。2.2.网络爬虫甲醇甲醇[]是一款模块化、可定制的网络爬虫软件。主要优点是速度快。2.3.网络爬虫/网络蜘蛛 larbinLarbin[] 是一个开源的网络爬虫/网络蜘蛛, 查看全部
java爬虫抓取网页数据(对网页爬虫的调查结果调查人:王杨斌对于爬虫工具以及代码的调查)
网络爬虫调查结果调查员:王阳斌对爬虫工具和代码的调查,调查的主要内容是关于PHP和Java的工具代码。1.Java类爬虫1.1.JAVA爬虫WebCollector爬虫介绍:WebCollector[]是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,只需少量代码即可实现强大的爬虫。爬虫内核:WebCollector 致力于维护一个稳定可扩展的爬虫内核,方便开发者进行灵活的二次开发。内核非常强大。1.2.Web-HarvestWeb-Harvest[] 是一个用Java语言编写的网络爬虫工具,应用广泛。它可以采集指定的页面并从这些页面中提取有用的数据。Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。正则表达式等实现text/xml的操作。1.3.Java 网络爬虫 JSpiderJSpider[] 是一个用 Java 实现的 WebSpider。JSpider的行为具体由配置文件配置,如使用什么插件,结果存储方式等设置在conf\[ConfigName]\目录下。
JSpider 的默认配置类型很少,也不是很有用。但是JSpider非常容易扩展,你可以用它来开发强大的网络爬虫和数据分析工具。为此,您需要深入了解JSpider 的原理,然后根据您的需要开发插件并编写配置文件。1.4.网络爬虫 HeritrixHeritrix[] 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循robots.txt 文件中的排除说明和METArobots 标签。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。Heritrix是一个爬虫框架,其组织结构包括整个组件和爬虫过程。1.5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。@5.webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个不需要配置,方便二次开发的爬虫框架。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagiclogo 垂直爬虫 webmagicWebmagic[] 是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。1.6.Java多线程网络爬虫Crawler4jCrawler4j[]是一个开源的Java类库,提供了一个简单的网页爬取接口。
您可以使用它来构建多线程 Web 爬虫。1.7.Java 网络蜘蛛/网络爬虫 SpidermanSpiderman[] 是一个基于微内核+插件架构的网络蜘蛛。它的目标是以简单的方式捕获复杂的目标网页信息,并将其解析为您需要的业务数据。2.C/C++类爬虫2.1.网站爬虫 GrubNextGenerationGrubNextGeneration[] 是一个分布式的网络爬虫系统,包括客户端和服务端,可以用来维护网页 。其开发语言:C/C++PerlC#。2.2.网络爬虫甲醇甲醇[]是一款模块化、可定制的网络爬虫软件。主要优点是速度快。2.3.网络爬虫/网络蜘蛛 larbinLarbin[] 是一个开源的网络爬虫/网络蜘蛛,
java爬虫抓取网页数据(用到抓取网页数据的功能:抓取数据功能详解)
网站优化 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2021-10-09 21:22
经常用到抓取网页数据的功能。它已在以前的工作中使用。今天总结了一下:
1、 通过指定的 URL 抓取网页数据获取页面信息,然后用 DOM 对页面进行 NODE 分析,处理得到原创的 HTML 数据,这样做的好处是可以灵活处理一个某条数据高 难点在于分段算法的优化。当页面HTML信息量较大时,算法不好,会影响处理效率。
2、htmlparser框架,对于html页面处理的数据结构,HtmlParser采用经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode、Tag来描述HTML页面的元素。 Htmlparser基本可以满足垂直搜索引擎页面处理分析的需要,映射HTML标签,可以方便的获取标签中的HTMLCODE。
Htmlparser官方介绍:htmlparser是一个纯java的html解析库,不依赖其他java库文件,主要用于转换或提取html。可以超高速解析html,不会出错。最新版本的 htmlparser 现在是 2.0。可以毫不夸张地说,htmlparser是目前最好的html解析分析工具。
3、nekohtml框架,nekohtml在容错性和性能(包括htmlunit和nekohtml)方面比htmlparser有更好的口碑,nokehtml类似xml解析原理,html标签正确解析为dom 它们对应DOM树中对应的元素进行处理。
NekoHTML 官方介绍:NekoHTML 是一个 Java 语言的 HTML 扫描器和标签平衡器,它使程序能够解析 HTML 文档并使用标准的 XML 接口来访问其中的信息。这个解析器可以扫描 HTML 文件并“纠正”作者(人或机器)在编写 HTML 文档过程中经常犯的许多错误。
NekoHTML 可以添加缺失的父元素,自动关闭带有结束标签的对应元素,以及不匹配的内联元素标签。 NekoHTML 的开发使用 XercesNativeInterface (XNI),它是 Xerces2 的基础。 查看全部
java爬虫抓取网页数据(用到抓取网页数据的功能:抓取数据功能详解)
经常用到抓取网页数据的功能。它已在以前的工作中使用。今天总结了一下:
1、 通过指定的 URL 抓取网页数据获取页面信息,然后用 DOM 对页面进行 NODE 分析,处理得到原创的 HTML 数据,这样做的好处是可以灵活处理一个某条数据高 难点在于分段算法的优化。当页面HTML信息量较大时,算法不好,会影响处理效率。
2、htmlparser框架,对于html页面处理的数据结构,HtmlParser采用经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode、Tag来描述HTML页面的元素。 Htmlparser基本可以满足垂直搜索引擎页面处理分析的需要,映射HTML标签,可以方便的获取标签中的HTMLCODE。
Htmlparser官方介绍:htmlparser是一个纯java的html解析库,不依赖其他java库文件,主要用于转换或提取html。可以超高速解析html,不会出错。最新版本的 htmlparser 现在是 2.0。可以毫不夸张地说,htmlparser是目前最好的html解析分析工具。
3、nekohtml框架,nekohtml在容错性和性能(包括htmlunit和nekohtml)方面比htmlparser有更好的口碑,nokehtml类似xml解析原理,html标签正确解析为dom 它们对应DOM树中对应的元素进行处理。
NekoHTML 官方介绍:NekoHTML 是一个 Java 语言的 HTML 扫描器和标签平衡器,它使程序能够解析 HTML 文档并使用标准的 XML 接口来访问其中的信息。这个解析器可以扫描 HTML 文件并“纠正”作者(人或机器)在编写 HTML 文档过程中经常犯的许多错误。
NekoHTML 可以添加缺失的父元素,自动关闭带有结束标签的对应元素,以及不匹配的内联元素标签。 NekoHTML 的开发使用 XercesNativeInterface (XNI),它是 Xerces2 的基础。
java爬虫抓取网页数据( MaterialDesign重构了自己的新闻App,数据来源过程Get)
网站优化 • 优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-10-08 17:34
MaterialDesign重构了自己的新闻App,数据来源过程Get)
Java实现爬虫向App提供数据(Jsoup网络爬虫)
更新时间:2020年7月31日11:57:06 作者:学习编程知识
本文文章主要介绍Java爬虫为App提供数据的实现,即Jsoup网络爬虫。文章中的示例代码很详细,有一定的参考价值。有兴趣的朋友可以参考一下。
一、要求
最近,我基于 Material Design 重构了我的新闻应用。数据源有问题。
前人分析了知乎每日新闻和凤凰新闻等API。根据对应的URL,可以得到新闻的JSON数据。为了锻炼写代码的能力,打算自己爬新闻页面,获取数据来搭建API。
二、效果图
下图为原版网站
爬虫获取数据并显示在APP移动端
三、爬虫想法
App的实现过程请参考这些文章文章。本文主要讲解如何抓取数据。
Android下记录App操作生成Gif动态图的全过程:///article/78236.htm
学习 Android Material Design(RecyclerView 而不是 ListView):///article/78232.htm
Android项目实战页面(RecyclerView):///article/78230.htm
Jsoup 简介
Jsoup 是一个 Java 开源 HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。
Jsoup主要有以下功能:
四、爬取过程
获取获取网页 HTML 的请求
新闻页面Html的DOM树如下:
下面这段代码使用代码根据指定的url获取get请求返回的html源代码。
public static String doGet(String urlStr) throws CommonException {
URL url;
String html = "";
try {
url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
html = StreamTool.inToStringByByte(in);
} else {
throw new CommonException("新闻服务器返回值不为200");
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("get请求失败");
}
return html;
}
InputStream in = connection.getInputStream();将输入流转换为字符串是一个常见的要求。我们把它抽象出来,写一个工具方法。
public class StreamTool {
public static String inToStringByByte(InputStream in) throws Exception {
ByteArrayOutputStream outStr = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
StringBuilder content = new StringBuilder();
while ((len = in.read(buffer)) != -1) {
content.append(new String(buffer, 0, len, "UTF-8"));
}
outStr.close();
return content.toString();
}
}
五、解析 HTML 获取标题
使用谷歌浏览器的审查元素,找出新闻标题的html代码:
关于举办《经典音乐作品欣赏与人文审美》讲座的通知
我们需要从上面的 HTML 中找到 id="article_title" 的部分,使用 getElementById(String id) 方法
String htmlStr = HttpTool.doGet(urlStr);
// 将获取的网页 HTML 源代码转化为 Document
Document doc = Jsoup.parse(htmlStr);
Element articleEle = doc.getElementById("article");
// 标题
Element titleEle = articleEle.getElementById("article_title");
String titleStr = titleEle.text();
六、获取发布日期和信息来源
还要找出对应的HTML代码
2015-05-28
??Դ:
浏览次数:
477
思路和上面类似。使用 getElementById(String id) 方法找出 id="article_detail" 作为 Element,然后使用 getElementsByTag 获取 span 部分。因为有 3 个 ...,它返回 Elements 而不是 Element。
// article_detail包括了 2016-01-15 来源: 浏览次数:177
Element detailEle = articleEle.getElementById("article_detail");
Elements details = detailEle.getElementsByTag("span");
// 发布时间
String dateStr = details.get(0).text();
// 新闻来源
String sourceStr = details.get(1).text();
七、分析浏览量
如果打印出上面的details.get(2).text(),你只会得到 查看全部
java爬虫抓取网页数据(
MaterialDesign重构了自己的新闻App,数据来源过程Get)
Java实现爬虫向App提供数据(Jsoup网络爬虫)
更新时间:2020年7月31日11:57:06 作者:学习编程知识
本文文章主要介绍Java爬虫为App提供数据的实现,即Jsoup网络爬虫。文章中的示例代码很详细,有一定的参考价值。有兴趣的朋友可以参考一下。
一、要求
最近,我基于 Material Design 重构了我的新闻应用。数据源有问题。
前人分析了知乎每日新闻和凤凰新闻等API。根据对应的URL,可以得到新闻的JSON数据。为了锻炼写代码的能力,打算自己爬新闻页面,获取数据来搭建API。
二、效果图
下图为原版网站

爬虫获取数据并显示在APP移动端

三、爬虫想法

App的实现过程请参考这些文章文章。本文主要讲解如何抓取数据。
Android下记录App操作生成Gif动态图的全过程:///article/78236.htm
学习 Android Material Design(RecyclerView 而不是 ListView):///article/78232.htm
Android项目实战页面(RecyclerView):///article/78230.htm
Jsoup 简介
Jsoup 是一个 Java 开源 HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。
Jsoup主要有以下功能:
四、爬取过程
获取获取网页 HTML 的请求
新闻页面Html的DOM树如下:

下面这段代码使用代码根据指定的url获取get请求返回的html源代码。
public static String doGet(String urlStr) throws CommonException {
URL url;
String html = "";
try {
url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
html = StreamTool.inToStringByByte(in);
} else {
throw new CommonException("新闻服务器返回值不为200");
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("get请求失败");
}
return html;
}
InputStream in = connection.getInputStream();将输入流转换为字符串是一个常见的要求。我们把它抽象出来,写一个工具方法。
public class StreamTool {
public static String inToStringByByte(InputStream in) throws Exception {
ByteArrayOutputStream outStr = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
StringBuilder content = new StringBuilder();
while ((len = in.read(buffer)) != -1) {
content.append(new String(buffer, 0, len, "UTF-8"));
}
outStr.close();
return content.toString();
}
}
五、解析 HTML 获取标题
使用谷歌浏览器的审查元素,找出新闻标题的html代码:
关于举办《经典音乐作品欣赏与人文审美》讲座的通知
我们需要从上面的 HTML 中找到 id="article_title" 的部分,使用 getElementById(String id) 方法
String htmlStr = HttpTool.doGet(urlStr);
// 将获取的网页 HTML 源代码转化为 Document
Document doc = Jsoup.parse(htmlStr);
Element articleEle = doc.getElementById("article");
// 标题
Element titleEle = articleEle.getElementById("article_title");
String titleStr = titleEle.text();
六、获取发布日期和信息来源
还要找出对应的HTML代码
2015-05-28
??Դ:
浏览次数:
477
思路和上面类似。使用 getElementById(String id) 方法找出 id="article_detail" 作为 Element,然后使用 getElementsByTag 获取 span 部分。因为有 3 个 ...,它返回 Elements 而不是 Element。
// article_detail包括了 2016-01-15 来源: 浏览次数:177
Element detailEle = articleEle.getElementById("article_detail");
Elements details = detailEle.getElementsByTag("span");
// 发布时间
String dateStr = details.get(0).text();
// 新闻来源
String sourceStr = details.get(1).text();
七、分析浏览量
如果打印出上面的details.get(2).text(),你只会得到
java爬虫抓取网页数据(Java解析xml文件遇到特殊符号会出现异常的解决方案(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-08 01:20
猜猜你在找什么 Java 相关的文章
一个简单的记账小程序(java)
感觉自己学到了很多基础知识,但是一直没有搞清楚一个项目的实际开发过程,所以就用这个小记账小程序来梳理一下。由于楼主也是学习阶段的菜鸟,程序可能存在各种玄学上的bug,希望大家一起改进。向站长学习了很多
Java实现哈夫曼树
O(∩_∩)O~~ 概述 我想所有学过数据结构的朋友都知道霍夫曼。这位大神发明了著名的“最优二叉树”。为了纪念他,我们称它为“哈夫曼树”。哈夫曼树可以用于哈夫曼编码,编码知识可以很大,例如
java笔记和对象
现在编程的思想分为两个阵营,面向过程和面向对象。现在说说什么是面向对象。作为单身狗,说起“对象”(;′⌒`)还是很心酸的……我们来看看百度是怎么说的?嗯,百度说的太抽象了,简单说一下
java笔记中变量的存储方法
1.java变量存储区java变量的存储区主要放在以下几个地方:(1)寄存器:可以说是最快的存储区。寄存器变量可以在C/C++,但是在java中不能声明Register变量,而是编译器在编译时确定的。
Java解析xml文件遇到特殊符号&会异常解决方法
文/朱继倩Java解析xml文件开发过程中,使用SAX解析时出现异常信息:Error on line 60 of document: For entity "xxx"
布尔源剖析
一. 继承Boolean的类的源码定义部分如下: 1 public final class Boolean 实现java.io.Serializable, 2 Comparable&l
策略枚举:杜绝项目中大量使用if-else的优雅姿势
文/朱继谦记得刚开始接触JAVA面向对象编程的时候,如果遇到大量的进程判断语句,几乎满屏都是if-else语句,多到忘记在哪头和哪里是尽头,不过就算是满屏也是if-else,不过当时我也没觉得太别扭。等待
Java源码分析:Guava的不可变集合ImmutableMap源码分析
一、 案例场景遇到了这样的场景。定义静态修改Map时,使用了大量的put()方法赋值,类似于this-public static final Map 查看全部
java爬虫抓取网页数据(Java解析xml文件遇到特殊符号会出现异常的解决方案(组图))
猜猜你在找什么 Java 相关的文章
一个简单的记账小程序(java)
感觉自己学到了很多基础知识,但是一直没有搞清楚一个项目的实际开发过程,所以就用这个小记账小程序来梳理一下。由于楼主也是学习阶段的菜鸟,程序可能存在各种玄学上的bug,希望大家一起改进。向站长学习了很多
Java实现哈夫曼树
O(∩_∩)O~~ 概述 我想所有学过数据结构的朋友都知道霍夫曼。这位大神发明了著名的“最优二叉树”。为了纪念他,我们称它为“哈夫曼树”。哈夫曼树可以用于哈夫曼编码,编码知识可以很大,例如
java笔记和对象
现在编程的思想分为两个阵营,面向过程和面向对象。现在说说什么是面向对象。作为单身狗,说起“对象”(;′⌒`)还是很心酸的……我们来看看百度是怎么说的?嗯,百度说的太抽象了,简单说一下
java笔记中变量的存储方法
1.java变量存储区java变量的存储区主要放在以下几个地方:(1)寄存器:可以说是最快的存储区。寄存器变量可以在C/C++,但是在java中不能声明Register变量,而是编译器在编译时确定的。
Java解析xml文件遇到特殊符号&会异常解决方法
文/朱继倩Java解析xml文件开发过程中,使用SAX解析时出现异常信息:Error on line 60 of document: For entity "xxx"
布尔源剖析
一. 继承Boolean的类的源码定义部分如下: 1 public final class Boolean 实现java.io.Serializable, 2 Comparable&l
策略枚举:杜绝项目中大量使用if-else的优雅姿势
文/朱继谦记得刚开始接触JAVA面向对象编程的时候,如果遇到大量的进程判断语句,几乎满屏都是if-else语句,多到忘记在哪头和哪里是尽头,不过就算是满屏也是if-else,不过当时我也没觉得太别扭。等待
Java源码分析:Guava的不可变集合ImmutableMap源码分析
一、 案例场景遇到了这样的场景。定义静态修改Map时,使用了大量的put()方法赋值,类似于this-public static final Map
java爬虫抓取网页数据(WebCollector2.20线程安全教程演示2.20 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 134 次浏览 • 2021-10-07 03:38
)
本教程演示webcollector2.20的新功能
下载
webcollector的最新jar包可以从webcollector GitHub的主页下载
元数据:
元数据是每个爬网任务的附加信息。元数据的灵活应用可以大大简化爬虫的设计
例如,post请求通常需要收录参数,而传统的爬虫程序只是使用URL保存参数,这不适合复杂的post请求
有些爬行任务需要获取遍历树的深度信息,也可以通过元数据轻松实现
请参阅教程DemocepthCrawler
RamCrawler:
Ramcrawler不需要依赖文件系统或数据库,适合于一次性爬网任务
如果您想编写长期任务,请使用breadthcrawler
本教程实现了一个爬虫程序,它对Bing搜索的前N个页面的结果进行爬虫,并将爬虫结果直接输出到标准输出流
如果要将爬网结果输出到数据结构(如ArrayList),请在类中定义ArrayList的成员变量
输出时将结果插入ArrayList。请注意,爬虫程序是多线程的,而ArrayList不是线程化的
它是安全的。因此,在执行插入操作时,可以使用以下方法锁定以确保安全
synchronized(this){
//插入操作
}
本教程中Bing搜索的解析规则可能会随着Bing搜索的修订而过期
<p><br />import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import java.net.URLEncoder;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
public class DemoBingCrawler extends RamCrawler {
public DemoBingCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum 查看全部
java爬虫抓取网页数据(WebCollector2.20线程安全教程演示2.20
)
本教程演示webcollector2.20的新功能
下载
webcollector的最新jar包可以从webcollector GitHub的主页下载
元数据:
元数据是每个爬网任务的附加信息。元数据的灵活应用可以大大简化爬虫的设计
例如,post请求通常需要收录参数,而传统的爬虫程序只是使用URL保存参数,这不适合复杂的post请求
有些爬行任务需要获取遍历树的深度信息,也可以通过元数据轻松实现
请参阅教程DemocepthCrawler
RamCrawler:
Ramcrawler不需要依赖文件系统或数据库,适合于一次性爬网任务
如果您想编写长期任务,请使用breadthcrawler
本教程实现了一个爬虫程序,它对Bing搜索的前N个页面的结果进行爬虫,并将爬虫结果直接输出到标准输出流
如果要将爬网结果输出到数据结构(如ArrayList),请在类中定义ArrayList的成员变量
输出时将结果插入ArrayList。请注意,爬虫程序是多线程的,而ArrayList不是线程化的
它是安全的。因此,在执行插入操作时,可以使用以下方法锁定以确保安全
synchronized(this){
//插入操作
}
本教程中Bing搜索的解析规则可能会随着Bing搜索的修订而过期
<p><br />import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import java.net.URLEncoder;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
public class DemoBingCrawler extends RamCrawler {
public DemoBingCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum
java爬虫抓取网页数据(小奇和一张张求知若渴的表情流程(一)(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 175 次浏览 • 2021-10-07 03:36
看着后面的小七和渴求知识的表情,我对未知充满了好奇,想起当年的我也是这样。长老们也很高兴,继续解释着自己的解释。我们来谈谈数据爬取。取的过程。
数据爬取主要分为四个步骤:爬取对象准备-->页面数据抓取-->数据分析处理-->数据持久化存储。
爬取对象准备:数据爬取的入口点,即我们要爬取的种子网址,将需要爬取的网址统一到一个指定的集合中进行分配和爬取。
URL队列:抓取页面的URL时,如果发现新的URL,会重新放入URL队列进行爬取。
URL 重复数据删除:重复删除放置的 URL。如果 URL 已经在队列中,请删除重复的 URL 以避免重复抓取。
URL去重方法:将其存储在内存或缓存服务器中进行去重,常见的有布隆过滤、redis数据库去重等。
网页数据抓取:网页数据抓取,即网页下载。通过网页爬虫工具Jsoup、HttpClient等下载URL队列中的目标网页,从下载的网页中抓取需要的内容进行处理。内容处理方式:1.无需存储,实时分析处理,2.无需存储,结构化分布式存储(hadoop分布式存储等)
数据分析与处理:数据分析按照采集规则进行,主要是将非结构化数据转化为结构化数据。常用的解析工具:Xpath解析、Jsoup选择器解析、HtmlUtil动态解析、Selenium自动化工具等。
数据持久化存储:数据持久化存储主要是对经过解析、去重、去干、检索后的结构化数据进行存储。
数据去干:通过数据挖掘,过滤掉垃圾,保证数据的可用性。
重复数据删除:判断数据库中是否已经存在数据,进行重复数据删除。通常,重复数据删除是针对文本类型的数据,使用simhahs算法进行判断。
数据存储:对分析后的数据进行结构化处理,三种数据存储方式:1.分布式nosql数据库(redis/mongdb/hbase),2.关系分布式数据库(mysql/Oracle等),< @3. 索引存储(elasticsearch/solr 等)等。
数据爬取流程图解决方案:
“好了,基本的理论知识就讲解到这里,接下来讲解网络爬虫技术的实战,继续巩固今天的知识,为接下来的学习做准备。” 说完,长老看着小七和一些还在思索的弟子,便自己离开了。
更多视频java爬虫视频课程: 查看全部
java爬虫抓取网页数据(小奇和一张张求知若渴的表情流程(一)(图))
看着后面的小七和渴求知识的表情,我对未知充满了好奇,想起当年的我也是这样。长老们也很高兴,继续解释着自己的解释。我们来谈谈数据爬取。取的过程。
数据爬取主要分为四个步骤:爬取对象准备-->页面数据抓取-->数据分析处理-->数据持久化存储。
爬取对象准备:数据爬取的入口点,即我们要爬取的种子网址,将需要爬取的网址统一到一个指定的集合中进行分配和爬取。
URL队列:抓取页面的URL时,如果发现新的URL,会重新放入URL队列进行爬取。

URL 重复数据删除:重复删除放置的 URL。如果 URL 已经在队列中,请删除重复的 URL 以避免重复抓取。
URL去重方法:将其存储在内存或缓存服务器中进行去重,常见的有布隆过滤、redis数据库去重等。

网页数据抓取:网页数据抓取,即网页下载。通过网页爬虫工具Jsoup、HttpClient等下载URL队列中的目标网页,从下载的网页中抓取需要的内容进行处理。内容处理方式:1.无需存储,实时分析处理,2.无需存储,结构化分布式存储(hadoop分布式存储等)
数据分析与处理:数据分析按照采集规则进行,主要是将非结构化数据转化为结构化数据。常用的解析工具:Xpath解析、Jsoup选择器解析、HtmlUtil动态解析、Selenium自动化工具等。
数据持久化存储:数据持久化存储主要是对经过解析、去重、去干、检索后的结构化数据进行存储。
数据去干:通过数据挖掘,过滤掉垃圾,保证数据的可用性。
重复数据删除:判断数据库中是否已经存在数据,进行重复数据删除。通常,重复数据删除是针对文本类型的数据,使用simhahs算法进行判断。
数据存储:对分析后的数据进行结构化处理,三种数据存储方式:1.分布式nosql数据库(redis/mongdb/hbase),2.关系分布式数据库(mysql/Oracle等),< @3. 索引存储(elasticsearch/solr 等)等。
数据爬取流程图解决方案:

“好了,基本的理论知识就讲解到这里,接下来讲解网络爬虫技术的实战,继续巩固今天的知识,为接下来的学习做准备。” 说完,长老看着小七和一些还在思索的弟子,便自己离开了。
更多视频java爬虫视频课程:
java爬虫抓取网页数据(本文爬虫:Java代码更多的关于robot.txt的具体)
网站优化 • 优采云 发表了文章 • 0 个评论 • 314 次浏览 • 2021-10-05 05:13
记得刚找工作的时候,隔壁的一个同学在面试的时候用大胆的文字认识了一个网络爬虫。后来在做图片搜索的时候,需要大量的测试图片,于是萌生了从亚马逊爬取书籍封面图片的想法,也从网上学习了一些之前的经验,一个简单但足够的爬虫系统实现了。
网络爬虫是一种自动提取网页的程序。它从万维网下载网页以供搜索引擎使用。它是搜索引擎的重要组成部分。其基本结构如下图所示:
传统爬虫从一个或几个初始网页的网址开始,获取初始网页上的网址。在抓取网页的过程中,它不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。对于垂直搜索,聚焦爬虫,即针对特定主题抓取网页的爬虫更合适。
本文爬虫程序的核心代码如下:
Java代码
public void crawl() throws Throwable { while (continueCrawling()) { CrawlerUrl url = getNextUrl(); //获取待爬取队列中的下一个URL if (url != null) { printCrawlInfo(); String content = getContent(url); //获取URL的文本信息 //聚焦爬虫只爬取与主题内容相关的网页,这里采用正则匹配简单处理 if (isContentRelevant(content, this.regexpSearchPattern)) { saveContent(url, content); //保存网页至本地 //获取网页内容中的链接,并放入待爬取队列中 Collection urlStrings = extractUrls(content, url); addUrlsToUrlQueue(url, urlStrings); } else { System.out.println(url + " is not relevant ignoring ..."); } //延时防止被对方屏蔽 Thread.sleep(this.delayBetweenUrls); } } closeOutputStream(); }
整个函数由getNextUrl、getContent、isContentRelevant、extractUrls、addUrlsToUrlQueue等几个核心方法组成,下面将一一介绍。先看getNextUrl:
Java代码
private CrawlerUrl getNextUrl() throws Throwable { CrawlerUrl nextUrl = null; while ((nextUrl == null) && (!urlQueue.isEmpty())) { CrawlerUrl crawlerUrl = this.urlQueue.remove(); //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取 //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免 if (doWeHavePermissionToVisit(crawlerUrl) && (!isUrlAlreadyVisited(crawlerUrl)) && isDepthAcceptable(crawlerUrl)) { nextUrl = crawlerUrl; // System.out.println("Next url to be visited is " + nextUrl); } } return nextUrl; }
关于robot.txt更具体的写法,请参考以下文章:
getContent 使用apache的httpclient 4.1来获取网页的内容,具体代码如下:
Java代码
private String getContent(CrawlerUrl url) throws Throwable { //HttpClient4.1的调用与之前的方式不同 HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url.getUrlString()); StringBuffer strBuf = new StringBuffer(); HttpResponse response = client.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { HttpEntity entity = response.getEntity(); if (entity != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(entity.getContent(), "UTF-8")); String line = null; if (entity.getContentLength() > 0) { strBuf = new StringBuffer((int) entity.getContentLength()); while ((line = reader.readLine()) != null) { strBuf.append(line); } } } if (entity != null) { entity.consumeContent(); } } //将url标记为已访问 markUrlAsVisited(url); return strBuf.toString(); }
对于垂直应用,数据的准确性往往更为重要。聚焦爬虫的主要特点是只采集与主题相关的数据,这就是isContentRelevant方法的作用。这里,可以使用分类预测技术。为简单起见,改为使用常规匹配。主要代码如下:
Java代码
public static boolean isContentRelevant(String content, Pattern regexpPattern) { boolean retValue = false; if (content != null) { //是否符合正则表达式的条件 Matcher m = regexpPattern.matcher(content.toLowerCase()); retValue = m.find(); } return retValue; }
extractUrls 的主要功能是从网页中获取更多的 URL,包括内部链接和外部链接。代码如下:
Java代码
public List extractUrls(String text, CrawlerUrl crawlerUrl) { Map urlMap = new HashMap(); extractHttpUrls(urlMap, text); extractRelativeUrls(urlMap, text, crawlerUrl); return new ArrayList(urlMap.keySet()); } //处理外部链接 private void extractHttpUrls(Map urlMap, String text) { Matcher m = httpRegexp.matcher(text); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { // System.out.println("Term = " + term); if (term.startsWith("http")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } urlMap.put(term, term); System.out.println("Hyperlink: " + term); } } } } //处理内部链接 private void extractRelativeUrls(Map urlMap, String text, CrawlerUrl crawlerUrl) { Matcher m = relativeRegexp.matcher(text); URL textURL = crawlerUrl.getURL(); String host = textURL.getHost(); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { if (term.startsWith("/")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } String s = "http://" + host + term; urlMap.put(s, s); System.out.println("Relative url: " + s); } } } }
这样,一个简单的网络爬虫程序就搭建好了,可以使用如下程序进行测试:
Java代码
public static void main(String[] args) { try { String url = "http://www.amazon.com"; Queue urlQueue = new LinkedList(); String regexp = "java"; urlQueue.add(new CrawlerUrl(url, 0)); NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L, regexp); // boolean allowCrawl = crawler.areWeAllowedToVisit(url); // System.out.println("Allowed to crawl: " + url + " " + // allowCrawl); crawler.crawl(); } catch (Throwable t) { System.out.println(t.toString()); t.printStackTrace(); } }
当然,你可以赋予它更高级的特性,比如多线程、更智能的焦点、使用 Lucene 索引等等。对于更复杂的情况,可以考虑使用一些开源的spider程序,比如Nutch或者Heritrix等,这些都超出了本文的范围。 查看全部
java爬虫抓取网页数据(本文爬虫:Java代码更多的关于robot.txt的具体)
记得刚找工作的时候,隔壁的一个同学在面试的时候用大胆的文字认识了一个网络爬虫。后来在做图片搜索的时候,需要大量的测试图片,于是萌生了从亚马逊爬取书籍封面图片的想法,也从网上学习了一些之前的经验,一个简单但足够的爬虫系统实现了。
网络爬虫是一种自动提取网页的程序。它从万维网下载网页以供搜索引擎使用。它是搜索引擎的重要组成部分。其基本结构如下图所示:

传统爬虫从一个或几个初始网页的网址开始,获取初始网页上的网址。在抓取网页的过程中,它不断地从当前页面中提取新的URL并将它们放入队列中,直到满足系统的某个停止条件。对于垂直搜索,聚焦爬虫,即针对特定主题抓取网页的爬虫更合适。
本文爬虫程序的核心代码如下:
Java代码
public void crawl() throws Throwable { while (continueCrawling()) { CrawlerUrl url = getNextUrl(); //获取待爬取队列中的下一个URL if (url != null) { printCrawlInfo(); String content = getContent(url); //获取URL的文本信息 //聚焦爬虫只爬取与主题内容相关的网页,这里采用正则匹配简单处理 if (isContentRelevant(content, this.regexpSearchPattern)) { saveContent(url, content); //保存网页至本地 //获取网页内容中的链接,并放入待爬取队列中 Collection urlStrings = extractUrls(content, url); addUrlsToUrlQueue(url, urlStrings); } else { System.out.println(url + " is not relevant ignoring ..."); } //延时防止被对方屏蔽 Thread.sleep(this.delayBetweenUrls); } } closeOutputStream(); }
整个函数由getNextUrl、getContent、isContentRelevant、extractUrls、addUrlsToUrlQueue等几个核心方法组成,下面将一一介绍。先看getNextUrl:
Java代码

private CrawlerUrl getNextUrl() throws Throwable { CrawlerUrl nextUrl = null; while ((nextUrl == null) && (!urlQueue.isEmpty())) { CrawlerUrl crawlerUrl = this.urlQueue.remove(); //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取 //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免 if (doWeHavePermissionToVisit(crawlerUrl) && (!isUrlAlreadyVisited(crawlerUrl)) && isDepthAcceptable(crawlerUrl)) { nextUrl = crawlerUrl; // System.out.println("Next url to be visited is " + nextUrl); } } return nextUrl; }
关于robot.txt更具体的写法,请参考以下文章:
getContent 使用apache的httpclient 4.1来获取网页的内容,具体代码如下:
Java代码
private String getContent(CrawlerUrl url) throws Throwable { //HttpClient4.1的调用与之前的方式不同 HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url.getUrlString()); StringBuffer strBuf = new StringBuffer(); HttpResponse response = client.execute(httpGet); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { HttpEntity entity = response.getEntity(); if (entity != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(entity.getContent(), "UTF-8")); String line = null; if (entity.getContentLength() > 0) { strBuf = new StringBuffer((int) entity.getContentLength()); while ((line = reader.readLine()) != null) { strBuf.append(line); } } } if (entity != null) { entity.consumeContent(); } } //将url标记为已访问 markUrlAsVisited(url); return strBuf.toString(); }
对于垂直应用,数据的准确性往往更为重要。聚焦爬虫的主要特点是只采集与主题相关的数据,这就是isContentRelevant方法的作用。这里,可以使用分类预测技术。为简单起见,改为使用常规匹配。主要代码如下:
Java代码
public static boolean isContentRelevant(String content, Pattern regexpPattern) { boolean retValue = false; if (content != null) { //是否符合正则表达式的条件 Matcher m = regexpPattern.matcher(content.toLowerCase()); retValue = m.find(); } return retValue; }
extractUrls 的主要功能是从网页中获取更多的 URL,包括内部链接和外部链接。代码如下:
Java代码
public List extractUrls(String text, CrawlerUrl crawlerUrl) { Map urlMap = new HashMap(); extractHttpUrls(urlMap, text); extractRelativeUrls(urlMap, text, crawlerUrl); return new ArrayList(urlMap.keySet()); } //处理外部链接 private void extractHttpUrls(Map urlMap, String text) { Matcher m = httpRegexp.matcher(text); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { // System.out.println("Term = " + term); if (term.startsWith("http")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } urlMap.put(term, term); System.out.println("Hyperlink: " + term); } } } } //处理内部链接 private void extractRelativeUrls(Map urlMap, String text, CrawlerUrl crawlerUrl) { Matcher m = relativeRegexp.matcher(text); URL textURL = crawlerUrl.getURL(); String host = textURL.getHost(); while (m.find()) { String url = m.group(); String[] terms = url.split("a href=\""); for (String term : terms) { if (term.startsWith("/")) { int index = term.indexOf("\""); if (index > 0) { term = term.substring(0, index); } String s = "http://" + host + term; urlMap.put(s, s); System.out.println("Relative url: " + s); } } } }
这样,一个简单的网络爬虫程序就搭建好了,可以使用如下程序进行测试:
Java代码
public static void main(String[] args) { try { String url = "http://www.amazon.com"; Queue urlQueue = new LinkedList(); String regexp = "java"; urlQueue.add(new CrawlerUrl(url, 0)); NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L, regexp); // boolean allowCrawl = crawler.areWeAllowedToVisit(url); // System.out.println("Allowed to crawl: " + url + " " + // allowCrawl); crawler.crawl(); } catch (Throwable t) { System.out.println(t.toString()); t.printStackTrace(); } }
当然,你可以赋予它更高级的特性,比如多线程、更智能的焦点、使用 Lucene 索引等等。对于更复杂的情况,可以考虑使用一些开源的spider程序,比如Nutch或者Heritrix等,这些都超出了本文的范围。
java爬虫抓取网页数据(如何知道这个网站是动态加载的动态数据?(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-05 00:08
大多数学习 Python 的人都在使用 Python 作为爬虫。毕竟,Python 是爬虫的最佳选择。
但是一般简单的静态页面网站还是很容易爬取的。对于很多动态加载的网站,我不知道该怎么办。今天给大家介绍两个动态爬虫js加载动态。数据,希望对爬虫有帮助!
今天就以高考查询网站为例!
我怎么知道这个 网站 是动态加载的数据?
使用浏览器,这里我建议使用火狐或者谷歌,大家一定都知道
打开你的网页,右键查看页面源码,ctrl+F查询输入293,源码没有这个值,说明数据是动态加载的。
它的网站是:数字代表的页数。共计165页
所以获取所有的url地址非常简单
对于动态加载数据,我们通常使用两种方法:
使用selenium分析网页元素,找到数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。
方法一硒:
为什么要写这个,代码注明注释!
总结:通过对数据的分析,写出上面的搜索方法,就可以得到所有的数据了。通过这种方式获取数据简单直观,但缺点是速度太慢。方法二分析网页元素,找出数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。:
既然要分析网页元素,首先要使用开发者工具。按 F12 打开浏览器自带的开发者工具。如下所示
分析显示json类型的列就是我们需要的数据
检查消息头中的请求网站:
真正的请求网站:
范围:
messtype=jsonp&callback=jQuery3805365803_58&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=03
也可以点击右边的参数栏查看参数
详细代码
方法非常简单。最主要的是自己练习。只有通过实践,你才能了解真相。学习在岸边游泳是不可能的。爬取JS加载的动态数据有两种简单的方法。方法很简单。你学会了吗?现在就试试! 查看全部
java爬虫抓取网页数据(如何知道这个网站是动态加载的动态数据?(组图))
大多数学习 Python 的人都在使用 Python 作为爬虫。毕竟,Python 是爬虫的最佳选择。
但是一般简单的静态页面网站还是很容易爬取的。对于很多动态加载的网站,我不知道该怎么办。今天给大家介绍两个动态爬虫js加载动态。数据,希望对爬虫有帮助!
今天就以高考查询网站为例!
我怎么知道这个 网站 是动态加载的数据?
使用浏览器,这里我建议使用火狐或者谷歌,大家一定都知道
打开你的网页,右键查看页面源码,ctrl+F查询输入293,源码没有这个值,说明数据是动态加载的。
它的网站是:数字代表的页数。共计165页
所以获取所有的url地址非常简单
对于动态加载数据,我们通常使用两种方法:
使用selenium分析网页元素,找到数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。
方法一硒:
为什么要写这个,代码注明注释!
总结:通过对数据的分析,写出上面的搜索方法,就可以得到所有的数据了。通过这种方式获取数据简单直观,但缺点是速度太慢。方法二分析网页元素,找出数据的原创网页,提交表单,获取不同的数据,达到爬取的目的。:
既然要分析网页元素,首先要使用开发者工具。按 F12 打开浏览器自带的开发者工具。如下所示
分析显示json类型的列就是我们需要的数据
检查消息头中的请求网站:
真正的请求网站:
范围:
messtype=jsonp&callback=jQuery3805365803_58&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=03
也可以点击右边的参数栏查看参数
详细代码
方法非常简单。最主要的是自己练习。只有通过实践,你才能了解真相。学习在岸边游泳是不可能的。爬取JS加载的动态数据有两种简单的方法。方法很简单。你学会了吗?现在就试试!
java爬虫抓取网页数据( 目标网页用关键字在源代码中查找最终代码验证结果)
网站优化 • 优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2021-10-05 00:00
目标网页用关键字在源代码中查找最终代码验证结果)
概括
根据网站的结构和数据类型,做一个头条视频的爬虫,重点关注网站中数据的位置和抓取方法
并介绍一个类似的网站,简单解释一下数据抓取的方法
使用工具:python3.6 + pycharm + requests 库 + re 库
目标情况
这次我们的目标网站是Ajax加载的数据。首先打开网页后,直接使用浏览器自带的开发者工具(火狐),点击网页,然后将网页向下滑动,点击xhr,找到json数据,可以看到100条左右的内容
每个视频都有相关信息,我们只需要取出每个视频的url即可!然后去查看详情页
很容易就能找到视频的真实地址!复制地址,重新打开一个网页进行验证,确认地址正确,然后去源码查看地址是否存在
很明显,这个网站不是静态的网站,数据应该是存放在js文件中的,那我们怎么获取呢~?我需要分析js文件还是使用selenium?别担心,我偶然发现了这个
有没有发现网页源代码中存在URL中的关键字,虽然不完全相同,但是我们可以与上一个标签中的内容进行比较
可以确定,这里的值是网页渲染后出现在html标签中的值,在源码中有两个不同格式的视频地址!,很简单,我们来写代码吧!
代码
简单写一下,直接用requests请求内容,然后用re匹配,取出目标url
类似于 网站
其实还有一个网站和这种情况很相似,那就是第二个视频,但是如果你想看更多的视频,还是需要打开客户端,所以我们就简单的把一个视频作为一个例子。抓住它的真实地址!具体过程就不一一讲解了,直接看结果,先看登陆页面
使用关键字在源代码中查找
最终代码
验证结果
以上文章如有错误,请在留言区指出。如果这个文章对你有用,你喜欢并转发吗? 查看全部
java爬虫抓取网页数据(
目标网页用关键字在源代码中查找最终代码验证结果)
概括
根据网站的结构和数据类型,做一个头条视频的爬虫,重点关注网站中数据的位置和抓取方法
并介绍一个类似的网站,简单解释一下数据抓取的方法
使用工具:python3.6 + pycharm + requests 库 + re 库
目标情况
这次我们的目标网站是Ajax加载的数据。首先打开网页后,直接使用浏览器自带的开发者工具(火狐),点击网页,然后将网页向下滑动,点击xhr,找到json数据,可以看到100条左右的内容
每个视频都有相关信息,我们只需要取出每个视频的url即可!然后去查看详情页
很容易就能找到视频的真实地址!复制地址,重新打开一个网页进行验证,确认地址正确,然后去源码查看地址是否存在
很明显,这个网站不是静态的网站,数据应该是存放在js文件中的,那我们怎么获取呢~?我需要分析js文件还是使用selenium?别担心,我偶然发现了这个
有没有发现网页源代码中存在URL中的关键字,虽然不完全相同,但是我们可以与上一个标签中的内容进行比较
可以确定,这里的值是网页渲染后出现在html标签中的值,在源码中有两个不同格式的视频地址!,很简单,我们来写代码吧!
代码
简单写一下,直接用requests请求内容,然后用re匹配,取出目标url
类似于 网站
其实还有一个网站和这种情况很相似,那就是第二个视频,但是如果你想看更多的视频,还是需要打开客户端,所以我们就简单的把一个视频作为一个例子。抓住它的真实地址!具体过程就不一一讲解了,直接看结果,先看登陆页面
使用关键字在源代码中查找
最终代码
验证结果
以上文章如有错误,请在留言区指出。如果这个文章对你有用,你喜欢并转发吗?
java爬虫抓取网页数据(新浪新闻国内新闻页静态网页数据在函数中的应用)
网站优化 • 优采云 发表了文章 • 0 个评论 • 109 次浏览 • 2021-10-04 23:35
昨天,一个朋友来找我。新浪新闻国内新闻页面的其他部分是静态网页,但左下方的最新新闻部分不是静态网页,也没有json数据。让我帮你抓住它。大概看了一下,是js加载的,数据在js函数里,很有意思,所以分享给大家看看!
抓取目标
我们今天的目标是上图的红框部分。首先我们确定这部分内容不在网页源码中,属于js加载的部分,点击翻页后没有json数据传输!
但是发现有一个js请求,点击请求,是一行js函数代码,我们复制到json的view viewer中,然后格式化看看结果
发现可能有我们需要的内容,比如url、title、intro这3个参数,猜测是对应的新闻网址、标题、介绍
只是它的内容,需要处理,我们写在代码里看看
开始写代码
先导入库,因为需要截取字符串的最后一部分,所以使用requests库来获取请求,重新匹配内容即可。然后我们先匹配上面的3个item
可以看到,url中有\\,标题和介绍都是\\u539f\\u6807\\u9898的形式。这些是我们需要处理的后续步骤!
先用replace函数把\\放在url里,就可以得到url了,下面的\\u539f\\u6807\\u9898是unicode编码,可以直接解码内容直接写code
使用eval函数进行解码,可以将内容解码成u'unicode编码内容'的形式!
这样就把这个页面上所有新闻和URL相关的内容都取出来了,在外层加了一个循环来爬取所有的新闻页面,任务就完成了!
后记
新浪新闻的页面js功能比较简单,可以直接抓取数据。如果是比较复杂的功能,就需要了解前端知识。这就是学习爬虫需要学习前端知识的原因!
ps:上面使用的json查看器是第三方的网站,你可以直接百度找很多,当然你也可以直接修改上面抓包的内容,然后用json读取数据!
基本代码不多。有看不清楚的小伙伴可以私信我索取代码或者一起研究爬虫! 查看全部
java爬虫抓取网页数据(新浪新闻国内新闻页静态网页数据在函数中的应用)
昨天,一个朋友来找我。新浪新闻国内新闻页面的其他部分是静态网页,但左下方的最新新闻部分不是静态网页,也没有json数据。让我帮你抓住它。大概看了一下,是js加载的,数据在js函数里,很有意思,所以分享给大家看看!
抓取目标
我们今天的目标是上图的红框部分。首先我们确定这部分内容不在网页源码中,属于js加载的部分,点击翻页后没有json数据传输!
但是发现有一个js请求,点击请求,是一行js函数代码,我们复制到json的view viewer中,然后格式化看看结果
发现可能有我们需要的内容,比如url、title、intro这3个参数,猜测是对应的新闻网址、标题、介绍
只是它的内容,需要处理,我们写在代码里看看
开始写代码
先导入库,因为需要截取字符串的最后一部分,所以使用requests库来获取请求,重新匹配内容即可。然后我们先匹配上面的3个item
可以看到,url中有\\,标题和介绍都是\\u539f\\u6807\\u9898的形式。这些是我们需要处理的后续步骤!
先用replace函数把\\放在url里,就可以得到url了,下面的\\u539f\\u6807\\u9898是unicode编码,可以直接解码内容直接写code
使用eval函数进行解码,可以将内容解码成u'unicode编码内容'的形式!
这样就把这个页面上所有新闻和URL相关的内容都取出来了,在外层加了一个循环来爬取所有的新闻页面,任务就完成了!
后记
新浪新闻的页面js功能比较简单,可以直接抓取数据。如果是比较复杂的功能,就需要了解前端知识。这就是学习爬虫需要学习前端知识的原因!
ps:上面使用的json查看器是第三方的网站,你可以直接百度找很多,当然你也可以直接修改上面抓包的内容,然后用json读取数据!
基本代码不多。有看不清楚的小伙伴可以私信我索取代码或者一起研究爬虫!
java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-10-04 06:22
使用Java爬虫抓取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
抓取目标页面
1、使用Maven构建一个普通的Java项目
添加依赖:
org.jsoup
jsoup
1.11.2
org.apache.httpcomponents
httpclient
4.3.1
2、第一堂课,开始爬取入门类
package com.yomihu.spider;
import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mini-spider 单页面爬取启动类
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class SinglePageSpiderStarter {
/**
* 开始页面的URL(一个微信公众号的页面)
*/
private static final String START_URL = "https://mp.weixin.qq.com/s/zzk ... 3B%3B
/**
* 目标图片存放目录
*/
private static final String IMG_SAVE_PATH = "E:/jj";
public static void main(String[] args) throws Exception {
//使用Jsoup将目标Url的Html页面获取为Document变量
Document rootdocument = Jsoup.connect(START_URL).get();
List urlList = new ArrayList();
//将页面中的目标Url解析为列表
ParseHtml.singlePageParseImg(rootdocument, urlList);
//初始化HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//控制图片名称的变量
int i = 0;
for (String url : urlList) {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent();
//保存图片
File file = new File(IMG_SAVE_PATH);
if (!file.exists()) {
//不存在就创建该目录
file.mkdirs();
}
String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
//保存图片
FileOutputStream fos = new FileOutputStream(imgName);
i++;
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
fos.write(data, 0, len);
}
//释放资源
response.close();
}
httpClient.close();
}
}
3、 第二类,解析Html页面
package com.yomihu.parse;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
/**
* mini-spider Html页面结构解析
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class ParseHtml {
/**
* 微信单页面结构解析,这里我们只要将页面中的图片对应的URL取出
* (方法中的解析逻辑是根据分析页面结构和各元素的特征来解析的)
*
* @param document
* @param urls
*/
public static void singlePageParseImg(Document document, List urls) {
Elements divElements = document.select("[class=rich_media_content]");
Elements pElements = divElements.select("p");
Elements imgElements = pElements.select("img");
for (Element imgElement : imgElements) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
}
Elements spanElements = pElements.select("span");
Elements imgElemnets = spanElements.select("img");
for (Element imgElement : imgElemnets) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
System.out.println(imgElement.attr("data-src"));
}
}
}
4、在第一个类中启动main函数
检查我们抓取的目标图片是否已经存在于目录中。
总结
其实爬虫不难写。首先,我们首先要知道什么是爬虫。爬虫是用程序模拟浏览器不断连接获取分析并保存页面数据;这里我只是使用Apache成熟的开源框架进行开发,实现了简单的单页爬取,同样多页循环爬取Fetching需要在程序中不断迭代,不断更新爬取目标;即程序在解析页面时,将下一个目标页面的Url保存在待爬取的列表中。
爬虫不难实现。难的是分析目标页面,找到页面元素之间的规律,定期分析页面,得到我们想要的数据;当然,更难的是服务器上的一些大网站反爬虫机制。
下面我来实现一个多页面循环爬取的demo
示例代码 查看全部
java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
使用Java爬虫抓取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
抓取目标页面
1、使用Maven构建一个普通的Java项目
添加依赖:
org.jsoup
jsoup
1.11.2
org.apache.httpcomponents
httpclient
4.3.1
2、第一堂课,开始爬取入门类
package com.yomihu.spider;
import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mini-spider 单页面爬取启动类
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class SinglePageSpiderStarter {
/**
* 开始页面的URL(一个微信公众号的页面)
*/
private static final String START_URL = "https://mp.weixin.qq.com/s/zzk ... 3B%3B
/**
* 目标图片存放目录
*/
private static final String IMG_SAVE_PATH = "E:/jj";
public static void main(String[] args) throws Exception {
//使用Jsoup将目标Url的Html页面获取为Document变量
Document rootdocument = Jsoup.connect(START_URL).get();
List urlList = new ArrayList();
//将页面中的目标Url解析为列表
ParseHtml.singlePageParseImg(rootdocument, urlList);
//初始化HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//控制图片名称的变量
int i = 0;
for (String url : urlList) {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent();
//保存图片
File file = new File(IMG_SAVE_PATH);
if (!file.exists()) {
//不存在就创建该目录
file.mkdirs();
}
String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
//保存图片
FileOutputStream fos = new FileOutputStream(imgName);
i++;
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
fos.write(data, 0, len);
}
//释放资源
response.close();
}
httpClient.close();
}
}
3、 第二类,解析Html页面
package com.yomihu.parse;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
/**
* mini-spider Html页面结构解析
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class ParseHtml {
/**
* 微信单页面结构解析,这里我们只要将页面中的图片对应的URL取出
* (方法中的解析逻辑是根据分析页面结构和各元素的特征来解析的)
*
* @param document
* @param urls
*/
public static void singlePageParseImg(Document document, List urls) {
Elements divElements = document.select("[class=rich_media_content]");
Elements pElements = divElements.select("p");
Elements imgElements = pElements.select("img");
for (Element imgElement : imgElements) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
}
Elements spanElements = pElements.select("span");
Elements imgElemnets = spanElements.select("img");
for (Element imgElement : imgElemnets) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
System.out.println(imgElement.attr("data-src"));
}
}
}
4、在第一个类中启动main函数
检查我们抓取的目标图片是否已经存在于目录中。
总结
其实爬虫不难写。首先,我们首先要知道什么是爬虫。爬虫是用程序模拟浏览器不断连接获取分析并保存页面数据;这里我只是使用Apache成熟的开源框架进行开发,实现了简单的单页爬取,同样多页循环爬取Fetching需要在程序中不断迭代,不断更新爬取目标;即程序在解析页面时,将下一个目标页面的Url保存在待爬取的列表中。
爬虫不难实现。难的是分析目标页面,找到页面元素之间的规律,定期分析页面,得到我们想要的数据;当然,更难的是服务器上的一些大网站反爬虫机制。
下面我来实现一个多页面循环爬取的demo
示例代码