
java爬虫抓取动态网页
java爬虫抓取动态网页(Java爬虫遇到需要登录的网站,该怎么办还是反向解析法呢)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-21 01:06
这是 Java 爬虫系列的第三篇文章。上一篇Java爬虫遇到网站需要登录,怎么办?在本文中,我们简要说明了爬虫遇到的登录问题的解决方案。在这个文章中,我们来谈谈遇到爬虫时数据异步加载的问题。这也是爬虫常见的问题。
现在很多都是前后端分离的项目,这会让数据异步加载的问题更加突出,所以在爬取的时候遇到这样的问题不要惊讶,不要慌。一般来说,这种问题有两种解决方案:
1、内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,这样我们就可以拿到js渲染出来的页面,这样我们就和采集的静态页面一样了。这种常用的工具有三种:-Selenium-HtmlUnit-PhantomJs
这些工具可以帮助我们解决异步数据加载的问题,但是它们都有缺点,就是效率低下,不稳定。
2、逆向分析法
什么是逆向分析?我们js渲染页面的数据是通过ajax从后端获取的,我们只需要找到对应的ajax请求连接就可以了,这样我们就得到了我们需要的数据,逆向分析方法的优点是这种方式得到的数据都是json格式的,解析起来也比较方便。另一个优点是界面变化的概率相对于页面来说更小。它也有两个缺点。一是在使用Ajax的时候需要耐心和熟练,因为需要在大的推送请求中找到自己想要的东西,二是对JavaScript渲染的页面无能为力。
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用,我以采集网易新闻为例。网易新闻地址:. 使用两种申诉方式获取网易新闻的新闻列表。网易新闻如下:
内置浏览器Selenium方式
Selenium 是一种模拟浏览器进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核进行交互。常用于自动化测试,常用于解决爬虫时的异步加载。如果我们想在项目中使用Selenium,需要做两件事:-1、 在pom.xml中引入Selenium的依赖包添加到
org.seleniumhq.selenium
selenium-java
3.141.59
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
完成以上两步后,我们就可以编写和使用Selenium采集网易新闻了。具体代码如下:
/**
* selenium 解决数据异步加载问题
* https://npm.taobao.org/mirrors/chromedriver/
*
* @param url
*/
public void selenium(String url) {
// 设置 chromedirver 的存放位置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 设置无头浏览器,这样就不会弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
// 获取到要闻新闻列表
List webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
for (WebElement webElement : webElements) {
// 提取新闻连接
String article_url = webElement.getAttribute("href");
// 提取新闻标题
String title = webElement.getText();
if (article_url.contains("https://news.163.com/")) {
System.out.println("文章标题:" + title + " ,文章链接:" + article_url);
}
}
webDriver.close();
}
运行此方法并得到以下结果:
我们已经使用Selenium正确提取了网易新闻列表。
逆向分析
逆向分析的方法是通过ajax异步获取链接获取数据,直接获取新闻数据。如果没有技巧,找Ajax的过程会很痛苦,因为一个页面加载的链接太多,看看网易新闻的网络:
有数百个请求,我如何找到哪个请求获取新闻数据?如果不嫌麻烦,可以一一上点。你绝对可以找到它们。另一种快速的方法是使用网络的搜索功能。如果你不知道搜索按钮,我在上图中圈出了它。只需在新闻中复制一个新闻标题,然后搜索,即可得到结果,如下图所示:
这样我们就快速获取到了重要新闻数据的请求链接,链接为:访问链接,查看链接返回的数据,如下图:
从数据上可以看出,我们需要的数据都在这里了,所以我们只需要解析这一段数据。从这条数据中解析新闻标题和新闻链接有两种方式,一种是正则表达式,另一种是将数据转成json或者list。这里我选择第二种方法,使用fastjson将返回的数据转换成JSONArray。所以我们要引入fastjson,并在pom.xml中引入fastjson依赖:
com.alibaba
fastjson
1.2.59
除了引入fastjson依赖之外,我们还需要对转换前的数据进行简单的处理,因为当前数据不符合list的格式,需要去掉data_callback(也是最后一个)。获取网易新闻的具体逆向分析代码如下:
<p>/**
* 使用反向解析法 解决数据异步加载的问题
*
* @param url
*/
public void httpclientMethod(String url) throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "GBK");
// 先替换掉最前面的 data_callback(
body = body.replace("data_callback(", "");
// 过滤掉最后面一个 )右括号
body = body.substring(0, body.lastIndexOf(")"));
// 将 body 转换成 JSONArray
JSONArray jsonArray = JSON.parseArray(body);
for (int i = 0; i 查看全部
java爬虫抓取动态网页(Java爬虫遇到需要登录的网站,该怎么办还是反向解析法呢)
这是 Java 爬虫系列的第三篇文章。上一篇Java爬虫遇到网站需要登录,怎么办?在本文中,我们简要说明了爬虫遇到的登录问题的解决方案。在这个文章中,我们来谈谈遇到爬虫时数据异步加载的问题。这也是爬虫常见的问题。
现在很多都是前后端分离的项目,这会让数据异步加载的问题更加突出,所以在爬取的时候遇到这样的问题不要惊讶,不要慌。一般来说,这种问题有两种解决方案:
1、内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,这样我们就可以拿到js渲染出来的页面,这样我们就和采集的静态页面一样了。这种常用的工具有三种:-Selenium-HtmlUnit-PhantomJs
这些工具可以帮助我们解决异步数据加载的问题,但是它们都有缺点,就是效率低下,不稳定。
2、逆向分析法
什么是逆向分析?我们js渲染页面的数据是通过ajax从后端获取的,我们只需要找到对应的ajax请求连接就可以了,这样我们就得到了我们需要的数据,逆向分析方法的优点是这种方式得到的数据都是json格式的,解析起来也比较方便。另一个优点是界面变化的概率相对于页面来说更小。它也有两个缺点。一是在使用Ajax的时候需要耐心和熟练,因为需要在大的推送请求中找到自己想要的东西,二是对JavaScript渲染的页面无能为力。
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用,我以采集网易新闻为例。网易新闻地址:. 使用两种申诉方式获取网易新闻的新闻列表。网易新闻如下:

内置浏览器Selenium方式
Selenium 是一种模拟浏览器进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核进行交互。常用于自动化测试,常用于解决爬虫时的异步加载。如果我们想在项目中使用Selenium,需要做两件事:-1、 在pom.xml中引入Selenium的依赖包添加到
org.seleniumhq.selenium
selenium-java
3.141.59
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
完成以上两步后,我们就可以编写和使用Selenium采集网易新闻了。具体代码如下:
/**
* selenium 解决数据异步加载问题
* https://npm.taobao.org/mirrors/chromedriver/
*
* @param url
*/
public void selenium(String url) {
// 设置 chromedirver 的存放位置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 设置无头浏览器,这样就不会弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
// 获取到要闻新闻列表
List webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
for (WebElement webElement : webElements) {
// 提取新闻连接
String article_url = webElement.getAttribute("href");
// 提取新闻标题
String title = webElement.getText();
if (article_url.contains("https://news.163.com/")) {
System.out.println("文章标题:" + title + " ,文章链接:" + article_url);
}
}
webDriver.close();
}
运行此方法并得到以下结果:

我们已经使用Selenium正确提取了网易新闻列表。
逆向分析
逆向分析的方法是通过ajax异步获取链接获取数据,直接获取新闻数据。如果没有技巧,找Ajax的过程会很痛苦,因为一个页面加载的链接太多,看看网易新闻的网络:

有数百个请求,我如何找到哪个请求获取新闻数据?如果不嫌麻烦,可以一一上点。你绝对可以找到它们。另一种快速的方法是使用网络的搜索功能。如果你不知道搜索按钮,我在上图中圈出了它。只需在新闻中复制一个新闻标题,然后搜索,即可得到结果,如下图所示:

这样我们就快速获取到了重要新闻数据的请求链接,链接为:访问链接,查看链接返回的数据,如下图:

从数据上可以看出,我们需要的数据都在这里了,所以我们只需要解析这一段数据。从这条数据中解析新闻标题和新闻链接有两种方式,一种是正则表达式,另一种是将数据转成json或者list。这里我选择第二种方法,使用fastjson将返回的数据转换成JSONArray。所以我们要引入fastjson,并在pom.xml中引入fastjson依赖:
com.alibaba
fastjson
1.2.59
除了引入fastjson依赖之外,我们还需要对转换前的数据进行简单的处理,因为当前数据不符合list的格式,需要去掉data_callback(也是最后一个)。获取网易新闻的具体逆向分析代码如下:
<p>/**
* 使用反向解析法 解决数据异步加载的问题
*
* @param url
*/
public void httpclientMethod(String url) throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "GBK");
// 先替换掉最前面的 data_callback(
body = body.replace("data_callback(", "");
// 过滤掉最后面一个 )右括号
body = body.substring(0, body.lastIndexOf(")"));
// 将 body 转换成 JSONArray
JSONArray jsonArray = JSON.parseArray(body);
for (int i = 0; i
java爬虫抓取动态网页(如何编写爬虫程序爬取网络上有价值的数据信息?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-10-18 19:11
随着互联网+时代的到来,越来越多的互联网公司层出不穷,涉及游戏、视频、新闻、社交、电子商务、房地产、旅游等众多行业。现在互联网已经成为海量信息的载体,如何有效地从中提取有价值的信息并加以利用成为一个巨大的挑战
爬虫这个可怕的怪物,自百度、谷歌等搜索引擎公司诞生以来就一直存在。如今,爬虫在移动互联网时代更加猖獗。每一个网站好像都被它光顾过,看看就知道了。不会,但您可以放心,它不会做坏事。网上能快速查到的信息,应该就是它的功劳了。每天都会被屏蔽采集 网上丰富的信息供大家查询和分享。Java作为互联网开发的主流语言,广泛应用于互联网领域。本课程使用java技术讲解如何编写爬虫程序来爬取互联网上有价值的数据信息。
知识点1.爬虫介绍
当我们访问某个网页时,在地址栏中输入 URL 并按 Enter。网站服务器会返回一个HTML文件给我们,浏览器会解析返回的数据并显示在UI上。同样,爬虫程序也模仿人类操作。向网站发送请求,网站会返回一个HTML文件给爬虫程序,爬虫程序会对返回的数据进行爬取和分析。
1.1 爬虫简介
网络爬虫(Web crawler),又称网络蜘蛛(自动索引器),是一种“自动浏览网页”的程序,或者说是一种网络机器人。
爬虫广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。他们可以自动采集搜索引擎进一步处理他们可以访问的页面的所有内容(对下载的页面进行排序和排序),以便用户可以更快地检索到他们需要的信息。
通俗地说,就是用程序手动打开窗口,输入数据等等。使用程序为你获取你想要的信息,这是一个网络爬虫
1.2个爬虫应用1.2.1个搜索引擎
爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上所有需要的资源。搜索引擎是一个非常庞大而复杂的算法系统。搜索的准确性和效率对搜索系统有很高的要求。
1.2.2 数据挖掘
除了用于搜索之外,爬虫还可以做很多工作。可以说,爬虫现在在互联网项目中得到了广泛的应用。
互联网项目主要通过爬取相关数据进行数据分析,获取价值数据。那么爬虫就可以具体做那个分析了,下面可以简单的理解一下:
App下载量分析1.3 Crawler的原理1.3.1 Crawler的目的
一般来说,我们需要抓取的是某个网站或者某个应用的内容,提取有用的价值,进行数据分析。
1.3.2 履带框架设计
为方便开发,也可以在项目中使用爬虫框架开发爬虫;一个通用的网络爬虫的框架如图所示:
网络爬虫的基本工作流程如下:
首先从精心挑选的种子网址中选取一部分,将这些网址放入待抓取的网址队列中。从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页。存储在下载的网页库中。另外,将这些URL放入已爬取的URL队列,对已爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入URL队列进行爬取,从而进入下一个循环2. Java爬虫框架2.1 Nutch
Nutch 是一个分布式爬虫。爬虫使用分布式爬虫解决两个问题:1)海量URL管理;2) 网速。如果你想做一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与solr 或es 合作组成了非常强大的搜索引擎,否则尽量不要选择Nutch 作为爬虫。用Nutch做爬虫的二次开发,爬虫的准备和调试时间往往是单机爬虫的十倍以上。
2.2 Heritrix
Heritrix 是一个“档案爬虫”——获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。爬虫主要通过Web用户界面启动、监控和调整,可以灵活定义获取URL。
2.3 crawler4j
crawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
2.4 WebCollector
WebCollector 使用Nutch 的爬虫逻辑(分层广度遍历)、Crawler4j 的用户界面(涵盖访问方法、定义用户操作),以及一套自己的插件机制来设计一个爬虫内核。
2.5 WebMagic
WebMagic 项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则收录了一些方便实用的功能。WebMagic 的架构设计参考了 Scrapy,目标是尽可能模块化,体现爬虫的功能特性。 查看全部
java爬虫抓取动态网页(如何编写爬虫程序爬取网络上有价值的数据信息?)
随着互联网+时代的到来,越来越多的互联网公司层出不穷,涉及游戏、视频、新闻、社交、电子商务、房地产、旅游等众多行业。现在互联网已经成为海量信息的载体,如何有效地从中提取有价值的信息并加以利用成为一个巨大的挑战
爬虫这个可怕的怪物,自百度、谷歌等搜索引擎公司诞生以来就一直存在。如今,爬虫在移动互联网时代更加猖獗。每一个网站好像都被它光顾过,看看就知道了。不会,但您可以放心,它不会做坏事。网上能快速查到的信息,应该就是它的功劳了。每天都会被屏蔽采集 网上丰富的信息供大家查询和分享。Java作为互联网开发的主流语言,广泛应用于互联网领域。本课程使用java技术讲解如何编写爬虫程序来爬取互联网上有价值的数据信息。
知识点1.爬虫介绍
当我们访问某个网页时,在地址栏中输入 URL 并按 Enter。网站服务器会返回一个HTML文件给我们,浏览器会解析返回的数据并显示在UI上。同样,爬虫程序也模仿人类操作。向网站发送请求,网站会返回一个HTML文件给爬虫程序,爬虫程序会对返回的数据进行爬取和分析。

1.1 爬虫简介
网络爬虫(Web crawler),又称网络蜘蛛(自动索引器),是一种“自动浏览网页”的程序,或者说是一种网络机器人。
爬虫广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。他们可以自动采集搜索引擎进一步处理他们可以访问的页面的所有内容(对下载的页面进行排序和排序),以便用户可以更快地检索到他们需要的信息。
通俗地说,就是用程序手动打开窗口,输入数据等等。使用程序为你获取你想要的信息,这是一个网络爬虫
1.2个爬虫应用1.2.1个搜索引擎
爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上所有需要的资源。搜索引擎是一个非常庞大而复杂的算法系统。搜索的准确性和效率对搜索系统有很高的要求。

1.2.2 数据挖掘

除了用于搜索之外,爬虫还可以做很多工作。可以说,爬虫现在在互联网项目中得到了广泛的应用。
互联网项目主要通过爬取相关数据进行数据分析,获取价值数据。那么爬虫就可以具体做那个分析了,下面可以简单的理解一下:
App下载量分析1.3 Crawler的原理1.3.1 Crawler的目的
一般来说,我们需要抓取的是某个网站或者某个应用的内容,提取有用的价值,进行数据分析。
1.3.2 履带框架设计
为方便开发,也可以在项目中使用爬虫框架开发爬虫;一个通用的网络爬虫的框架如图所示:
网络爬虫的基本工作流程如下:
首先从精心挑选的种子网址中选取一部分,将这些网址放入待抓取的网址队列中。从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页。存储在下载的网页库中。另外,将这些URL放入已爬取的URL队列,对已爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入URL队列进行爬取,从而进入下一个循环2. Java爬虫框架2.1 Nutch
Nutch 是一个分布式爬虫。爬虫使用分布式爬虫解决两个问题:1)海量URL管理;2) 网速。如果你想做一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与solr 或es 合作组成了非常强大的搜索引擎,否则尽量不要选择Nutch 作为爬虫。用Nutch做爬虫的二次开发,爬虫的准备和调试时间往往是单机爬虫的十倍以上。
2.2 Heritrix
Heritrix 是一个“档案爬虫”——获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。爬虫主要通过Web用户界面启动、监控和调整,可以灵活定义获取URL。
2.3 crawler4j
crawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
2.4 WebCollector
WebCollector 使用Nutch 的爬虫逻辑(分层广度遍历)、Crawler4j 的用户界面(涵盖访问方法、定义用户操作),以及一套自己的插件机制来设计一个爬虫内核。
2.5 WebMagic
WebMagic 项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则收录了一些方便实用的功能。WebMagic 的架构设计参考了 Scrapy,目标是尽可能模块化,体现爬虫的功能特性。
java爬虫抓取动态网页(GitHub上有哪些优秀的Java爬虫项目?这些项目来自github和开源中国 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-10-18 06:07
)
本文文章来自我的回答:GitHub上有哪些优秀的Java爬虫项目?但是在这个答案中,进行了一些更改并添加了一些项目。这些项目来自github和开源中国。希望这些开源的Java爬虫项目对大家有所帮助。阅读源代码可以帮助您获得质的提升。
1、格科
github地址:xtuhcy/gecco
Gecco是一个用java语言开发的轻量级易用的网络爬虫。集成了jsoup、httpclient、fastjson、spring、htmlunit、redission等框架,只需要配置一些jquery风格的选择器即可快速编写爬虫。Gecco 框架具有出色的可扩展性。框架基于开闭原则设计,对修改封闭,对扩展开放。
2、WebCollector
github地址:CrawlScript/WebCollector
WebCollector是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,用少量的代码就可以实现强大的爬虫。WebCollector-Hadoop 是WebCollector 的Hadoop 版本,支持分布式爬取。
3、蜘蛛侠
码云地址:l-weiwei/Spiderman2-码云-开源中国
用例:展示垂直爬虫的能力——像风一样自由
蜘蛛侠是一个基于微内核+插件架构的网络蜘蛛。它的目标是将复杂的目标网页信息以简单的方式捕获并解析成它需要的业务数据。
4、WebMagic
码云地址:flashsword20/webmagic-码云-中国开源
webmagic是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。
5、Heritrix
Github 地址:internetarchive/heritrix3Heritrix 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循 robots.txt 文件和 META 机器人标签的排除说明。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。
6、crawler4j
GitHub 地址:yasserg/crawler4j · GitHubcrawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
7、纳奇
github地址:apache/nutch
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
在 Nutch 的发展过程中,产生了四个 Java 开源项目,Hadoop、Tika、Gora 和 Crawler Commons。现在这四个项目发展迅速,非常火爆,尤其是Hadoop,已经成为大规模数据处理的事实标准。Tika 使用各种现有的开源内容分析项目从多种格式的文件中提取元数据和结构化文本。Gora 支持将大数据持久化到多个存储实现。Crawler Commons 是一个通用的网络爬虫组件。.
8、SeimiCrawler
github地址:zhegexiaohuozi/SeimiCrawler
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 的灵感来自于 Python 的爬虫框架 Scrapy,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler 的默认 HTML 解析器是 JsoupXpath(独立扩展项目,不收录在 jsoup 中),HTML 数据的默认解析和提取是使用 XPath 完成的(当然,您也可以选择其他解析器进行数据处理)。并结合SeimiAgent,彻底解决复杂的动态页面渲染和爬取问题。
9、Jsoup
github地址:jhy/jsoup
中文指南:jsoup开发指南、jsoup中文文档
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
查看全部
java爬虫抓取动态网页(GitHub上有哪些优秀的Java爬虫项目?这些项目来自github和开源中国
)
本文文章来自我的回答:GitHub上有哪些优秀的Java爬虫项目?但是在这个答案中,进行了一些更改并添加了一些项目。这些项目来自github和开源中国。希望这些开源的Java爬虫项目对大家有所帮助。阅读源代码可以帮助您获得质的提升。
1、格科
github地址:xtuhcy/gecco
Gecco是一个用java语言开发的轻量级易用的网络爬虫。集成了jsoup、httpclient、fastjson、spring、htmlunit、redission等框架,只需要配置一些jquery风格的选择器即可快速编写爬虫。Gecco 框架具有出色的可扩展性。框架基于开闭原则设计,对修改封闭,对扩展开放。
2、WebCollector
github地址:CrawlScript/WebCollector
WebCollector是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,用少量的代码就可以实现强大的爬虫。WebCollector-Hadoop 是WebCollector 的Hadoop 版本,支持分布式爬取。

3、蜘蛛侠
码云地址:l-weiwei/Spiderman2-码云-开源中国
用例:展示垂直爬虫的能力——像风一样自由
蜘蛛侠是一个基于微内核+插件架构的网络蜘蛛。它的目标是将复杂的目标网页信息以简单的方式捕获并解析成它需要的业务数据。
4、WebMagic
码云地址:flashsword20/webmagic-码云-中国开源
webmagic是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。

5、Heritrix
Github 地址:internetarchive/heritrix3Heritrix 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循 robots.txt 文件和 META 机器人标签的排除说明。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。

6、crawler4j
GitHub 地址:yasserg/crawler4j · GitHubcrawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
7、纳奇
github地址:apache/nutch
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
在 Nutch 的发展过程中,产生了四个 Java 开源项目,Hadoop、Tika、Gora 和 Crawler Commons。现在这四个项目发展迅速,非常火爆,尤其是Hadoop,已经成为大规模数据处理的事实标准。Tika 使用各种现有的开源内容分析项目从多种格式的文件中提取元数据和结构化文本。Gora 支持将大数据持久化到多个存储实现。Crawler Commons 是一个通用的网络爬虫组件。.
8、SeimiCrawler
github地址:zhegexiaohuozi/SeimiCrawler
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 的灵感来自于 Python 的爬虫框架 Scrapy,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler 的默认 HTML 解析器是 JsoupXpath(独立扩展项目,不收录在 jsoup 中),HTML 数据的默认解析和提取是使用 XPath 完成的(当然,您也可以选择其他解析器进行数据处理)。并结合SeimiAgent,彻底解决复杂的动态页面渲染和爬取问题。


9、Jsoup
github地址:jhy/jsoup
中文指南:jsoup开发指南、jsoup中文文档
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。

java爬虫抓取动态网页(这是移动端微博信息_selenium_sina__)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-18 05:13
这是一个新浪微博爬虫,使用python+selenium实现。免费资源,希望对你有帮助,虽然是傻瓜式爬虫,但至少能跑。同时在rar中收录了源代码和爬取示例。参考我的文章:【python爬虫】Selenium爬取新浪微博内容和用户信息【python爬虫】Selenium爬取新浪微博客户端用户信息、热点话题和评论(上) 主要爬取内容包括:新浪微博手机用户信息和微博信息。用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等安装过程:1. 先安装Python环境,作者是Python2.7.82.然后安装pip或者easy_install3.通过命令pip install selenium来安装selenium,是一个自动测试爬取工具4.然后修改代码中的用户名和密码,填写自己的用户名和密码5.运行程序,自动调用火狐浏览器登录到微博。注:手机信息更精致简洁,动态加载没有限制,只是显示微博或粉丝id等20个页面,这是它的缺点;虽然客户端可能有动态加载,比如评论和微博,但它的信息更完整。【源码】爬取手机微博信息spider_selenium_sina_content.py 输入: 查看全部
java爬虫抓取动态网页(这是移动端微博信息_selenium_sina__)
这是一个新浪微博爬虫,使用python+selenium实现。免费资源,希望对你有帮助,虽然是傻瓜式爬虫,但至少能跑。同时在rar中收录了源代码和爬取示例。参考我的文章:【python爬虫】Selenium爬取新浪微博内容和用户信息【python爬虫】Selenium爬取新浪微博客户端用户信息、热点话题和评论(上) 主要爬取内容包括:新浪微博手机用户信息和微博信息。用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等安装过程:1. 先安装Python环境,作者是Python2.7.82.然后安装pip或者easy_install3.通过命令pip install selenium来安装selenium,是一个自动测试爬取工具4.然后修改代码中的用户名和密码,填写自己的用户名和密码5.运行程序,自动调用火狐浏览器登录到微博。注:手机信息更精致简洁,动态加载没有限制,只是显示微博或粉丝id等20个页面,这是它的缺点;虽然客户端可能有动态加载,比如评论和微博,但它的信息更完整。【源码】爬取手机微博信息spider_selenium_sina_content.py 输入:
java爬虫抓取动态网页(技术公开了基于Ajax的新闻网页动态数据的抓取方法及系统)
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2021-10-18 05:07
本发明专利技术公开了一种基于Ajax的新闻网页动态数据抓取方法及系统;建立新闻网页抓取内容库,设置新闻网页抓取内容库的编码方式;获取待抓取新闻网页的新闻列表页的URL地址信息;访问URL地址,判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具找到请求的数据源;判断请求的数据源的编码是否一致,如果不一致,则对数据源进行编码转换,解析数据格式:将数据源的格式解析为消息的后台语言处理的对象格式或数组格式列表页面;将解析后的数据封装成对象或数组类型;判断是否封装成功,成功只需遍历数据对象或数组类型的输出列表;使用网络爬虫获取的输出列表采集;将采集收到的数据存入数据库。
基于Ajax的新闻网页动态数据抓取方法及系统
本发明公开了一种基于Ajax的动态新闻网络爬取数据的系统及方法;建立新闻网络爬取内容库,设置新闻网络爬取内容库编码;用于抓取新闻网页新闻页面的地址 URL;访问URL地址,判断新闻页面是否是通过Ajax数据的动态加载;如果是,通过浏览器开发者工具找到请求的数据源;判断请求数据源编码是否一致,如果不一致,则进行数据源编码转换,分析数据格式:格式数据源成为后台语言处理对象格式或数组数据格式的新闻页面;分析对象或数组类型判断后的包;打包成功,成功将数据对象或数组类型 爬虫采集的输出列表,
下载所有详细的技术数据
【技术实现步骤总结】
本专利技术涉及一种基于Ajax的新闻网页动态数据捕获方法及系统。
技术介绍
目前,新闻网站的信息具有类别多、更新频率快、多平台发布的特点,数据检索方式也非常灵活。很多新闻网站页面使用ajax来调用数据,这样通过一个数据源就可以在不同的平台上进行解析。例如,PC 网页和移动网页可以通过不同的模板共享数据请求。呈现不同的排版风格。在采集爬取网站新闻数据,会发现很多网站数据是通过ajax获取的动态内容,并没有固定的静态模板。获取数据的 JavaScript 脚本程序往往在整个页面的 DOM 结构加载完毕后执行。如果整个网页的 DOM 结构还没有被加载,网络爬虫在访问这个地方时不会获取数据内容,大大降低了网络数据的效率和质量采集。如果需要获取通过ajax请求动态加载的数据,则需要分析网站的请求的数据源地址。Ajax调用的数据格式多为JSON、JSONP、XML或Inc。经过分析,不同的网站使用不同的网络技术,因此调用Ajax请求时采用的方案也有很大差异,数据源存储格式也是多种多样的。通过对现有技术的分析,发现目前还没有统一的自动化的Ajax数据源分析方法,现有的方法不能解决Ajax一次性获取动态内容的所有问题。
首先,大部分的实现方法还是通过JavaScript脚本中的特征值进行检索,从而进一步猜测和推断Ajax请求的内容。但是,这并不能准确地找出您要采集 的目标数据。目前一个页面很可能收录多个ajax请求,有的是用户信息认证请求,有的是订阅信息的返回数据,有的是广告推送信息。这些信息混杂在一起,仅通过脚本代码中的特征值很难区分哪些数据源需要采集。另外,脚本代码的特征值分析也仅限于JavaScript代码未加密的情况。如今,许多网站出于安全性和访问效率的要求,可能会组合多个JavaScript脚本文件,然后对其进行加密。它会使现有的特征值消失。其次,Ajax调用方法本身会存在跨域问题,这是其自身独有的安全机制。即不在同一个域名下,脚本语言仍然无法成功执行请求并返回数据。在处理这样的调用方式时,由于没有统一域名下的网络环境,很难自动完成Ajax触发请求。也有一些网站在他们的程序中有反爬虫程序。如果经常被访问,二维码等内容会阻止新闻数据的继续采集。最后,即使找到了 Ajax 请求的数据源,仍然会出现格式和编码不匹配的情况。例如,JAVA 语言生成的 JSON 数据不能直接用 PHP 语言处理。一些返回的数据在 JSON 格式本身中会有英文双引号和符号冲突。也有一些请求使用JSONP请求方式,即带有请求头的JSON格式。
技术实现思路
本专利技术的目的是为了解决上述问题,提供一种基于Ajax的新闻网页动态数据捕获方法和系统。专注于数据源的战略分析,针对不同情况采用定制化解决方案。为实现上述目的,本专利技术采用如下技术方案: 基于Ajax的新闻网页动态数据抓取方法,包括以下步骤: 步骤(101):建立新闻网页抓取内容数据库,并设置新闻网页爬取获取内容库的编码方式;获取要爬取的新闻页面的新闻列表页面的URL地址;步骤(102):访问新闻的URL地址要抓取的新闻页面的列表页面,通过浏览器开发者工具判断新闻列表页面是否通过Ajax动态加载;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果没有,结束;step (103): 判断Ajax请求的数据源是否与步骤(101))的编码方式一致。如果不一致,则对数据源进行编码转换,然后去step(104);如果一致,直接进入step(104); Step(104):解析数据格式:将数据源的格式解析成对象新闻列表页面后台语言处理的格式或数组格式; Step (105): Change step (10 4) 将解析的数据封装成对象或数组类型;判断封装是否为成功的,
特殊字符或乱码批量替换,转换为可处理的字符。特殊字符包括:斜线、反斜线、冒号、星号、问号、引号、大于号、小于号或可能影响 JSON 格式的管道符号。可处理的字符包括中文引号、中文逗号、中文冒号等。 步骤(103):如果编码方式不同,则统一编码方式,UTF-8的编码方式步骤(102)和步骤(103))之间设置步骤如下: 步骤(1020):如果Ajax请求是跨域的请求,通过PHP的CURL方式模拟传入页面,通过主机获取请求数据地址;
如果返回的内容收录中英文单引号,如果双引号不规范,使用PHP语言的字符替换功能过滤特殊字符,替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。
由于上述原因,需要去除返回内容的请求头和括号。步骤(1043): 因为有些特殊字符会影响格式规范,有些特殊字符无法识别,所以在封装数据之前,要对这些特殊字符进行处理,即批量替换。空字符。步骤(105):如果步骤(104))解析的数据不是键值对类型,那么步骤(104))解析的数据将封装成data对象,如果步骤(104)中解析的数据是键值对类型,则步骤(104))解析的数据
【技术保护点】
@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(10 6):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(106):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。
【技术特点摘要】
1.一种基于Ajax的新闻网页动态数据抓取方法,其特点是如下步骤: 步骤(101):建立新闻网页爬取内容库,建立新闻网页爬取内容库编码方法; 获取待抓取新闻页面的新闻列表页面的URL地址; 步骤(102):访问待抓取新闻页面的新闻列表页面的URL地址,使用浏览器开发者工具判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具查找ajax请求的数据源;如果不是,则结束;步骤(103):确定ajax请求的数据源和步骤(10)1)的编码方式是否一致,如果不一致,对数据源进行编码转换,然后转步骤(104);如果一致,直接转步骤(104);步骤(104):分析数据)格式:将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;步骤(105):更改步骤(104)将解析的数据封装转化为对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106);否则,将数据作为字符串处理;完成后,进入步骤(106)) @)>; Step(106):遍历数据对象或数组类型输出列表; Step(107):使用网络爬虫采集 Step(106)@ > 获取输出列表;步骤 (108):将来自 采集 的数据存储在数据库中。
2.如权利要求1所述的基于Ajax的新闻网页动态数据抓取方法,其特征在于步骤(101)URL地址包括临时URL地址和重定向地址,需要添加时间戳参数或签名参数后访问的URL地址;步骤(101))的新闻网络爬取内容库的字段包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源和新闻内容;所述步骤(101))的新闻网页抓取的内容数据库的编码方法包括:UTF-8编码或GBK编码。3.如权利要求1所述的动态抓取方法基于Ajax的新闻网页数据特征在于步骤(102)的浏览器开发工具包括:谷歌Chrome开发工具。4.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于步骤(103)如果Ajax请求的数据源中存在特殊字符或乱码5.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于,步骤(10) 3):如果编码方式不同,则统一编码方式,统一采用UTF-8编码方式。 2.权利要求1,其特征在于步骤(102)与步骤(103))之间的步骤如下:步骤(1020):如果Ajax请求是跨域请求,通过PHP的CURL方法模拟传入页面,通过host获取请求的数据地址;步骤(1021):如果Ajax 请求是 P...
【专利技术属性】
技术研发人员:张紫阳、韩强、梁成富、李广庆、李斌、
申请人(专利权):,
类型:发明
国家省市:山东;37
下载所有详细技术资料 我是此专利的所有者 查看全部
java爬虫抓取动态网页(技术公开了基于Ajax的新闻网页动态数据的抓取方法及系统)
本发明专利技术公开了一种基于Ajax的新闻网页动态数据抓取方法及系统;建立新闻网页抓取内容库,设置新闻网页抓取内容库的编码方式;获取待抓取新闻网页的新闻列表页的URL地址信息;访问URL地址,判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具找到请求的数据源;判断请求的数据源的编码是否一致,如果不一致,则对数据源进行编码转换,解析数据格式:将数据源的格式解析为消息的后台语言处理的对象格式或数组格式列表页面;将解析后的数据封装成对象或数组类型;判断是否封装成功,成功只需遍历数据对象或数组类型的输出列表;使用网络爬虫获取的输出列表采集;将采集收到的数据存入数据库。
基于Ajax的新闻网页动态数据抓取方法及系统
本发明公开了一种基于Ajax的动态新闻网络爬取数据的系统及方法;建立新闻网络爬取内容库,设置新闻网络爬取内容库编码;用于抓取新闻网页新闻页面的地址 URL;访问URL地址,判断新闻页面是否是通过Ajax数据的动态加载;如果是,通过浏览器开发者工具找到请求的数据源;判断请求数据源编码是否一致,如果不一致,则进行数据源编码转换,分析数据格式:格式数据源成为后台语言处理对象格式或数组数据格式的新闻页面;分析对象或数组类型判断后的包;打包成功,成功将数据对象或数组类型 爬虫采集的输出列表,
下载所有详细的技术数据
【技术实现步骤总结】
本专利技术涉及一种基于Ajax的新闻网页动态数据捕获方法及系统。
技术介绍
目前,新闻网站的信息具有类别多、更新频率快、多平台发布的特点,数据检索方式也非常灵活。很多新闻网站页面使用ajax来调用数据,这样通过一个数据源就可以在不同的平台上进行解析。例如,PC 网页和移动网页可以通过不同的模板共享数据请求。呈现不同的排版风格。在采集爬取网站新闻数据,会发现很多网站数据是通过ajax获取的动态内容,并没有固定的静态模板。获取数据的 JavaScript 脚本程序往往在整个页面的 DOM 结构加载完毕后执行。如果整个网页的 DOM 结构还没有被加载,网络爬虫在访问这个地方时不会获取数据内容,大大降低了网络数据的效率和质量采集。如果需要获取通过ajax请求动态加载的数据,则需要分析网站的请求的数据源地址。Ajax调用的数据格式多为JSON、JSONP、XML或Inc。经过分析,不同的网站使用不同的网络技术,因此调用Ajax请求时采用的方案也有很大差异,数据源存储格式也是多种多样的。通过对现有技术的分析,发现目前还没有统一的自动化的Ajax数据源分析方法,现有的方法不能解决Ajax一次性获取动态内容的所有问题。
首先,大部分的实现方法还是通过JavaScript脚本中的特征值进行检索,从而进一步猜测和推断Ajax请求的内容。但是,这并不能准确地找出您要采集 的目标数据。目前一个页面很可能收录多个ajax请求,有的是用户信息认证请求,有的是订阅信息的返回数据,有的是广告推送信息。这些信息混杂在一起,仅通过脚本代码中的特征值很难区分哪些数据源需要采集。另外,脚本代码的特征值分析也仅限于JavaScript代码未加密的情况。如今,许多网站出于安全性和访问效率的要求,可能会组合多个JavaScript脚本文件,然后对其进行加密。它会使现有的特征值消失。其次,Ajax调用方法本身会存在跨域问题,这是其自身独有的安全机制。即不在同一个域名下,脚本语言仍然无法成功执行请求并返回数据。在处理这样的调用方式时,由于没有统一域名下的网络环境,很难自动完成Ajax触发请求。也有一些网站在他们的程序中有反爬虫程序。如果经常被访问,二维码等内容会阻止新闻数据的继续采集。最后,即使找到了 Ajax 请求的数据源,仍然会出现格式和编码不匹配的情况。例如,JAVA 语言生成的 JSON 数据不能直接用 PHP 语言处理。一些返回的数据在 JSON 格式本身中会有英文双引号和符号冲突。也有一些请求使用JSONP请求方式,即带有请求头的JSON格式。
技术实现思路
本专利技术的目的是为了解决上述问题,提供一种基于Ajax的新闻网页动态数据捕获方法和系统。专注于数据源的战略分析,针对不同情况采用定制化解决方案。为实现上述目的,本专利技术采用如下技术方案: 基于Ajax的新闻网页动态数据抓取方法,包括以下步骤: 步骤(101):建立新闻网页抓取内容数据库,并设置新闻网页爬取获取内容库的编码方式;获取要爬取的新闻页面的新闻列表页面的URL地址;步骤(102):访问新闻的URL地址要抓取的新闻页面的列表页面,通过浏览器开发者工具判断新闻列表页面是否通过Ajax动态加载;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果没有,结束;step (103): 判断Ajax请求的数据源是否与步骤(101))的编码方式一致。如果不一致,则对数据源进行编码转换,然后去step(104);如果一致,直接进入step(104); Step(104):解析数据格式:将数据源的格式解析成对象新闻列表页面后台语言处理的格式或数组格式; Step (105): Change step (10 4) 将解析的数据封装成对象或数组类型;判断封装是否为成功的,
特殊字符或乱码批量替换,转换为可处理的字符。特殊字符包括:斜线、反斜线、冒号、星号、问号、引号、大于号、小于号或可能影响 JSON 格式的管道符号。可处理的字符包括中文引号、中文逗号、中文冒号等。 步骤(103):如果编码方式不同,则统一编码方式,UTF-8的编码方式步骤(102)和步骤(103))之间设置步骤如下: 步骤(1020):如果Ajax请求是跨域的请求,通过PHP的CURL方式模拟传入页面,通过主机获取请求数据地址;
如果返回的内容收录中英文单引号,如果双引号不规范,使用PHP语言的字符替换功能过滤特殊字符,替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。
由于上述原因,需要去除返回内容的请求头和括号。步骤(1043): 因为有些特殊字符会影响格式规范,有些特殊字符无法识别,所以在封装数据之前,要对这些特殊字符进行处理,即批量替换。空字符。步骤(105):如果步骤(104))解析的数据不是键值对类型,那么步骤(104))解析的数据将封装成data对象,如果步骤(104)中解析的数据是键值对类型,则步骤(104))解析的数据

【技术保护点】
@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(10 6):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(106):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。
【技术特点摘要】
1.一种基于Ajax的新闻网页动态数据抓取方法,其特点是如下步骤: 步骤(101):建立新闻网页爬取内容库,建立新闻网页爬取内容库编码方法; 获取待抓取新闻页面的新闻列表页面的URL地址; 步骤(102):访问待抓取新闻页面的新闻列表页面的URL地址,使用浏览器开发者工具判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具查找ajax请求的数据源;如果不是,则结束;步骤(103):确定ajax请求的数据源和步骤(10)1)的编码方式是否一致,如果不一致,对数据源进行编码转换,然后转步骤(104);如果一致,直接转步骤(104);步骤(104):分析数据)格式:将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;步骤(105):更改步骤(104)将解析的数据封装转化为对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106);否则,将数据作为字符串处理;完成后,进入步骤(106)) @)>; Step(106):遍历数据对象或数组类型输出列表; Step(107):使用网络爬虫采集 Step(106)@ > 获取输出列表;步骤 (108):将来自 采集 的数据存储在数据库中。
2.如权利要求1所述的基于Ajax的新闻网页动态数据抓取方法,其特征在于步骤(101)URL地址包括临时URL地址和重定向地址,需要添加时间戳参数或签名参数后访问的URL地址;步骤(101))的新闻网络爬取内容库的字段包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源和新闻内容;所述步骤(101))的新闻网页抓取的内容数据库的编码方法包括:UTF-8编码或GBK编码。3.如权利要求1所述的动态抓取方法基于Ajax的新闻网页数据特征在于步骤(102)的浏览器开发工具包括:谷歌Chrome开发工具。4.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于步骤(103)如果Ajax请求的数据源中存在特殊字符或乱码5.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于,步骤(10) 3):如果编码方式不同,则统一编码方式,统一采用UTF-8编码方式。 2.权利要求1,其特征在于步骤(102)与步骤(103))之间的步骤如下:步骤(1020):如果Ajax请求是跨域请求,通过PHP的CURL方法模拟传入页面,通过host获取请求的数据地址;步骤(1021):如果Ajax 请求是 P...
【专利技术属性】
技术研发人员:张紫阳、韩强、梁成富、李广庆、李斌、
申请人(专利权):,
类型:发明
国家省市:山东;37
下载所有详细技术资料 我是此专利的所有者
java爬虫抓取动态网页(网络爬虫又称网络蜘蛛、网络机器人的区别及应用方法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2021-10-16 03:32
网络爬虫也被称为网络蜘蛛和网络机器人。它们是按照一定的规则自动浏览和检索网页信息的程序或脚本。网络爬虫可以自动请求网页并抓取所需的数据。通过处理捕获的数据,可以提取有价值的信息。
认识爬行动物
我们熟悉的一系列搜索引擎都是大型网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都有自己的爬虫程序。比如360浏览器的爬虫叫360Spider,搜狗的爬虫叫Sogouspider。
百度搜索引擎其实可以更形象地称为百度蜘蛛(Baiduspider),它每天从互联网海量信息中抓取优质信息,进行收录。当用户通过百度搜索关键词时,百度会先分析用户输入的关键词,然后从收录的网页中查找相关网页,并对网页进行排名根据排名规则。排序,最后将排序后的结果呈现给用户。在这个过程中,百度蜘蛛起到了非常关键的作用。
百度工程师为“百度蜘蛛”编写了相应的爬取算法。通过应用这些算法,“百度蜘蛛”可以实现相应的搜索策略,例如过滤掉重复的网页和过滤高质量的网页。应用不同的算法,爬虫的运行效率,爬取的结果会有所不同。
履带分类
爬虫可以分为三类:通用网络爬虫、聚焦网络爬虫和增量网络爬虫。
通用网络爬虫:是搜索引擎的重要组成部分。上面已经介绍过了,这里不再赘述。一般的网络爬虫都需要遵守robots协议。网站 通过这个协议告诉搜索引擎哪些页面可以爬取,哪些页面不允许爬取。
机器人协议:是一种称为“协议”的协议,不具有法律效力。它体现了互联网人的“契约精神”。行业从业者会自觉遵守约定,故又称“君子协定”。
专注于网络爬虫:是针对特定需求的网络爬虫程序。它与一般爬虫的区别在于,聚焦爬虫在实现网络爬取时会对网页内容进行过滤和处理,并尽量保证只爬取与需求相关的网页信息。专注于网络爬虫,大大节省了硬件和网络资源。由于保存的页面数量少,更新速度非常快,也满足了某些特定人群对特定领域信息的需求。
增量爬虫:指对下载的网页进行增量更新。它是一个爬虫程序,只爬取新生成或改变的网页,可以保证爬取的页面在一定程度上是最新的页面。
爬虫应用
随着互联网的飞速发展,万维网已经成为海量信息的载体。如何有效地提取和利用这些信息成为一个巨大的挑战。因此,爬虫应运而生。它不仅可以用于搜索引擎领域,还可以用于大数据分析。并在商业领域得到了大规模应用。
1)数据分析
在数据分析领域,网络爬虫通常是采集海量数据必不可少的工具。对于数据分析师来说,要进行数据分析,首先要有数据源,通过学习爬虫,可以得到更多的数据源。在采集的过程中,数据分析师可以根据自己的目的去寻找采集更有价值的数据,过滤掉那些无效的数据。
2)商业领域
对于企业来说,及时获取市场动态和产品信息至关重要。企业可以通过第三方平台购买数据,比如贵阳大数据交易所、数据堂等。当然,如果贵公司有爬虫工程师,可以通过爬虫获取自己想要的信息。
爬虫是一把双刃剑
爬虫是一把双刃剑。在给我们带来便利的同时,也给网络安全带来了隐患。一些不法分子利用爬虫在互联网上非法采集网民信息,或利用爬虫恶意攻击他人网站,造成网站瘫痪的严重后果。关于爬虫的合法使用,建议阅读《中华人民共和国网络安全法》。 查看全部
java爬虫抓取动态网页(网络爬虫又称网络蜘蛛、网络机器人的区别及应用方法)
网络爬虫也被称为网络蜘蛛和网络机器人。它们是按照一定的规则自动浏览和检索网页信息的程序或脚本。网络爬虫可以自动请求网页并抓取所需的数据。通过处理捕获的数据,可以提取有价值的信息。
认识爬行动物
我们熟悉的一系列搜索引擎都是大型网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都有自己的爬虫程序。比如360浏览器的爬虫叫360Spider,搜狗的爬虫叫Sogouspider。
百度搜索引擎其实可以更形象地称为百度蜘蛛(Baiduspider),它每天从互联网海量信息中抓取优质信息,进行收录。当用户通过百度搜索关键词时,百度会先分析用户输入的关键词,然后从收录的网页中查找相关网页,并对网页进行排名根据排名规则。排序,最后将排序后的结果呈现给用户。在这个过程中,百度蜘蛛起到了非常关键的作用。
百度工程师为“百度蜘蛛”编写了相应的爬取算法。通过应用这些算法,“百度蜘蛛”可以实现相应的搜索策略,例如过滤掉重复的网页和过滤高质量的网页。应用不同的算法,爬虫的运行效率,爬取的结果会有所不同。
履带分类
爬虫可以分为三类:通用网络爬虫、聚焦网络爬虫和增量网络爬虫。
通用网络爬虫:是搜索引擎的重要组成部分。上面已经介绍过了,这里不再赘述。一般的网络爬虫都需要遵守robots协议。网站 通过这个协议告诉搜索引擎哪些页面可以爬取,哪些页面不允许爬取。
机器人协议:是一种称为“协议”的协议,不具有法律效力。它体现了互联网人的“契约精神”。行业从业者会自觉遵守约定,故又称“君子协定”。
专注于网络爬虫:是针对特定需求的网络爬虫程序。它与一般爬虫的区别在于,聚焦爬虫在实现网络爬取时会对网页内容进行过滤和处理,并尽量保证只爬取与需求相关的网页信息。专注于网络爬虫,大大节省了硬件和网络资源。由于保存的页面数量少,更新速度非常快,也满足了某些特定人群对特定领域信息的需求。
增量爬虫:指对下载的网页进行增量更新。它是一个爬虫程序,只爬取新生成或改变的网页,可以保证爬取的页面在一定程度上是最新的页面。
爬虫应用
随着互联网的飞速发展,万维网已经成为海量信息的载体。如何有效地提取和利用这些信息成为一个巨大的挑战。因此,爬虫应运而生。它不仅可以用于搜索引擎领域,还可以用于大数据分析。并在商业领域得到了大规模应用。
1)数据分析
在数据分析领域,网络爬虫通常是采集海量数据必不可少的工具。对于数据分析师来说,要进行数据分析,首先要有数据源,通过学习爬虫,可以得到更多的数据源。在采集的过程中,数据分析师可以根据自己的目的去寻找采集更有价值的数据,过滤掉那些无效的数据。
2)商业领域
对于企业来说,及时获取市场动态和产品信息至关重要。企业可以通过第三方平台购买数据,比如贵阳大数据交易所、数据堂等。当然,如果贵公司有爬虫工程师,可以通过爬虫获取自己想要的信息。
爬虫是一把双刃剑
爬虫是一把双刃剑。在给我们带来便利的同时,也给网络安全带来了隐患。一些不法分子利用爬虫在互联网上非法采集网民信息,或利用爬虫恶意攻击他人网站,造成网站瘫痪的严重后果。关于爬虫的合法使用,建议阅读《中华人民共和国网络安全法》。
java爬虫抓取动态网页(爬虫集_零基础入门学习Python学习分三个阶段教程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-15 16:23
学习爬虫需要一定的基础。有编程基础,学习Python爬虫更容易。但是多看多练,有自己的逻辑思路。使用 Python 来实现自己的学习目标是很有价值的。如果是入门学习和理解,上手学习不难,但深入学习就难了,尤其是大项目。
推荐学习课程:Python400集_零基础入门学习Python全教程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,模拟使用浏览器获取网页信息的过程。向服务器发送请求后,您将获得返回的页面。页面解析完成后,就可以提取出我们想要的部分信息,存放在指定的文档或数据库中。爬虫Python入门学习分为三个阶段:
一、零基础阶段:
从零开始学习爬虫,上手系统,从零开始爬。除了必要的理论知识,爬虫比实际应用更重要。带你抓取4种主流网站数据,掌握主流爬虫抓取方法。
捕获主流网站数据的能力是现阶段的学习目标。
学习重点:爬虫所需的计算机网络/前端/常规//xpath/CSS选择器基础知识;实现静态网页和动态网页两种主流网页类型的数据抓取;模拟登录、响应反爬、验证码识别等难点详解;多线程、多进程等常见应用场景详细讲解。
二、主流框架
主流框架Scrapy实现了海量数据的抓取,提升了从原生爬虫到框架的能力。学完之后可以彻底玩转Scrapy框架,开发自己的分布式爬虫系统,完全胜任中级Python工程师的工作。获得高效捕获海量数据的能力。
学习重点:Scrapy框架知识讲解spider/FormRequest/CrawlSpider等;从单机爬虫到分布式爬虫系统讲解;Scrapy 突破了反爬虫的局限性和 Scrapy 的原理;Scrapy 更高级的功能包括scrapy 信号、自定义中间件;一些海量数据结合 Elasticsearch 来创建搜索引擎。
三、爬虫
深度App数据抓取、爬取能力提升,应对App数据抓取和数据可视化的能力不再局限于网络爬虫。从此拓宽您的爬虫业务,提升您的核心竞争力。掌握App数据抓取,实现数据可视化
学习重点:学习主流抓包工具Fiddler/Mitmproxy的应用;4种App数据抓取实战,结合学习与实践,深入掌握App爬取技巧;基于Docker构建多任务爬取系统,提高工作效率;掌握Pyecharts库基础,绘制基本图形、地图等,实现数据可视化。
Crawler Python 应用在很多领域,比如爬取数据、进行市场调研和商业分析;作为机器学习和数据挖掘的原创数据;抓取优质资源:图片、文字、视频。掌握正确的方法很容易就能在短时间内抓取到主流的网站数据。建议从一开始就为爬虫Python入口设定一个具体的目标。只有目标被驱动,学习才会更有效率。 查看全部
java爬虫抓取动态网页(爬虫集_零基础入门学习Python学习分三个阶段教程)
学习爬虫需要一定的基础。有编程基础,学习Python爬虫更容易。但是多看多练,有自己的逻辑思路。使用 Python 来实现自己的学习目标是很有价值的。如果是入门学习和理解,上手学习不难,但深入学习就难了,尤其是大项目。
推荐学习课程:Python400集_零基础入门学习Python全教程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,模拟使用浏览器获取网页信息的过程。向服务器发送请求后,您将获得返回的页面。页面解析完成后,就可以提取出我们想要的部分信息,存放在指定的文档或数据库中。爬虫Python入门学习分为三个阶段:
一、零基础阶段:
从零开始学习爬虫,上手系统,从零开始爬。除了必要的理论知识,爬虫比实际应用更重要。带你抓取4种主流网站数据,掌握主流爬虫抓取方法。
捕获主流网站数据的能力是现阶段的学习目标。
学习重点:爬虫所需的计算机网络/前端/常规//xpath/CSS选择器基础知识;实现静态网页和动态网页两种主流网页类型的数据抓取;模拟登录、响应反爬、验证码识别等难点详解;多线程、多进程等常见应用场景详细讲解。
二、主流框架
主流框架Scrapy实现了海量数据的抓取,提升了从原生爬虫到框架的能力。学完之后可以彻底玩转Scrapy框架,开发自己的分布式爬虫系统,完全胜任中级Python工程师的工作。获得高效捕获海量数据的能力。
学习重点:Scrapy框架知识讲解spider/FormRequest/CrawlSpider等;从单机爬虫到分布式爬虫系统讲解;Scrapy 突破了反爬虫的局限性和 Scrapy 的原理;Scrapy 更高级的功能包括scrapy 信号、自定义中间件;一些海量数据结合 Elasticsearch 来创建搜索引擎。
三、爬虫
深度App数据抓取、爬取能力提升,应对App数据抓取和数据可视化的能力不再局限于网络爬虫。从此拓宽您的爬虫业务,提升您的核心竞争力。掌握App数据抓取,实现数据可视化
学习重点:学习主流抓包工具Fiddler/Mitmproxy的应用;4种App数据抓取实战,结合学习与实践,深入掌握App爬取技巧;基于Docker构建多任务爬取系统,提高工作效率;掌握Pyecharts库基础,绘制基本图形、地图等,实现数据可视化。
Crawler Python 应用在很多领域,比如爬取数据、进行市场调研和商业分析;作为机器学习和数据挖掘的原创数据;抓取优质资源:图片、文字、视频。掌握正确的方法很容易就能在短时间内抓取到主流的网站数据。建议从一开始就为爬虫Python入口设定一个具体的目标。只有目标被驱动,学习才会更有效率。
java爬虫抓取动态网页(一个基于Java的亚马逊图书监控的简单爬虫实现的思路)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-15 16:20
前言:最近有博主买了Kindle,觉得亚马逊上的图书资源质量还不错,不时会有低价优质的图书出售,但限于亚马逊,确实有没有很好的打折提醒功能,所以每天都在看。又累了。于是,我写了一个简单的基于Java的亚马逊图书监控爬虫,只要有特价书,它就会自动发送邮件到指定邮箱。
实现思路
简单说一下实现的思路,本文只讲解思路,如果需要完整的童鞋项目请移至文末
只需封装JavaMail,就可以更轻松地阅读发送电子邮件的配置文件。它用于配置电子邮件发送和监控设置。使用 URL 类返回的 URLConnection 对象访问 网站 并捕获数据。(这里有个小技巧,如果你在访问亚马逊的时候没有在请求头中添加Accept-Encoding: gzip, deflate, br,你会在几次之内被拒绝访问(返回503),添加后说明返回数据经过GZIP压缩,此时需要使用GZIPInputStream读取,否则读取乱码)使用正则表达式对获取的数据进行分析,提取有用信息。发送通知邮件。基本上是函数核心代码
因为只截取了部分代码,内容缺失,思路清晰。
获取亚马逊信息
this.url = new URL("https://www.amazon.cn/gp/bests ... 6quot;);
//打开一个连接
URLConnection connection = this.url.openConnection();
//设置请求头,防止被503
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
connection.setRequestProperty("Host", "www.amazon.cn");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
//发起连接
connection.connect();
//获取数据,因为服务器发过来的数据经过GZIP压缩,要用对应的流进行读取
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(connection.getInputStream()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读数据
while ((len = bis.read(tmp)) != -1) {
baos.write(tmp, 0, len);
}
this.rawData = new String(baos.toByteArray(), "utf8");
bis.close();
有规律地分析数据
//先用正则表达式去取单个li标签
Pattern p1 = Pattern.compile(" price ? price : oldPrice;
}
//将数据放入Map中
this.destData.put(name, new Price(price, new Date()));
}
}
完成项目
我把完整的项目放到了我的Github上,更多细节(如何配置,如何使用),有兴趣的孩子可以去加入我们!
仓库地址: 查看全部
java爬虫抓取动态网页(一个基于Java的亚马逊图书监控的简单爬虫实现的思路)
前言:最近有博主买了Kindle,觉得亚马逊上的图书资源质量还不错,不时会有低价优质的图书出售,但限于亚马逊,确实有没有很好的打折提醒功能,所以每天都在看。又累了。于是,我写了一个简单的基于Java的亚马逊图书监控爬虫,只要有特价书,它就会自动发送邮件到指定邮箱。
实现思路
简单说一下实现的思路,本文只讲解思路,如果需要完整的童鞋项目请移至文末
只需封装JavaMail,就可以更轻松地阅读发送电子邮件的配置文件。它用于配置电子邮件发送和监控设置。使用 URL 类返回的 URLConnection 对象访问 网站 并捕获数据。(这里有个小技巧,如果你在访问亚马逊的时候没有在请求头中添加Accept-Encoding: gzip, deflate, br,你会在几次之内被拒绝访问(返回503),添加后说明返回数据经过GZIP压缩,此时需要使用GZIPInputStream读取,否则读取乱码)使用正则表达式对获取的数据进行分析,提取有用信息。发送通知邮件。基本上是函数核心代码
因为只截取了部分代码,内容缺失,思路清晰。
获取亚马逊信息
this.url = new URL("https://www.amazon.cn/gp/bests ... 6quot;);
//打开一个连接
URLConnection connection = this.url.openConnection();
//设置请求头,防止被503
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
connection.setRequestProperty("Host", "www.amazon.cn");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
//发起连接
connection.connect();
//获取数据,因为服务器发过来的数据经过GZIP压缩,要用对应的流进行读取
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(connection.getInputStream()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读数据
while ((len = bis.read(tmp)) != -1) {
baos.write(tmp, 0, len);
}
this.rawData = new String(baos.toByteArray(), "utf8");
bis.close();
有规律地分析数据
//先用正则表达式去取单个li标签
Pattern p1 = Pattern.compile(" price ? price : oldPrice;
}
//将数据放入Map中
this.destData.put(name, new Price(price, new Date()));
}
}
完成项目
我把完整的项目放到了我的Github上,更多细节(如何配置,如何使用),有兴趣的孩子可以去加入我们!
仓库地址:
java爬虫抓取动态网页(#爬虫为什么要监控gecco是一个十分简单的java开源爬虫框架)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-10-14 09:27
#java攀虫geccomonitoring来了,没有连胜##为什么爬虫监控gecco是一个非常简单易用的java开源爬虫框架,也是一个扩展性很强的框架。目前,有:
组合弹簧插件gecco-spring
Gecco-htmlunit,一个与htmlunit结合的插件
插件 gecco-reids 结合 reids
开发爬虫时,需要爬取很多网站和链接,将爬取到的网站内容提取出来。如果不监控大量的链接下载和内容提取,很难发现问题。特别是对于主题爬虫,需要提取页面的具体内容。如果网站被修改,必须尽快发现并纠正。完成基础框架和必要的插件后,gecco爬虫框架将重点进行监控的开发。
gecco框架的基本设计原则是对扩展的开放和对修改的关闭的开闭原则是一致的。gecco爬虫的监控模块也是基于这个原理,基于jmx协议,使用aop模式。
##监控指标###爬虫基本信息
###下载监控
###内容提取监控
##jmxutils 和 jolokia ###jmxutils gecco 的监控使用 jmxutils,一个开源的 mbean 注释框架。在之前的开发工作中,要么使用了原生的动态mbean,要么使用了spring jmx注解框架。原生动态mbean写起来太麻烦。Spring的jmx注解框架用起来还是很方便的,但是现在spring感觉有点重了。jmxutils 框架非常轻量级,可以参考使用。###jolokia Jolokia 是一个开源项目,它使用 JSON 通过 Http 实现 JMX 远程管理。它快速而简单。除了支持基本的 JMX 操作外,它还提供了一些独特的功能来增强 JMX 远程管理,例如批量请求、细粒度的安全策略等。 也就是说,jmx的mbean可以通过http访问,启动java的时候不用配置那么多参数。只需要添加一个servlet:
jolokia-agent
org.jolokia.http.AgentServlet
jolokia-agent
/jmx/*
这样就可以方便地控制和访问应用程序中的mbean。jolokia 还提供了 java 客户端和 js 客户端来访问 mbean。具体用法和权限控制请查看jolokia官方文档 查看全部
java爬虫抓取动态网页(#爬虫为什么要监控gecco是一个十分简单的java开源爬虫框架)
#java攀虫geccomonitoring来了,没有连胜##为什么爬虫监控gecco是一个非常简单易用的java开源爬虫框架,也是一个扩展性很强的框架。目前,有:
组合弹簧插件gecco-spring
Gecco-htmlunit,一个与htmlunit结合的插件
插件 gecco-reids 结合 reids
开发爬虫时,需要爬取很多网站和链接,将爬取到的网站内容提取出来。如果不监控大量的链接下载和内容提取,很难发现问题。特别是对于主题爬虫,需要提取页面的具体内容。如果网站被修改,必须尽快发现并纠正。完成基础框架和必要的插件后,gecco爬虫框架将重点进行监控的开发。
gecco框架的基本设计原则是对扩展的开放和对修改的关闭的开闭原则是一致的。gecco爬虫的监控模块也是基于这个原理,基于jmx协议,使用aop模式。

##监控指标###爬虫基本信息
###下载监控
###内容提取监控
##jmxutils 和 jolokia ###jmxutils gecco 的监控使用 jmxutils,一个开源的 mbean 注释框架。在之前的开发工作中,要么使用了原生的动态mbean,要么使用了spring jmx注解框架。原生动态mbean写起来太麻烦。Spring的jmx注解框架用起来还是很方便的,但是现在spring感觉有点重了。jmxutils 框架非常轻量级,可以参考使用。###jolokia Jolokia 是一个开源项目,它使用 JSON 通过 Http 实现 JMX 远程管理。它快速而简单。除了支持基本的 JMX 操作外,它还提供了一些独特的功能来增强 JMX 远程管理,例如批量请求、细粒度的安全策略等。 也就是说,jmx的mbean可以通过http访问,启动java的时候不用配置那么多参数。只需要添加一个servlet:
jolokia-agent
org.jolokia.http.AgentServlet
jolokia-agent
/jmx/*
这样就可以方便地控制和访问应用程序中的mbean。jolokia 还提供了 java 客户端和 js 客户端来访问 mbean。具体用法和权限控制请查看jolokia官方文档
java爬虫抓取动态网页(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-12 07:21
工具类实现比较简单,只是一个get方法,读取请求地址的响应内容,这里我们是用来爬取网页内容的,这里没有代理,在真正的爬取过程中,当你请求一个大量网站的时候,对方会有一系列的策略来禁用你的请求。这时候代理就派上用场了。通过代理设置不同的IP来抓取数据。
接下来我们找一个有图片的网页,试试爬取功能。
首先抓取网页的内容,然后正常解析出网页的标签,再解析img地址。执行程序我们可以得到如下内容:
通过上面的地址我们可以将图片下载到本地,下面我们来写一个图片下载方法:
这样就很简单的实现了一个抓图和提取图片的功能。好像比较麻烦。如果你需要写正则,我给你介绍一个更简单的方法。如果您熟悉 jQuery,则可以提取元素。很简单,这个框架就是Jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
添加jsoup的依赖:
使用jsoup后提取的代码只需要简单的几行:
通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag方法提取所有图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。
Jsoup 使用起来非常简单。当然,还有很多其他的用于解析网页的操作。您可以查看信息并了解它。
我们再升级一下,做一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后自动下载图片,我们就可以用swing来写界面了。
执行 main 方法后的第一件事是我们的接口,如下所示:
截图 2018-06-18 09.50.34 PM.png
输入地址,点击提取按钮下载图片。
课程推荐
大数据时代,如何形成大数据。
大量的用户,每天大量的日志。
搭建爬虫,抓取数十亿条数据进行分析分析。
不仅仅是 Python 可以做爬虫,Java 仍然可以做。
今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来
图片
本课程将带领大家一步步编写爬虫程序,爬取到我们想要的数据,在非登录或者需要登录的情况下爬下来。
完成本课程后,将培训学员成为合格的Java网络爬虫工程师,并能胜任相关爬虫工作;
学习后,能够使用XPath表达式进行信息抽取;
学习掌握抓包技术后,掌握如何提取屏蔽数据信息,自动模拟Ajax异步请求数据;
熟悉jsoup提取网页数据。
Selenium 控制浏览器获取数据。
课程大纲 查看全部
java爬虫抓取动态网页(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
工具类实现比较简单,只是一个get方法,读取请求地址的响应内容,这里我们是用来爬取网页内容的,这里没有代理,在真正的爬取过程中,当你请求一个大量网站的时候,对方会有一系列的策略来禁用你的请求。这时候代理就派上用场了。通过代理设置不同的IP来抓取数据。
接下来我们找一个有图片的网页,试试爬取功能。
首先抓取网页的内容,然后正常解析出网页的标签,再解析img地址。执行程序我们可以得到如下内容:
通过上面的地址我们可以将图片下载到本地,下面我们来写一个图片下载方法:
这样就很简单的实现了一个抓图和提取图片的功能。好像比较麻烦。如果你需要写正则,我给你介绍一个更简单的方法。如果您熟悉 jQuery,则可以提取元素。很简单,这个框架就是Jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
添加jsoup的依赖:
使用jsoup后提取的代码只需要简单的几行:
通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag方法提取所有图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。
Jsoup 使用起来非常简单。当然,还有很多其他的用于解析网页的操作。您可以查看信息并了解它。
我们再升级一下,做一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后自动下载图片,我们就可以用swing来写界面了。
执行 main 方法后的第一件事是我们的接口,如下所示:
截图 2018-06-18 09.50.34 PM.png
输入地址,点击提取按钮下载图片。
课程推荐
大数据时代,如何形成大数据。
大量的用户,每天大量的日志。
搭建爬虫,抓取数十亿条数据进行分析分析。
不仅仅是 Python 可以做爬虫,Java 仍然可以做。
今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来
图片
本课程将带领大家一步步编写爬虫程序,爬取到我们想要的数据,在非登录或者需要登录的情况下爬下来。
完成本课程后,将培训学员成为合格的Java网络爬虫工程师,并能胜任相关爬虫工作;
学习后,能够使用XPath表达式进行信息抽取;
学习掌握抓包技术后,掌握如何提取屏蔽数据信息,自动模拟Ajax异步请求数据;
熟悉jsoup提取网页数据。
Selenium 控制浏览器获取数据。
课程大纲
java爬虫抓取动态网页(爬取免费代理IP数据遇到的js加密cookie问题的原因)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-12 07:14
第一个序列:
由于需要爬取数据,代理和验证码的识别是一个不可避免的问题。本文总结了爬取免费代理IP数据遇到的js加密cookie问题。
两个问题:
对于常见的静态页面,jsoup 的解析更为常见。
但是如果用这个网站直接用jsoup去取,就会报错。
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=521, URL=http://www.kuaidaili.com/ops/proxylist/1
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:679)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:249)
三、问题分析与解决:
其实浏览器是可以正常浏览的,我们打开浏览器看看流程。以 Chrome 为例
可以清楚的看到第一次报错,HTTP状态码是521,不是200.
第二次是200,但是第二次多了cookies:_ydclearance=a3fd46bd1a232b52d7313218-72dc-4427-aa33-5690668af31d-1506323606
这就是问题的原因。
使用程序模拟并打印参数:
CloseableHttpClient httpClient = HttpClients.createDefault();
Registry cookieSpecProviderRegistry = RegistryBuilder.create()
.register("myCookieSpec", context -> new MyCookieSpec()).build();//注册自定义CookieSpec
String url = baseUrl + i;
HttpGet get = new HttpGet(url);
HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecProviderRegistry);
get.setConfig(RequestConfig.custom().setCookieSpec("myCookieSpec").build());
WebRequest request = null;
WebClient wc = null;
try {
//1、获取521状态时返回setcookie
CloseableHttpResponse response = httpClient.execute(get, context);
// 响应状态
System.out.println("status:" + response.getStatusLine());
System.out.println(">>>>>>headers:");
HeaderIterator iterator = response.headerIterator();
while (iterator.hasNext()) {
System.out.println("\t" + iterator.next());
}
System.out.println(">>>>>>cookies:");
// context.getCookieStore().getCookies().forEach(System.out::println);
String cookie =getCookie(context);
System.out.println("cookie="+cookie);
response.close();
输出日志:
status:HTTP/1.1 521
>>>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
TM真的是很深的套路。不愧是代理爬虫网站,还有一套更后的爬虫。
获取此 cookie 并再次调用目标 URL。看反馈数据:
HttpGet secGet = new HttpGet(url);
secGet.setHeader("Cookie",cookie);
//测试用,对比获取结果
CloseableHttpResponse secResponse = httpClient.execute(secGet, context);
System.out.println("secstatus:" + secResponse.getStatusLine());
String content = EntityUtils.toString(secResponse.getEntity());
System.out.println(content);
secResponse.close();
本以为会返回正常的结果数据,结果发现是我太笨了,返回了一段js,而且被加密了
<p>window.οnlοad=setTimeout("dv(43)", 200); function dv(VC) {var qo, mo="", no="", oo = [0x43,0xe5,0xb0,0x27,0x71,0x6f,0xe9,0x58,0xd8,0x21,0x55,0x56,0xd0,0x4f,0xcd,0x91,0x1c,0x9e,0x09,0xe7,0x80,0x6f,0x8d,0xf3,0x60,0x73,0xe9,0x66,0xd4,0x47,0x1e,0x76,0xec,0x69,0xe3,0xbc,0x27,0x02,0x70,0xe0,0xf2,0x65,0xd1,0xac,0x19,0xf3,0x6c,0xe4,0x57,0x3c,0xc3,0xa8,0x13,0xe1,0xb4,0x37,0x0e,0xf2,0x5f,0x32,0x43,0x0e,0x88,0xfe,0xd7,0x99,0x68,0xe0,0xdb,0xa6,0xd2,0xab,0x80,0x57,0x52,0xd6,0xa3,0x7c,0x5d,0xd5,0x29,0x28,0xa0,0x75,0x48,0x3d,0x18,0x13,0xdd,0x4a,0x21,0xf1,0xbe,0x89,0x70,0x72,0xe0,0x4b,0x16,0xee,0xa7,0x74,0x41,0x40,0x13,0xb3,0x7e,0x53,0x24,0xfa,0x12,0xec,0xbd,0x8e,0x5b,0x37,0x02,0xec,0xdd,0x4c,0xf8,0x59,0xad,0x34,0x8c,0x93,0xfd,0x58,0x33,0x6d,0xc6,0x45,0xc5,0xc2,0xb7,0xac,0x81,0x50,0x4b,0x61,0x98,0x03,0x57,0x52,0x25,0x8d,0x60,0x51,0x26,0x09,0xa2,0x8b,0x5e,0x33,0x1c,0xaa,0x77,0x42,0x37,0x65,0x35,0x73,0x7f,0x66,0x5b,0xae,0x1b,0x99,0x18,0x8a,0x18,0x9a,0x1b,0xf5,0xf6,0x66,0xf0,0x3b,0xad,0x34,0x50,0xbc,0x2f,0xb1,0x2e,0xd9,0x60,0x5d,0xd7,0x56,0x5f,0xd9,0xc4,0xb5,0x0a,0xf9,0x70,0xbc,0x3d,0x1c,0xae,0xad,0xa0,0x87,0x7c,0x47,0x95,0x1c,0x9c,0x05,0x45,0xc7,0x16,0x17,0x83,0x33,0xb1,0x2c,0x76,0xf4,0x2e,0x9c,0x19,0x65,0x66,0x3d,0xb9,0x3c,0xb2,0x25,0xbd,0x0a,0x90,0x0f,0x8f,0xce,0xa9,0x16,0x98,0x0f,0xc5,0x14,0x8e,0xfc,0x79,0xe1,0x2e,0x2f,0x39,0x51,0x42,0x94,0x3b];qo = "qo=251; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>2)|((oo[qo]>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
15:10:27.023 [main] INFO c.g.htmlunit.WebClient - statusCode=[521] contentType=[text/html]
15:10:27.033 [main] INFO c.g.htmlunit.WebClient - window.οnlοad=setTimeout("kt(180)", 200); function kt(OD) {var qo, mo="", no="", oo = [0xe7,0xd1,0x34,0xe1,0x60,0xfd,0x51,0x2f,0xc4,0x2b,0xc2,0x90,0xb5,0x43,0xf0,0x7e,0xfb,0xd9,0x22,0x42,0x32,0x5f,0x5d,0x23,0xe6,0xb4,0x5a,0x38,0xf5,0x2c,0xd6,0x94,0x2a,0xf7,0xd5,0xf5,0x99,0xe9,0x52,0x92,0x68,0x46,0x45,0x4d,0x03,0x53,0x8b,0x61,0xc6,0x2f,0x0d,0x45,0x13,0xe0,0xc7,0x08,0x80,0x80,0xb8,0x9e,0xf2,0x53,0x53,0xa3,0x81,0x21,0xdc,0xb2,0x88,0xc8,0x01,0xc0,0x68,0xd0,0x29,0x61,0xd1,0x71,0x01,0xde,0x1f,0xdc,0x1d,0xbc,0x04,0x6c,0xa4,0xec,0x35,0x3d,0x67,0xcf,0x28,0xf5,0xab,0xe3,0x08,0x78,0x4e,0xed,0x2e,0x8e,0x34,0x7c,0xd4,0x05,0x55,0x9d,0x32,0x8a,0xc2,0x3b,0x2b,0xf2,0x89,0x67,0x6d,0xb3,0x31,0x67,0x78,0x56,0x84,0xa4,0x41,0xee,0x7e,0x14,0xbb,0x63,0xbb,0x1c,0xd4,0x74,0xa1,0x9f,0xc5,0x65,0x25,0x65,0xd5,0x9d,0xc5,0xc5,0xa4,0xbc,0xfc,0x25,0x3d,0x75,0x50,0xa8,0x70,0x5d,0xf9,0x5f,0x37,0x27,0xee,0xd4,0x62,0x20,0xe7,0xa5,0x23,0xd8,0xf8,0x90,0xdd,0x4b,0xa9,0x67,0xe4,0xca,0xdd,0x9b,0x19,0xbe,0x3c,0xd3,0x9f,0x4d,0xfa,0x98,0x88,0x50,0x14,0x5a,0x18,0x7e,0xe3,0x04,0x0a,0xb9,0x89,0x99,0x41,0xaf,0x98,0x16,0xab,0x91,0x3f,0x8d,0x21,0xd8,0xbe,0x4c,0x1a,0x78,0x47,0xe4,0xc2,0x78,0xde,0x76,0xd2,0x78,0x06,0xd3,0x91,0xf7,0xf0,0x6e,0x1c,0xb1,0xd1,0xb7,0x3e,0xcb,0x99,0xf7,0x95,0x73,0x6e,0x04,0x6a,0x02,0x7f,0xb4,0x22,0x87,0x3b];qo = "qo=241; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>5)|((oo[qo]>5)|((oo[qo]>2)|((oo[qo]>2)|((oo[qo] 查看全部
java爬虫抓取动态网页(爬取免费代理IP数据遇到的js加密cookie问题的原因)
第一个序列:
由于需要爬取数据,代理和验证码的识别是一个不可避免的问题。本文总结了爬取免费代理IP数据遇到的js加密cookie问题。
两个问题:
对于常见的静态页面,jsoup 的解析更为常见。
但是如果用这个网站直接用jsoup去取,就会报错。
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=521, URL=http://www.kuaidaili.com/ops/proxylist/1
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:679)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:249)
三、问题分析与解决:
其实浏览器是可以正常浏览的,我们打开浏览器看看流程。以 Chrome 为例
可以清楚的看到第一次报错,HTTP状态码是521,不是200.
第二次是200,但是第二次多了cookies:_ydclearance=a3fd46bd1a232b52d7313218-72dc-4427-aa33-5690668af31d-1506323606
这就是问题的原因。
使用程序模拟并打印参数:
CloseableHttpClient httpClient = HttpClients.createDefault();
Registry cookieSpecProviderRegistry = RegistryBuilder.create()
.register("myCookieSpec", context -> new MyCookieSpec()).build();//注册自定义CookieSpec
String url = baseUrl + i;
HttpGet get = new HttpGet(url);
HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecProviderRegistry);
get.setConfig(RequestConfig.custom().setCookieSpec("myCookieSpec").build());
WebRequest request = null;
WebClient wc = null;
try {
//1、获取521状态时返回setcookie
CloseableHttpResponse response = httpClient.execute(get, context);
// 响应状态
System.out.println("status:" + response.getStatusLine());
System.out.println(">>>>>>headers:");
HeaderIterator iterator = response.headerIterator();
while (iterator.hasNext()) {
System.out.println("\t" + iterator.next());
}
System.out.println(">>>>>>cookies:");
// context.getCookieStore().getCookies().forEach(System.out::println);
String cookie =getCookie(context);
System.out.println("cookie="+cookie);
response.close();
输出日志:
status:HTTP/1.1 521
>>>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
TM真的是很深的套路。不愧是代理爬虫网站,还有一套更后的爬虫。
获取此 cookie 并再次调用目标 URL。看反馈数据:
HttpGet secGet = new HttpGet(url);
secGet.setHeader("Cookie",cookie);
//测试用,对比获取结果
CloseableHttpResponse secResponse = httpClient.execute(secGet, context);
System.out.println("secstatus:" + secResponse.getStatusLine());
String content = EntityUtils.toString(secResponse.getEntity());
System.out.println(content);
secResponse.close();
本以为会返回正常的结果数据,结果发现是我太笨了,返回了一段js,而且被加密了
<p>window.οnlοad=setTimeout("dv(43)", 200); function dv(VC) {var qo, mo="", no="", oo = [0x43,0xe5,0xb0,0x27,0x71,0x6f,0xe9,0x58,0xd8,0x21,0x55,0x56,0xd0,0x4f,0xcd,0x91,0x1c,0x9e,0x09,0xe7,0x80,0x6f,0x8d,0xf3,0x60,0x73,0xe9,0x66,0xd4,0x47,0x1e,0x76,0xec,0x69,0xe3,0xbc,0x27,0x02,0x70,0xe0,0xf2,0x65,0xd1,0xac,0x19,0xf3,0x6c,0xe4,0x57,0x3c,0xc3,0xa8,0x13,0xe1,0xb4,0x37,0x0e,0xf2,0x5f,0x32,0x43,0x0e,0x88,0xfe,0xd7,0x99,0x68,0xe0,0xdb,0xa6,0xd2,0xab,0x80,0x57,0x52,0xd6,0xa3,0x7c,0x5d,0xd5,0x29,0x28,0xa0,0x75,0x48,0x3d,0x18,0x13,0xdd,0x4a,0x21,0xf1,0xbe,0x89,0x70,0x72,0xe0,0x4b,0x16,0xee,0xa7,0x74,0x41,0x40,0x13,0xb3,0x7e,0x53,0x24,0xfa,0x12,0xec,0xbd,0x8e,0x5b,0x37,0x02,0xec,0xdd,0x4c,0xf8,0x59,0xad,0x34,0x8c,0x93,0xfd,0x58,0x33,0x6d,0xc6,0x45,0xc5,0xc2,0xb7,0xac,0x81,0x50,0x4b,0x61,0x98,0x03,0x57,0x52,0x25,0x8d,0x60,0x51,0x26,0x09,0xa2,0x8b,0x5e,0x33,0x1c,0xaa,0x77,0x42,0x37,0x65,0x35,0x73,0x7f,0x66,0x5b,0xae,0x1b,0x99,0x18,0x8a,0x18,0x9a,0x1b,0xf5,0xf6,0x66,0xf0,0x3b,0xad,0x34,0x50,0xbc,0x2f,0xb1,0x2e,0xd9,0x60,0x5d,0xd7,0x56,0x5f,0xd9,0xc4,0xb5,0x0a,0xf9,0x70,0xbc,0x3d,0x1c,0xae,0xad,0xa0,0x87,0x7c,0x47,0x95,0x1c,0x9c,0x05,0x45,0xc7,0x16,0x17,0x83,0x33,0xb1,0x2c,0x76,0xf4,0x2e,0x9c,0x19,0x65,0x66,0x3d,0xb9,0x3c,0xb2,0x25,0xbd,0x0a,0x90,0x0f,0x8f,0xce,0xa9,0x16,0x98,0x0f,0xc5,0x14,0x8e,0xfc,0x79,0xe1,0x2e,0x2f,0x39,0x51,0x42,0x94,0x3b];qo = "qo=251; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>2)|((oo[qo]>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
15:10:27.023 [main] INFO c.g.htmlunit.WebClient - statusCode=[521] contentType=[text/html]
15:10:27.033 [main] INFO c.g.htmlunit.WebClient - window.οnlοad=setTimeout("kt(180)", 200); function kt(OD) {var qo, mo="", no="", oo = [0xe7,0xd1,0x34,0xe1,0x60,0xfd,0x51,0x2f,0xc4,0x2b,0xc2,0x90,0xb5,0x43,0xf0,0x7e,0xfb,0xd9,0x22,0x42,0x32,0x5f,0x5d,0x23,0xe6,0xb4,0x5a,0x38,0xf5,0x2c,0xd6,0x94,0x2a,0xf7,0xd5,0xf5,0x99,0xe9,0x52,0x92,0x68,0x46,0x45,0x4d,0x03,0x53,0x8b,0x61,0xc6,0x2f,0x0d,0x45,0x13,0xe0,0xc7,0x08,0x80,0x80,0xb8,0x9e,0xf2,0x53,0x53,0xa3,0x81,0x21,0xdc,0xb2,0x88,0xc8,0x01,0xc0,0x68,0xd0,0x29,0x61,0xd1,0x71,0x01,0xde,0x1f,0xdc,0x1d,0xbc,0x04,0x6c,0xa4,0xec,0x35,0x3d,0x67,0xcf,0x28,0xf5,0xab,0xe3,0x08,0x78,0x4e,0xed,0x2e,0x8e,0x34,0x7c,0xd4,0x05,0x55,0x9d,0x32,0x8a,0xc2,0x3b,0x2b,0xf2,0x89,0x67,0x6d,0xb3,0x31,0x67,0x78,0x56,0x84,0xa4,0x41,0xee,0x7e,0x14,0xbb,0x63,0xbb,0x1c,0xd4,0x74,0xa1,0x9f,0xc5,0x65,0x25,0x65,0xd5,0x9d,0xc5,0xc5,0xa4,0xbc,0xfc,0x25,0x3d,0x75,0x50,0xa8,0x70,0x5d,0xf9,0x5f,0x37,0x27,0xee,0xd4,0x62,0x20,0xe7,0xa5,0x23,0xd8,0xf8,0x90,0xdd,0x4b,0xa9,0x67,0xe4,0xca,0xdd,0x9b,0x19,0xbe,0x3c,0xd3,0x9f,0x4d,0xfa,0x98,0x88,0x50,0x14,0x5a,0x18,0x7e,0xe3,0x04,0x0a,0xb9,0x89,0x99,0x41,0xaf,0x98,0x16,0xab,0x91,0x3f,0x8d,0x21,0xd8,0xbe,0x4c,0x1a,0x78,0x47,0xe4,0xc2,0x78,0xde,0x76,0xd2,0x78,0x06,0xd3,0x91,0xf7,0xf0,0x6e,0x1c,0xb1,0xd1,0xb7,0x3e,0xcb,0x99,0xf7,0x95,0x73,0x6e,0x04,0x6a,0x02,0x7f,0xb4,0x22,0x87,0x3b];qo = "qo=241; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>5)|((oo[qo]>5)|((oo[qo]>2)|((oo[qo]>2)|((oo[qo]
java爬虫抓取动态网页( Python网络爬虫内容提取器一文讲解)
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-11 23:28
Python网络爬虫内容提取器一文讲解)
1 简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2.提取动态内容的技术成分
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码及实验过程
如果我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:使用直观的采集和搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(在windows10下测试,python3.2),请注意:xslt是一个比较长的字符串,如果把这个字符串删掉,那几行代码也不多,够看Python了强大的
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4. 阅读下一步
至此,我们已经演示了如何通过两个文章来抓取静态和动态的网页内容,这两个文章都使用xslt一次从网页中提取需要的内容。实际上,xslt 是一种更复杂的编程语言。如果你手动写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这是有道理的,程序员不再需要花时间编写和调试捕获规则,这是一项非常耗时费力的工作。接下来,《一分钟快速生成xslt进行网页内容提取》将介绍如何生成xslt。
5.采集GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
5. 文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源码,修改github源码地址 查看全部
java爬虫抓取动态网页(
Python网络爬虫内容提取器一文讲解)
1 简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2.提取动态内容的技术成分
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码及实验过程
如果我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:使用直观的采集和搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(在windows10下测试,python3.2),请注意:xslt是一个比较长的字符串,如果把这个字符串删掉,那几行代码也不多,够看Python了强大的
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4. 阅读下一步
至此,我们已经演示了如何通过两个文章来抓取静态和动态的网页内容,这两个文章都使用xslt一次从网页中提取需要的内容。实际上,xslt 是一种更复杂的编程语言。如果你手动写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这是有道理的,程序员不再需要花时间编写和调试捕获规则,这是一项非常耗时费力的工作。接下来,《一分钟快速生成xslt进行网页内容提取》将介绍如何生成xslt。
5.采集GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
5. 文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源码,修改github源码地址
java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-10-11 08:34
最近在做一个项目,有一个需求:从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,后来就稀里糊涂的打了代码(之前用的是Hadoop平台的分布式爬虫框架Nutch,用起来很方便,最后因为速度放弃了,但是生成的统计数据用在后来爬取),很快就成功下载了holder.html和finance.html页面,然后在解析了holder.html页面后,解析了finance.html,然后就郁闷的在这个页面找到了自己需要的东西数据不在 html 源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录后者)。我很高兴,终于找到了解决办法。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。当初设计的时候,不是用来服务爬虫的,但我想说的是:星盘只是有点短,你不能再进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从实际情况出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver 可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码太有限了。解析你写的js代码,js代码简单,当然WebDriver可以毫无压力的完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面用到的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page. asXml(),可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js。会启动一个带界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都免不了要解析js,这需要时间,而且对于没用的内核,js的支持程序也不一样。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身经历)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能得到完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。本来以为driver解析js完成后应该可以抓到状态,于是去找,找,但是根本没有这种方法,所以说为什么WebDriver的设计者没有往前走一步,这样我们就可以在程序中获取解析js后的驱动状态,所以不需要使用Thread.sleep(2000)这样的不确定代码,可惜我找不到它。它真的让我感到难过。领域。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会出现不同,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实如此。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
在java端执行的代码
public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream(); //后面的代码省略,得到了InputStream就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码不同编译,java端一直在等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要开启一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
我折腾了好几天了。虽然它没有解决我的问题,但我获得了很多知识。后面的工作就是熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以结合使用Nutch和WebDirver,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫获得的结果的稳定性有什么要说的,欢迎大家,因为我确实没有找到稳定爬虫结果的相关资料。 查看全部
java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
最近在做一个项目,有一个需求:从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,后来就稀里糊涂的打了代码(之前用的是Hadoop平台的分布式爬虫框架Nutch,用起来很方便,最后因为速度放弃了,但是生成的统计数据用在后来爬取),很快就成功下载了holder.html和finance.html页面,然后在解析了holder.html页面后,解析了finance.html,然后就郁闷的在这个页面找到了自己需要的东西数据不在 html 源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录后者)。我很高兴,终于找到了解决办法。. 兴奋地使用WebDriver,我想骂人。

以下是对WebDriver的投诉
WebDriver 是一个测试框架。当初设计的时候,不是用来服务爬虫的,但我想说的是:星盘只是有点短,你不能再进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从实际情况出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver 可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码太有限了。解析你写的js代码,js代码简单,当然WebDriver可以毫无压力的完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面用到的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page. asXml(),可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js。会启动一个带界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都免不了要解析js,这需要时间,而且对于没用的内核,js的支持程序也不一样。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身经历)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能得到完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。本来以为driver解析js完成后应该可以抓到状态,于是去找,找,但是根本没有这种方法,所以说为什么WebDriver的设计者没有往前走一步,这样我们就可以在程序中获取解析js后的驱动状态,所以不需要使用Thread.sleep(2000)这样的不确定代码,可惜我找不到它。它真的让我感到难过。领域。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会出现不同,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实如此。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码


在java端执行的代码

public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream(); //后面的代码省略,得到了InputStream就好说了 }

这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码不同编译,java端一直在等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要开启一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
我折腾了好几天了。虽然它没有解决我的问题,但我获得了很多知识。后面的工作就是熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以结合使用Nutch和WebDirver,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫获得的结果的稳定性有什么要说的,欢迎大家,因为我确实没有找到稳定爬虫结果的相关资料。
java爬虫抓取动态网页(java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-10-09 18:07
java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可,效果也不错。做到的主要工作包括:1.提取动态数据:比如图片信息,twitter的信息2.加载动态页面:比如下载一个图片(mongodb)3.关键字过滤:比如某个热点话题、歌曲名称4.查询:某个用户5.爬虫分析:分析数据的构成、各字段值的类型6.再记下某个页面历史记录不知道实现的意义是什么,也不知道是否合理,仅提供思路,欢迎探讨~。
比如说导航网站,要爬xxx2434,数据结构就是要有xxx这个字段,同时要爬取到最多数据字段对应的xxx2434。有可能你爬的动态数据,已经过数据结构的记录了。
有代码才能说明问题,就是有代码,都还是一样的效果,而且这个属于已经有的动态数据。另外任何程序语言都不存在真正意义上的「反爬虫」机制,爬虫出来的数据,都是你自己构造的(只是没有被动态封锁到页面的那些方法),比如你加上xxx2434的类型,爬虫原始数据就一定是txt类型,因为只有txt才能用「反爬虫」过滤掉那些cookie。
—我推荐一个稍稍有点技术性的:在爬虫的每一步都要尽量添加合理的指令实现「动态」数据,要动态的返回结果。说下好处:适合那些网站被封锁等不可抗力或者官方要有不易忽略的目的时使用,比如你要爬某些山地户外的数据库:爬虫的定义在百度百科中,「爬虫(quantumuniversalagent),是网络爬虫的一种,通过为网站生成webapi,为网站提供免费的代理ip,以此来代替站长的工作。
」(原文如下)此处只提前端时代的一些发展。其实最近几年前端地位被后端的网络爬虫取代,从传统ip定向代理,到基于socket的ip代理,再到通过ip隧道技术,更多的实现如网络多路复用,负载均衡等等。但这些东西,会加大爬虫的负担,比如加大后端api返回ip等等规则带来的定向处理的负担。反爬虫在后端时代确实有存在的必要,比如某些社交网站,你的cookie大部分作用是获取更多的用户信息,或者sns网站,你的大部分session的作用是存放你的信息(这是定向请求的差异性,而不是反爬虫)。
爬虫更大的应用是作为一个中间产品,提供一个小小的反爬虫机制。可以简单理解:反爬虫就是为了把在一定条件下,对来访者进行识别的机制,用户体验可能差一点,但是无法100%避免动态伪造,再说动态处理也不见得比反爬虫强。从。 查看全部
java爬虫抓取动态网页(java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可)
java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可,效果也不错。做到的主要工作包括:1.提取动态数据:比如图片信息,twitter的信息2.加载动态页面:比如下载一个图片(mongodb)3.关键字过滤:比如某个热点话题、歌曲名称4.查询:某个用户5.爬虫分析:分析数据的构成、各字段值的类型6.再记下某个页面历史记录不知道实现的意义是什么,也不知道是否合理,仅提供思路,欢迎探讨~。
比如说导航网站,要爬xxx2434,数据结构就是要有xxx这个字段,同时要爬取到最多数据字段对应的xxx2434。有可能你爬的动态数据,已经过数据结构的记录了。
有代码才能说明问题,就是有代码,都还是一样的效果,而且这个属于已经有的动态数据。另外任何程序语言都不存在真正意义上的「反爬虫」机制,爬虫出来的数据,都是你自己构造的(只是没有被动态封锁到页面的那些方法),比如你加上xxx2434的类型,爬虫原始数据就一定是txt类型,因为只有txt才能用「反爬虫」过滤掉那些cookie。
—我推荐一个稍稍有点技术性的:在爬虫的每一步都要尽量添加合理的指令实现「动态」数据,要动态的返回结果。说下好处:适合那些网站被封锁等不可抗力或者官方要有不易忽略的目的时使用,比如你要爬某些山地户外的数据库:爬虫的定义在百度百科中,「爬虫(quantumuniversalagent),是网络爬虫的一种,通过为网站生成webapi,为网站提供免费的代理ip,以此来代替站长的工作。
」(原文如下)此处只提前端时代的一些发展。其实最近几年前端地位被后端的网络爬虫取代,从传统ip定向代理,到基于socket的ip代理,再到通过ip隧道技术,更多的实现如网络多路复用,负载均衡等等。但这些东西,会加大爬虫的负担,比如加大后端api返回ip等等规则带来的定向处理的负担。反爬虫在后端时代确实有存在的必要,比如某些社交网站,你的cookie大部分作用是获取更多的用户信息,或者sns网站,你的大部分session的作用是存放你的信息(这是定向请求的差异性,而不是反爬虫)。
爬虫更大的应用是作为一个中间产品,提供一个小小的反爬虫机制。可以简单理解:反爬虫就是为了把在一定条件下,对来访者进行识别的机制,用户体验可能差一点,但是无法100%避免动态伪造,再说动态处理也不见得比反爬虫强。从。
java爬虫抓取动态网页(Java_爬虫,如何抓取Js动态生成数据的页面?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-10-09 00:18
Java_爬虫,如何抓取Js生成的动态数据的页面?
很多网站使用js或者jquery来生成数据。后台获取数据后,使用 document.write() 或 ("#id").html="" 写入页面。这时候用浏览器看源码是看不到数据的。
HttpClient 不起作用。看网上的HtmlUnit,说后台js加载后可以得到完整的页面,但是我按照文章上写的,但是不行。
对于答案,典型的是此链接的页面。 java程序中如何获取数据?
------解决思路--------------
试试
String s= "http://xinjinqiao.tprtc.com/ad ... %3Bbr />
URL url = new URL(s);<br />
HttpURLConnection http = (HttpURLConnection) url.openConnection();<br />
http.setDoOutput(true); <br />
http.setDoInput(true); <br />
http.setRequestMethod("POST"); <br />
http.connect(); <br />
OutputStreamWriter out = new OutputStreamWriter(http.getOutputStream(), "UTF-8"); <br />
<br />
String input = "name=flr&nowpage=1&pagesize=10"; <br />
<br />
out.append(input); <br />
out.flush(); <br />
out.close(); <br />
int length = (int) http.getContentLength();<br />
System.out.println(length);<br />
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));<br />
String line;<br />
StringBuffer buffer = new StringBuffer();<br />
while ((line = reader.readLine()) != null) {<br />
buffer.append(line);<br />
}<br />
reader.close();<br />
http.disconnect();<br />
System.out.println(buffer.toString());
------解决思路--------------
可以看代码,也可以抓包看看。 查看全部
java爬虫抓取动态网页(Java_爬虫,如何抓取Js动态生成数据的页面?)
Java_爬虫,如何抓取Js生成的动态数据的页面?
很多网站使用js或者jquery来生成数据。后台获取数据后,使用 document.write() 或 ("#id").html="" 写入页面。这时候用浏览器看源码是看不到数据的。
HttpClient 不起作用。看网上的HtmlUnit,说后台js加载后可以得到完整的页面,但是我按照文章上写的,但是不行。
对于答案,典型的是此链接的页面。 java程序中如何获取数据?
------解决思路--------------
试试
String s= "http://xinjinqiao.tprtc.com/ad ... %3Bbr />
URL url = new URL(s);<br />
HttpURLConnection http = (HttpURLConnection) url.openConnection();<br />
http.setDoOutput(true); <br />
http.setDoInput(true); <br />
http.setRequestMethod("POST"); <br />
http.connect(); <br />
OutputStreamWriter out = new OutputStreamWriter(http.getOutputStream(), "UTF-8"); <br />
<br />
String input = "name=flr&nowpage=1&pagesize=10"; <br />
<br />
out.append(input); <br />
out.flush(); <br />
out.close(); <br />
int length = (int) http.getContentLength();<br />
System.out.println(length);<br />
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));<br />
String line;<br />
StringBuffer buffer = new StringBuffer();<br />
while ((line = reader.readLine()) != null) {<br />
buffer.append(line);<br />
}<br />
reader.close();<br />
http.disconnect();<br />
System.out.println(buffer.toString());
------解决思路--------------
可以看代码,也可以抓包看看。
java爬虫抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-10-09 00:16
汤
Jsoup:Java HTML 解析器,具有最好的 DOM、CSS 和 jquery
使用入门案例介绍
org.jsoup
jsoup
1.10.2
使用简单
Document document = Jsoup.connect(url)
.timeout(30000)
.validateTLSCertificates(false)
.get();
Elements elements = document.select(".book-chapter-list > .cf:last-child > li");
for (Element element : elements) {
String title = element.text();
String chapUrl = url + element.select("a").attr("href");
// 其他构件存储操作
}
这里的主要目的是指定一个访问的url,然后通过各种选择器获取我们想要的元素信息。
动态js内容背景
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是AJAX获取的,所以分析AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。
缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。
好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,这对于后面的项目部署到浏览器非常不利!
所以推荐第一种方法,代码也是第一种方法。
htmlunitjava 模拟js执行
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(new InputStreamReader(Login.class
.getResourceAsStream("/sha1.js")));
Object t = engine.eval("CryptoJS.SHA1('" + password+ "').toString();");
System.out.println(t);
jsoup 模拟ajax请求
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
jsoup抓取页面js信息
/*设置网页抓取响应时间*/
private static final int TIMEOUT = 10000;
public static Map getSerieExtDetail(int serieId) throws Exception{
/*车系参数配置页面*/
String serieInfo = "http://car.autohome.com.cn/con ... 3B%3B
/*用來封裝要保存的参数*/
Map map = new HashMap();
/*取得车系参数配置页面文档*/
Document document = Jsoup.connect(serieInfo).timeout(TIMEOUT).get();
/*取得script下面的JS变量*/
Elements e = document.getElementsByTag("script").eq(6);
/*循环遍历script下面的JS变量*/
for (Element element : e) {
/*取得JS变量数组*/
String[] data = element.data().toString().split("var");
/*取得单个JS变量*/
for(String variable : data){
/*过滤variable为空的数据*/
if(variable.contains("=")){
/*取到满足条件的JS变量*/
if(variable.contains("option") || variable.contains("config")
|| variable.contains("color") || variable.contains("innerColor")){
String[] kvp = variable.split("=");
/*取得JS变量存入map*/
if(!map.containsKey(kvp[0].trim()))
map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length()-1).toString());
}
}
}
}
return map;
}
进一步阅读
webmagic-另一个爬虫选项 查看全部
java爬虫抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)
汤
Jsoup:Java HTML 解析器,具有最好的 DOM、CSS 和 jquery
使用入门案例介绍
org.jsoup
jsoup
1.10.2
使用简单
Document document = Jsoup.connect(url)
.timeout(30000)
.validateTLSCertificates(false)
.get();
Elements elements = document.select(".book-chapter-list > .cf:last-child > li");
for (Element element : elements) {
String title = element.text();
String chapUrl = url + element.select("a").attr("href");
// 其他构件存储操作
}
这里的主要目的是指定一个访问的url,然后通过各种选择器获取我们想要的元素信息。
动态js内容背景
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是AJAX获取的,所以分析AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。
缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。
好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,这对于后面的项目部署到浏览器非常不利!
所以推荐第一种方法,代码也是第一种方法。
htmlunitjava 模拟js执行
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(new InputStreamReader(Login.class
.getResourceAsStream("/sha1.js")));
Object t = engine.eval("CryptoJS.SHA1('" + password+ "').toString();");
System.out.println(t);
jsoup 模拟ajax请求
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
jsoup抓取页面js信息
/*设置网页抓取响应时间*/
private static final int TIMEOUT = 10000;
public static Map getSerieExtDetail(int serieId) throws Exception{
/*车系参数配置页面*/
String serieInfo = "http://car.autohome.com.cn/con ... 3B%3B
/*用來封裝要保存的参数*/
Map map = new HashMap();
/*取得车系参数配置页面文档*/
Document document = Jsoup.connect(serieInfo).timeout(TIMEOUT).get();
/*取得script下面的JS变量*/
Elements e = document.getElementsByTag("script").eq(6);
/*循环遍历script下面的JS变量*/
for (Element element : e) {
/*取得JS变量数组*/
String[] data = element.data().toString().split("var");
/*取得单个JS变量*/
for(String variable : data){
/*过滤variable为空的数据*/
if(variable.contains("=")){
/*取到满足条件的JS变量*/
if(variable.contains("option") || variable.contains("config")
|| variable.contains("color") || variable.contains("innerColor")){
String[] kvp = variable.split("=");
/*取得JS变量存入map*/
if(!map.containsKey(kvp[0].trim()))
map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length()-1).toString());
}
}
}
}
return map;
}
进一步阅读
webmagic-另一个爬虫选项
java爬虫抓取动态网页(一下栗子:我对爬与反爬的关系的理解 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-08 07:01
)
写之前先说说我对爬行和反爬关系的理解
一、什么是爬虫
Crawler 英文是spliter,意思是蜘蛛。网络爬虫系统的功能是下载网页数据,并对所需数据进行采集。主体是根据初始超链接下载并解析目标页面。这时候有两件事,一是继续往容器中添加相关的超链接,二是解析页面的目标数据,一直循环下去,直到没有url解析出来。举个栗子:我要爬苏宁手机价格数据。爬取的思路是获取第一页的URL作为蜘蛛网的中心点,爬取当前页的手机详情页的价格信息和下一页的URL。并将其添加到容器中,这样只要将url容器存储在循环中,会继续机械执行,直到最后一页没有下一页为止。这是一个扩散的过程。
二、什么是反爬虫,为什么应该是
反爬虫就是根据请求的某些访问特性进行特殊的处理,比如屏蔽IP、轰炸验证码、返回非对应信息等。
反爬大概有几个原因
1、爬虫占了很高的总PV值,相当于一大群僵尸用户访问你的网站。如果不加以控制,只会浪费服务器资源。
2、有些人因为商业竞争问题必须反爬,防止自己的商业信息被竞争对手批量获取。我看到了一个非常合适的例子。对外卖了两个产品,一个家庭写了一个脚本,自动爬取对手的网站产品价格并与自己的产品价格进行比较,并保持在一定价格以下进行动态波动。买之前一定要了解同行业的价格,所以大家都知道结果。对方很快就发现了这里的连队手脚,一场激烈的攀爬和反攀爬比赛开始了。
3、还有一些无人认领的爬虫。可能使用它们的人都忘记了它的存在,一直在艰难地爬行。
三、一些常见的防爬方法
1、 根据IP访问频率和IP数量上限,用户每秒访问页面数十次或每半秒一次,持续数小时。动作明显,封堵结束。
2、 页面加载时也有动态访问,而不是静态数据。比如动态加载一些董的价格信息
3、还有,主页面是异步加载的,嵌套在iframe中,src="about:blank",这个正常下载的页面没有内容
4、 故意挖洞,在页面上做一些隐藏的链接。如果访问明显是爬虫爬进来的,下一步就是拦截
5、 后端查询统计并对userAgent进行阈值判断。这个据说容易误伤
6、 页面展示也有花样,部分价格信息用图片展示。去哪儿网
7、Cookie 反扒,推荐链接,有很好的介绍入口
四、 破解前三个
1.设置ip池周期循环访问
首先,我们从诸如 Xisui 网站 等代理那里获取一些免费 ip,其次,我们执行无效 ip 过滤。此步骤视情况而定。我个人的做法是Xisci网络上的ip有时可以访问有时无效,所以我只是去掉过滤步骤,然后使用这些代理ip进行实际访问。
<p>public class CsdnReadCount implements PageProcessor {
// IP地址代理库Map
private static Map IPProxyRepository = new HashMap();
private static List keysArray = new ArrayList();
private static int index;
private Site site = Site
.me()
.setDomain("http://www.xicidaili.com/")
.setSleepTime(3000).setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
//按照顺序获取一个ip
public static HttpHost getRandomProxy() {
// 随机获取host:port,并构建代理对象
String host = keysArray.get(index);
if(index 查看全部
java爬虫抓取动态网页(一下栗子:我对爬与反爬的关系的理解
)
写之前先说说我对爬行和反爬关系的理解
一、什么是爬虫
Crawler 英文是spliter,意思是蜘蛛。网络爬虫系统的功能是下载网页数据,并对所需数据进行采集。主体是根据初始超链接下载并解析目标页面。这时候有两件事,一是继续往容器中添加相关的超链接,二是解析页面的目标数据,一直循环下去,直到没有url解析出来。举个栗子:我要爬苏宁手机价格数据。爬取的思路是获取第一页的URL作为蜘蛛网的中心点,爬取当前页的手机详情页的价格信息和下一页的URL。并将其添加到容器中,这样只要将url容器存储在循环中,会继续机械执行,直到最后一页没有下一页为止。这是一个扩散的过程。
二、什么是反爬虫,为什么应该是
反爬虫就是根据请求的某些访问特性进行特殊的处理,比如屏蔽IP、轰炸验证码、返回非对应信息等。
反爬大概有几个原因
1、爬虫占了很高的总PV值,相当于一大群僵尸用户访问你的网站。如果不加以控制,只会浪费服务器资源。
2、有些人因为商业竞争问题必须反爬,防止自己的商业信息被竞争对手批量获取。我看到了一个非常合适的例子。对外卖了两个产品,一个家庭写了一个脚本,自动爬取对手的网站产品价格并与自己的产品价格进行比较,并保持在一定价格以下进行动态波动。买之前一定要了解同行业的价格,所以大家都知道结果。对方很快就发现了这里的连队手脚,一场激烈的攀爬和反攀爬比赛开始了。
3、还有一些无人认领的爬虫。可能使用它们的人都忘记了它的存在,一直在艰难地爬行。
三、一些常见的防爬方法
1、 根据IP访问频率和IP数量上限,用户每秒访问页面数十次或每半秒一次,持续数小时。动作明显,封堵结束。
2、 页面加载时也有动态访问,而不是静态数据。比如动态加载一些董的价格信息
3、还有,主页面是异步加载的,嵌套在iframe中,src="about:blank",这个正常下载的页面没有内容
4、 故意挖洞,在页面上做一些隐藏的链接。如果访问明显是爬虫爬进来的,下一步就是拦截
5、 后端查询统计并对userAgent进行阈值判断。这个据说容易误伤
6、 页面展示也有花样,部分价格信息用图片展示。去哪儿网
7、Cookie 反扒,推荐链接,有很好的介绍入口
四、 破解前三个
1.设置ip池周期循环访问
首先,我们从诸如 Xisui 网站 等代理那里获取一些免费 ip,其次,我们执行无效 ip 过滤。此步骤视情况而定。我个人的做法是Xisci网络上的ip有时可以访问有时无效,所以我只是去掉过滤步骤,然后使用这些代理ip进行实际访问。
<p>public class CsdnReadCount implements PageProcessor {
// IP地址代理库Map
private static Map IPProxyRepository = new HashMap();
private static List keysArray = new ArrayList();
private static int index;
private Site site = Site
.me()
.setDomain("http://www.xicidaili.com/")
.setSleepTime(3000).setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
//按照顺序获取一个ip
public static HttpHost getRandomProxy() {
// 随机获取host:port,并构建代理对象
String host = keysArray.get(index);
if(index
java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-10-08 06:27
Selenium 本身是一个自动化测试工具,可以模拟浏览器加载页面。优点是可以通过程序自动完成页面登录、AJAX内容获取等操作。
尤其是在获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,而selenium完美的帮助我们实现了这个功能。
但它也有一些缺点。使用selenium函数时,需要提前加载selenium驱动,通过selenium自身加载页面动态生成的内容,供后期抓取。
但是本节我们只讲selenium的一个基本操作:页面登录
后面我们会讲如何通过selenium抓取动态页面
================================================ 我是萌萌哒分割线============================================== ========
启动代码:
首先我们先通过maven配置selenium的相关依赖
org.seleniumhq.selenium
selenium-java
3.3.1
以上是selenium的相关配置。当然,webmagic 本身也集成了 selenium。相关配置如下:
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
webmagic的这个配置有一个简单的selenium包,看你的喜好了。
使用selenium抓取整个页面时,首先需要下载相关的浏览器驱动。不同版本浏览器的驱动是不同的。
我用的是chrome驱动,所以我也提供了chromedriver的下载地址。其他驱动如火狐和IE在百度上很容易找到。
chromedriver 相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前需要上面两句加载浏览器驱动和爬取目标URL
我以为我把驱动放在了chrome路径下的bin文件夹下,在环境变量路径中添加了chromedriver地址,所以我用新的ChromeDriver的时候没有带参数
如果不想把驱动赋值给环境变量,可以直接把驱动的路径写成参数传入(
例子:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是模拟登录美拍的代码。一些基本的BasePageProcess类之前已经配置好了,站点和一些基本的逻辑功能都放在里面。然后爬虫程序只需要完成页面解析功能,但是当时忘记放BasePageProcess类了。代码贴出来了,有人反馈说程序跑不起来,所以这次把一切都简化了,实现了webmagic最基本的PageProcessor接口。所有的逻辑都体现在上面的程序中。
代码功能比较简单,主要是通过findElement方法定位账号密码输入框,输入对应的账号密码,最后点击login完成整个模拟登陆操作。
Selenium本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高! 查看全部
java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
Selenium 本身是一个自动化测试工具,可以模拟浏览器加载页面。优点是可以通过程序自动完成页面登录、AJAX内容获取等操作。
尤其是在获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,而selenium完美的帮助我们实现了这个功能。
但它也有一些缺点。使用selenium函数时,需要提前加载selenium驱动,通过selenium自身加载页面动态生成的内容,供后期抓取。
但是本节我们只讲selenium的一个基本操作:页面登录
后面我们会讲如何通过selenium抓取动态页面
================================================ 我是萌萌哒分割线============================================== ========
启动代码:
首先我们先通过maven配置selenium的相关依赖
org.seleniumhq.selenium
selenium-java
3.3.1
以上是selenium的相关配置。当然,webmagic 本身也集成了 selenium。相关配置如下:
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
webmagic的这个配置有一个简单的selenium包,看你的喜好了。
使用selenium抓取整个页面时,首先需要下载相关的浏览器驱动。不同版本浏览器的驱动是不同的。
我用的是chrome驱动,所以我也提供了chromedriver的下载地址。其他驱动如火狐和IE在百度上很容易找到。
chromedriver 相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前需要上面两句加载浏览器驱动和爬取目标URL
我以为我把驱动放在了chrome路径下的bin文件夹下,在环境变量路径中添加了chromedriver地址,所以我用新的ChromeDriver的时候没有带参数
如果不想把驱动赋值给环境变量,可以直接把驱动的路径写成参数传入(
例子:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是模拟登录美拍的代码。一些基本的BasePageProcess类之前已经配置好了,站点和一些基本的逻辑功能都放在里面。然后爬虫程序只需要完成页面解析功能,但是当时忘记放BasePageProcess类了。代码贴出来了,有人反馈说程序跑不起来,所以这次把一切都简化了,实现了webmagic最基本的PageProcessor接口。所有的逻辑都体现在上面的程序中。
代码功能比较简单,主要是通过findElement方法定位账号密码输入框,输入对应的账号密码,最后点击login完成整个模拟登陆操作。
Selenium本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高!
java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-10-07 23:11
免费资源网-
目录Java实现网络爬虫框架一、各个类的功能介绍二、各个类Java实现网络爬虫框架的源码
我目前正在从事与搜索相关的项目。我需要抓取互联网上的一些链接并将它们存储在索引库中。虽然有很多强大的开源爬虫框架,但是我抱着学习的态度写了一个简单的网络爬虫。了解原理。今天就给小伙伴们分享一下这个简单的爬虫程序!!
一、各个类的作用DownloadPage.java的作用就是下载这个超链接的页面源代码。FunctionUtils.java的作用是提供不同的静态方法,包括:页面链接正则表达式匹配、URL链接获取判断是否创建文件、获取页面的Url并转换为标准化的Url、拦截目标网页源文件的内容。HrefOfPage.java 的作用是获取页面源代码的超链接。UrlDataHanding.java 的作用是集成各种类,实现url获取数据到数据处理类。UrlQueue.java 未访问的 Url 队列。VisitedUrlQueue.java 已访问的 URL 队列。二、各个类的源码
DownloadPage.java 为此类使用 HttpClient 组件。
package com.sreach.spider;
import java.io.IOException;
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;
/**
* @author binghe
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrl(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) {
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
此类的 FunctionUtils.java 方法是静态方法
<p>
package com.sreach.spider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author binghe
*/
public class FunctionUtils {
/**
* 匹配超链接的正则表达式
*/
private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";
private static Pattern pattern = Pattern.compile(pat);
private static BufferedWriter writer = null;
/**
* 爬虫搜索深度
*/
public static int depth = 0;
/**
* 以"/"来分割URL,获得超链接的元素
*
* @param url
* @return
*/
public static String[] divUrl(String url) {
return url.split("/");
}
/**
* 判断是否创建文件
*
* @param url
* @return
*/
public static boolean isCreateFile(String url) {
Matcher matcher = pattern.matcher(url);
return matcher.matches();
}
/**
* 创建对应文件
*
* @param content
* @param urlPath
*/
public static void createFile(String content, String urlPath) {
/* 分割url */
String[] elems = divUrl(urlPath);
StringBuffer path = new StringBuffer();
File file = null;
for (int i = 1; i < elems.length; i++) {
if (i != elems.length - 1) {
path.append(elems[i]);
path.append(File.separator);
file = new File("D:" + File.separator + path.toString());
}
if (i == elems.length - 1) {
Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");
Matcher matcher = pattern.matcher(elems[i]);
if ((matcher.matches())) {
if (!file.exists()) {
file.mkdirs();
}
String[] fileName = elems[i].split("\\.");
file = new File("D:" + File.separator + path.toString()
+ File.separator + fileName[0] + ".txt");
try {
file.createNewFile();
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file)));
writer.write(content);
writer.flush();
writer.close();
System.out.println("创建文件成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 获取页面的超链接并将其转换为正式的A标签
*
* @param href
* @return
*/
public static String getHrefOfInOut(String href) {
/* 内外部链接最终转化为完整的链接格式 */
String resultHref = null;
/* 判断是否为外部链接 */
if (href.startsWith("http://")) {
resultHref = href;
} else {
/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */
if (href.startsWith("/")) {
resultHref = "http://www.oschina.net" + href;
}
}
return resultHref;
}
/**
* 截取网页网页源文件的目标内容
*
* @param content
* @return
*/
public static String getGoalContent(String content) {
int sign = content.indexOf(" 查看全部
java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))
免费资源网-
目录Java实现网络爬虫框架一、各个类的功能介绍二、各个类Java实现网络爬虫框架的源码
我目前正在从事与搜索相关的项目。我需要抓取互联网上的一些链接并将它们存储在索引库中。虽然有很多强大的开源爬虫框架,但是我抱着学习的态度写了一个简单的网络爬虫。了解原理。今天就给小伙伴们分享一下这个简单的爬虫程序!!
一、各个类的作用DownloadPage.java的作用就是下载这个超链接的页面源代码。FunctionUtils.java的作用是提供不同的静态方法,包括:页面链接正则表达式匹配、URL链接获取判断是否创建文件、获取页面的Url并转换为标准化的Url、拦截目标网页源文件的内容。HrefOfPage.java 的作用是获取页面源代码的超链接。UrlDataHanding.java 的作用是集成各种类,实现url获取数据到数据处理类。UrlQueue.java 未访问的 Url 队列。VisitedUrlQueue.java 已访问的 URL 队列。二、各个类的源码
DownloadPage.java 为此类使用 HttpClient 组件。
package com.sreach.spider;
import java.io.IOException;
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;
/**
* @author binghe
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrl(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) {
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
此类的 FunctionUtils.java 方法是静态方法
<p>
package com.sreach.spider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author binghe
*/
public class FunctionUtils {
/**
* 匹配超链接的正则表达式
*/
private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";
private static Pattern pattern = Pattern.compile(pat);
private static BufferedWriter writer = null;
/**
* 爬虫搜索深度
*/
public static int depth = 0;
/**
* 以"/"来分割URL,获得超链接的元素
*
* @param url
* @return
*/
public static String[] divUrl(String url) {
return url.split("/");
}
/**
* 判断是否创建文件
*
* @param url
* @return
*/
public static boolean isCreateFile(String url) {
Matcher matcher = pattern.matcher(url);
return matcher.matches();
}
/**
* 创建对应文件
*
* @param content
* @param urlPath
*/
public static void createFile(String content, String urlPath) {
/* 分割url */
String[] elems = divUrl(urlPath);
StringBuffer path = new StringBuffer();
File file = null;
for (int i = 1; i < elems.length; i++) {
if (i != elems.length - 1) {
path.append(elems[i]);
path.append(File.separator);
file = new File("D:" + File.separator + path.toString());
}
if (i == elems.length - 1) {
Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");
Matcher matcher = pattern.matcher(elems[i]);
if ((matcher.matches())) {
if (!file.exists()) {
file.mkdirs();
}
String[] fileName = elems[i].split("\\.");
file = new File("D:" + File.separator + path.toString()
+ File.separator + fileName[0] + ".txt");
try {
file.createNewFile();
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file)));
writer.write(content);
writer.flush();
writer.close();
System.out.println("创建文件成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 获取页面的超链接并将其转换为正式的A标签
*
* @param href
* @return
*/
public static String getHrefOfInOut(String href) {
/* 内外部链接最终转化为完整的链接格式 */
String resultHref = null;
/* 判断是否为外部链接 */
if (href.startsWith("http://")) {
resultHref = href;
} else {
/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */
if (href.startsWith("/")) {
resultHref = "http://www.oschina.net" + href;
}
}
return resultHref;
}
/**
* 截取网页网页源文件的目标内容
*
* @param content
* @return
*/
public static String getGoalContent(String content) {
int sign = content.indexOf("
java爬虫抓取动态网页(让你在5分钟之内写好一个爬虫)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-07 23:08
小型的:
目标是让你在 5 分钟内编写一个爬虫。参考crawler4j,如果经常需要写爬虫,就需要写很多爬虫,还是不错的,因为上手肯定要5分钟以上。缺点是它不是很可定制。
垂直、全栈、模块化爬虫。它更适合捕捉特定领域的信息。收录下载、调度、持久化、页面处理等模块。您可以自己实现每个模块,也可以选择它已经为您实现的解决方案。这使得它高度可定制。
看看它的例子:
编写第一个爬虫
1 import us.codecraft.webmagic.Page;
2 import us.codecraft.webmagic.Site;
3 import us.codecraft.webmagic.Spider;
4 import us.codecraft.webmagic.processor.PageProcessor;
5
6 public class GithubRepoPageProcessor implements PageProcessor {
7
8 private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
9
10 @Override
11 public void process(Page page) {
12 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
13 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
14 page.putField("name", page.getHtml().xpath("//h1[@class=\'entry-title public\']/strong/a/text()").toString());
15 if (page.getResultItems().get("name")==null){
16 //skip this page
17 page.setSkip(true);
18 }
19 page.putField("readme", page.getHtml().xpath("//div[@id=\'readme\']/tidyText()"));
20 }
21
22 @Override
23 public Site getSite() {
24 return site;
25 }
26
27 public static void main(String[] args) {
28 Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
29 }
30 }
使用注解编写爬虫
1 @TargetUrl("https://github.com/\\w+/\\w+")
2 @HelpUrl("https://github.com/\\w+")
3 public class GithubRepo {
4
5 @ExtractBy(value = "//h1[@class=\'entry-title public\']/strong/a/text()", notNull = true)
6 private String name;
7
8 @ExtractByUrl("https://github\\.com/(\\w+)/.*")
9 private String author;
10
11 @ExtractBy("//div[@id=\'readme\']/tidyText()")
12 private String readme;
13
14 public static void main(String[] args) {
15 OOSpider.create(Site.me().setSleepTime(1000)
16 , new ConsolePageModelPipeline(), GithubRepo.class)
17 .addUrl("https://github.com/code4craft").thread(5).run();
18 }
19 }
无论哪种方式,都可以抓取github项目。 查看全部
java爬虫抓取动态网页(让你在5分钟之内写好一个爬虫)
小型的:
目标是让你在 5 分钟内编写一个爬虫。参考crawler4j,如果经常需要写爬虫,就需要写很多爬虫,还是不错的,因为上手肯定要5分钟以上。缺点是它不是很可定制。
垂直、全栈、模块化爬虫。它更适合捕捉特定领域的信息。收录下载、调度、持久化、页面处理等模块。您可以自己实现每个模块,也可以选择它已经为您实现的解决方案。这使得它高度可定制。
看看它的例子:
编写第一个爬虫
1 import us.codecraft.webmagic.Page;
2 import us.codecraft.webmagic.Site;
3 import us.codecraft.webmagic.Spider;
4 import us.codecraft.webmagic.processor.PageProcessor;
5
6 public class GithubRepoPageProcessor implements PageProcessor {
7
8 private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
9
10 @Override
11 public void process(Page page) {
12 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
13 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
14 page.putField("name", page.getHtml().xpath("//h1[@class=\'entry-title public\']/strong/a/text()").toString());
15 if (page.getResultItems().get("name")==null){
16 //skip this page
17 page.setSkip(true);
18 }
19 page.putField("readme", page.getHtml().xpath("//div[@id=\'readme\']/tidyText()"));
20 }
21
22 @Override
23 public Site getSite() {
24 return site;
25 }
26
27 public static void main(String[] args) {
28 Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
29 }
30 }
使用注解编写爬虫
1 @TargetUrl("https://github.com/\\w+/\\w+")
2 @HelpUrl("https://github.com/\\w+")
3 public class GithubRepo {
4
5 @ExtractBy(value = "//h1[@class=\'entry-title public\']/strong/a/text()", notNull = true)
6 private String name;
7
8 @ExtractByUrl("https://github\\.com/(\\w+)/.*")
9 private String author;
10
11 @ExtractBy("//div[@id=\'readme\']/tidyText()")
12 private String readme;
13
14 public static void main(String[] args) {
15 OOSpider.create(Site.me().setSleepTime(1000)
16 , new ConsolePageModelPipeline(), GithubRepo.class)
17 .addUrl("https://github.com/code4craft").thread(5).run();
18 }
19 }
无论哪种方式,都可以抓取github项目。
java爬虫抓取动态网页(Java爬虫遇到需要登录的网站,该怎么办还是反向解析法呢)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-21 01:06
这是 Java 爬虫系列的第三篇文章。上一篇Java爬虫遇到网站需要登录,怎么办?在本文中,我们简要说明了爬虫遇到的登录问题的解决方案。在这个文章中,我们来谈谈遇到爬虫时数据异步加载的问题。这也是爬虫常见的问题。
现在很多都是前后端分离的项目,这会让数据异步加载的问题更加突出,所以在爬取的时候遇到这样的问题不要惊讶,不要慌。一般来说,这种问题有两种解决方案:
1、内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,这样我们就可以拿到js渲染出来的页面,这样我们就和采集的静态页面一样了。这种常用的工具有三种:-Selenium-HtmlUnit-PhantomJs
这些工具可以帮助我们解决异步数据加载的问题,但是它们都有缺点,就是效率低下,不稳定。
2、逆向分析法
什么是逆向分析?我们js渲染页面的数据是通过ajax从后端获取的,我们只需要找到对应的ajax请求连接就可以了,这样我们就得到了我们需要的数据,逆向分析方法的优点是这种方式得到的数据都是json格式的,解析起来也比较方便。另一个优点是界面变化的概率相对于页面来说更小。它也有两个缺点。一是在使用Ajax的时候需要耐心和熟练,因为需要在大的推送请求中找到自己想要的东西,二是对JavaScript渲染的页面无能为力。
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用,我以采集网易新闻为例。网易新闻地址:. 使用两种申诉方式获取网易新闻的新闻列表。网易新闻如下:
内置浏览器Selenium方式
Selenium 是一种模拟浏览器进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核进行交互。常用于自动化测试,常用于解决爬虫时的异步加载。如果我们想在项目中使用Selenium,需要做两件事:-1、 在pom.xml中引入Selenium的依赖包添加到
org.seleniumhq.selenium
selenium-java
3.141.59
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
完成以上两步后,我们就可以编写和使用Selenium采集网易新闻了。具体代码如下:
/**
* selenium 解决数据异步加载问题
* https://npm.taobao.org/mirrors/chromedriver/
*
* @param url
*/
public void selenium(String url) {
// 设置 chromedirver 的存放位置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 设置无头浏览器,这样就不会弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
// 获取到要闻新闻列表
List webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
for (WebElement webElement : webElements) {
// 提取新闻连接
String article_url = webElement.getAttribute("href");
// 提取新闻标题
String title = webElement.getText();
if (article_url.contains("https://news.163.com/")) {
System.out.println("文章标题:" + title + " ,文章链接:" + article_url);
}
}
webDriver.close();
}
运行此方法并得到以下结果:
我们已经使用Selenium正确提取了网易新闻列表。
逆向分析
逆向分析的方法是通过ajax异步获取链接获取数据,直接获取新闻数据。如果没有技巧,找Ajax的过程会很痛苦,因为一个页面加载的链接太多,看看网易新闻的网络:
有数百个请求,我如何找到哪个请求获取新闻数据?如果不嫌麻烦,可以一一上点。你绝对可以找到它们。另一种快速的方法是使用网络的搜索功能。如果你不知道搜索按钮,我在上图中圈出了它。只需在新闻中复制一个新闻标题,然后搜索,即可得到结果,如下图所示:
这样我们就快速获取到了重要新闻数据的请求链接,链接为:访问链接,查看链接返回的数据,如下图:
从数据上可以看出,我们需要的数据都在这里了,所以我们只需要解析这一段数据。从这条数据中解析新闻标题和新闻链接有两种方式,一种是正则表达式,另一种是将数据转成json或者list。这里我选择第二种方法,使用fastjson将返回的数据转换成JSONArray。所以我们要引入fastjson,并在pom.xml中引入fastjson依赖:
com.alibaba
fastjson
1.2.59
除了引入fastjson依赖之外,我们还需要对转换前的数据进行简单的处理,因为当前数据不符合list的格式,需要去掉data_callback(也是最后一个)。获取网易新闻的具体逆向分析代码如下:
<p>/**
* 使用反向解析法 解决数据异步加载的问题
*
* @param url
*/
public void httpclientMethod(String url) throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "GBK");
// 先替换掉最前面的 data_callback(
body = body.replace("data_callback(", "");
// 过滤掉最后面一个 )右括号
body = body.substring(0, body.lastIndexOf(")"));
// 将 body 转换成 JSONArray
JSONArray jsonArray = JSON.parseArray(body);
for (int i = 0; i 查看全部
java爬虫抓取动态网页(Java爬虫遇到需要登录的网站,该怎么办还是反向解析法呢)
这是 Java 爬虫系列的第三篇文章。上一篇Java爬虫遇到网站需要登录,怎么办?在本文中,我们简要说明了爬虫遇到的登录问题的解决方案。在这个文章中,我们来谈谈遇到爬虫时数据异步加载的问题。这也是爬虫常见的问题。
现在很多都是前后端分离的项目,这会让数据异步加载的问题更加突出,所以在爬取的时候遇到这样的问题不要惊讶,不要慌。一般来说,这种问题有两种解决方案:
1、内置浏览器内核
内置浏览器就是在爬虫程序中启动一个浏览器内核,这样我们就可以拿到js渲染出来的页面,这样我们就和采集的静态页面一样了。这种常用的工具有三种:-Selenium-HtmlUnit-PhantomJs
这些工具可以帮助我们解决异步数据加载的问题,但是它们都有缺点,就是效率低下,不稳定。
2、逆向分析法
什么是逆向分析?我们js渲染页面的数据是通过ajax从后端获取的,我们只需要找到对应的ajax请求连接就可以了,这样我们就得到了我们需要的数据,逆向分析方法的优点是这种方式得到的数据都是json格式的,解析起来也比较方便。另一个优点是界面变化的概率相对于页面来说更小。它也有两个缺点。一是在使用Ajax的时候需要耐心和熟练,因为需要在大的推送请求中找到自己想要的东西,二是对JavaScript渲染的页面无能为力。
以上是异步数据加载的两种解决方案。为了加深大家的理解以及如何在项目中使用,我以采集网易新闻为例。网易新闻地址:. 使用两种申诉方式获取网易新闻的新闻列表。网易新闻如下:

内置浏览器Selenium方式
Selenium 是一种模拟浏览器进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核进行交互。常用于自动化测试,常用于解决爬虫时的异步加载。如果我们想在项目中使用Selenium,需要做两件事:-1、 在pom.xml中引入Selenium的依赖包添加到
org.seleniumhq.selenium
selenium-java
3.141.59
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
完成以上两步后,我们就可以编写和使用Selenium采集网易新闻了。具体代码如下:
/**
* selenium 解决数据异步加载问题
* https://npm.taobao.org/mirrors/chromedriver/
*
* @param url
*/
public void selenium(String url) {
// 设置 chromedirver 的存放位置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
// 设置无头浏览器,这样就不会弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
// 获取到要闻新闻列表
List webElements = webDriver.findElements(By.xpath("//div[@class='news_title']/h3/a"));
for (WebElement webElement : webElements) {
// 提取新闻连接
String article_url = webElement.getAttribute("href");
// 提取新闻标题
String title = webElement.getText();
if (article_url.contains("https://news.163.com/")) {
System.out.println("文章标题:" + title + " ,文章链接:" + article_url);
}
}
webDriver.close();
}
运行此方法并得到以下结果:

我们已经使用Selenium正确提取了网易新闻列表。
逆向分析
逆向分析的方法是通过ajax异步获取链接获取数据,直接获取新闻数据。如果没有技巧,找Ajax的过程会很痛苦,因为一个页面加载的链接太多,看看网易新闻的网络:

有数百个请求,我如何找到哪个请求获取新闻数据?如果不嫌麻烦,可以一一上点。你绝对可以找到它们。另一种快速的方法是使用网络的搜索功能。如果你不知道搜索按钮,我在上图中圈出了它。只需在新闻中复制一个新闻标题,然后搜索,即可得到结果,如下图所示:

这样我们就快速获取到了重要新闻数据的请求链接,链接为:访问链接,查看链接返回的数据,如下图:

从数据上可以看出,我们需要的数据都在这里了,所以我们只需要解析这一段数据。从这条数据中解析新闻标题和新闻链接有两种方式,一种是正则表达式,另一种是将数据转成json或者list。这里我选择第二种方法,使用fastjson将返回的数据转换成JSONArray。所以我们要引入fastjson,并在pom.xml中引入fastjson依赖:
com.alibaba
fastjson
1.2.59
除了引入fastjson依赖之外,我们还需要对转换前的数据进行简单的处理,因为当前数据不符合list的格式,需要去掉data_callback(也是最后一个)。获取网易新闻的具体逆向分析代码如下:
<p>/**
* 使用反向解析法 解决数据异步加载的问题
*
* @param url
*/
public void httpclientMethod(String url) throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpclient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity, "GBK");
// 先替换掉最前面的 data_callback(
body = body.replace("data_callback(", "");
// 过滤掉最后面一个 )右括号
body = body.substring(0, body.lastIndexOf(")"));
// 将 body 转换成 JSONArray
JSONArray jsonArray = JSON.parseArray(body);
for (int i = 0; i
java爬虫抓取动态网页(如何编写爬虫程序爬取网络上有价值的数据信息?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-10-18 19:11
随着互联网+时代的到来,越来越多的互联网公司层出不穷,涉及游戏、视频、新闻、社交、电子商务、房地产、旅游等众多行业。现在互联网已经成为海量信息的载体,如何有效地从中提取有价值的信息并加以利用成为一个巨大的挑战
爬虫这个可怕的怪物,自百度、谷歌等搜索引擎公司诞生以来就一直存在。如今,爬虫在移动互联网时代更加猖獗。每一个网站好像都被它光顾过,看看就知道了。不会,但您可以放心,它不会做坏事。网上能快速查到的信息,应该就是它的功劳了。每天都会被屏蔽采集 网上丰富的信息供大家查询和分享。Java作为互联网开发的主流语言,广泛应用于互联网领域。本课程使用java技术讲解如何编写爬虫程序来爬取互联网上有价值的数据信息。
知识点1.爬虫介绍
当我们访问某个网页时,在地址栏中输入 URL 并按 Enter。网站服务器会返回一个HTML文件给我们,浏览器会解析返回的数据并显示在UI上。同样,爬虫程序也模仿人类操作。向网站发送请求,网站会返回一个HTML文件给爬虫程序,爬虫程序会对返回的数据进行爬取和分析。
1.1 爬虫简介
网络爬虫(Web crawler),又称网络蜘蛛(自动索引器),是一种“自动浏览网页”的程序,或者说是一种网络机器人。
爬虫广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。他们可以自动采集搜索引擎进一步处理他们可以访问的页面的所有内容(对下载的页面进行排序和排序),以便用户可以更快地检索到他们需要的信息。
通俗地说,就是用程序手动打开窗口,输入数据等等。使用程序为你获取你想要的信息,这是一个网络爬虫
1.2个爬虫应用1.2.1个搜索引擎
爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上所有需要的资源。搜索引擎是一个非常庞大而复杂的算法系统。搜索的准确性和效率对搜索系统有很高的要求。
1.2.2 数据挖掘
除了用于搜索之外,爬虫还可以做很多工作。可以说,爬虫现在在互联网项目中得到了广泛的应用。
互联网项目主要通过爬取相关数据进行数据分析,获取价值数据。那么爬虫就可以具体做那个分析了,下面可以简单的理解一下:
App下载量分析1.3 Crawler的原理1.3.1 Crawler的目的
一般来说,我们需要抓取的是某个网站或者某个应用的内容,提取有用的价值,进行数据分析。
1.3.2 履带框架设计
为方便开发,也可以在项目中使用爬虫框架开发爬虫;一个通用的网络爬虫的框架如图所示:
网络爬虫的基本工作流程如下:
首先从精心挑选的种子网址中选取一部分,将这些网址放入待抓取的网址队列中。从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页。存储在下载的网页库中。另外,将这些URL放入已爬取的URL队列,对已爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入URL队列进行爬取,从而进入下一个循环2. Java爬虫框架2.1 Nutch
Nutch 是一个分布式爬虫。爬虫使用分布式爬虫解决两个问题:1)海量URL管理;2) 网速。如果你想做一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与solr 或es 合作组成了非常强大的搜索引擎,否则尽量不要选择Nutch 作为爬虫。用Nutch做爬虫的二次开发,爬虫的准备和调试时间往往是单机爬虫的十倍以上。
2.2 Heritrix
Heritrix 是一个“档案爬虫”——获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。爬虫主要通过Web用户界面启动、监控和调整,可以灵活定义获取URL。
2.3 crawler4j
crawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
2.4 WebCollector
WebCollector 使用Nutch 的爬虫逻辑(分层广度遍历)、Crawler4j 的用户界面(涵盖访问方法、定义用户操作),以及一套自己的插件机制来设计一个爬虫内核。
2.5 WebMagic
WebMagic 项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则收录了一些方便实用的功能。WebMagic 的架构设计参考了 Scrapy,目标是尽可能模块化,体现爬虫的功能特性。 查看全部
java爬虫抓取动态网页(如何编写爬虫程序爬取网络上有价值的数据信息?)
随着互联网+时代的到来,越来越多的互联网公司层出不穷,涉及游戏、视频、新闻、社交、电子商务、房地产、旅游等众多行业。现在互联网已经成为海量信息的载体,如何有效地从中提取有价值的信息并加以利用成为一个巨大的挑战
爬虫这个可怕的怪物,自百度、谷歌等搜索引擎公司诞生以来就一直存在。如今,爬虫在移动互联网时代更加猖獗。每一个网站好像都被它光顾过,看看就知道了。不会,但您可以放心,它不会做坏事。网上能快速查到的信息,应该就是它的功劳了。每天都会被屏蔽采集 网上丰富的信息供大家查询和分享。Java作为互联网开发的主流语言,广泛应用于互联网领域。本课程使用java技术讲解如何编写爬虫程序来爬取互联网上有价值的数据信息。
知识点1.爬虫介绍
当我们访问某个网页时,在地址栏中输入 URL 并按 Enter。网站服务器会返回一个HTML文件给我们,浏览器会解析返回的数据并显示在UI上。同样,爬虫程序也模仿人类操作。向网站发送请求,网站会返回一个HTML文件给爬虫程序,爬虫程序会对返回的数据进行爬取和分析。

1.1 爬虫简介
网络爬虫(Web crawler),又称网络蜘蛛(自动索引器),是一种“自动浏览网页”的程序,或者说是一种网络机器人。
爬虫广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。他们可以自动采集搜索引擎进一步处理他们可以访问的页面的所有内容(对下载的页面进行排序和排序),以便用户可以更快地检索到他们需要的信息。
通俗地说,就是用程序手动打开窗口,输入数据等等。使用程序为你获取你想要的信息,这是一个网络爬虫
1.2个爬虫应用1.2.1个搜索引擎
爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上所有需要的资源。搜索引擎是一个非常庞大而复杂的算法系统。搜索的准确性和效率对搜索系统有很高的要求。

1.2.2 数据挖掘

除了用于搜索之外,爬虫还可以做很多工作。可以说,爬虫现在在互联网项目中得到了广泛的应用。
互联网项目主要通过爬取相关数据进行数据分析,获取价值数据。那么爬虫就可以具体做那个分析了,下面可以简单的理解一下:
App下载量分析1.3 Crawler的原理1.3.1 Crawler的目的
一般来说,我们需要抓取的是某个网站或者某个应用的内容,提取有用的价值,进行数据分析。
1.3.2 履带框架设计
为方便开发,也可以在项目中使用爬虫框架开发爬虫;一个通用的网络爬虫的框架如图所示:
网络爬虫的基本工作流程如下:
首先从精心挑选的种子网址中选取一部分,将这些网址放入待抓取的网址队列中。从待爬取的URL队列中取出待爬取的URL,解析DNS,获取主机IP,下载该URL对应的网页。存储在下载的网页库中。另外,将这些URL放入已爬取的URL队列,对已爬取的URL队列中的URL进行分析,分析其中的其他URL,将这些URL放入URL队列进行爬取,从而进入下一个循环2. Java爬虫框架2.1 Nutch
Nutch 是一个分布式爬虫。爬虫使用分布式爬虫解决两个问题:1)海量URL管理;2) 网速。如果你想做一个搜索引擎,Nutch1.x 是一个非常好的选择。Nutch1.x 与solr 或es 合作组成了非常强大的搜索引擎,否则尽量不要选择Nutch 作为爬虫。用Nutch做爬虫的二次开发,爬虫的准备和调试时间往往是单机爬虫的十倍以上。
2.2 Heritrix
Heritrix 是一个“档案爬虫”——获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。爬虫主要通过Web用户界面启动、监控和调整,可以灵活定义获取URL。
2.3 crawler4j
crawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
2.4 WebCollector
WebCollector 使用Nutch 的爬虫逻辑(分层广度遍历)、Crawler4j 的用户界面(涵盖访问方法、定义用户操作),以及一套自己的插件机制来设计一个爬虫内核。
2.5 WebMagic
WebMagic 项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则收录了一些方便实用的功能。WebMagic 的架构设计参考了 Scrapy,目标是尽可能模块化,体现爬虫的功能特性。
java爬虫抓取动态网页(GitHub上有哪些优秀的Java爬虫项目?这些项目来自github和开源中国 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-10-18 06:07
)
本文文章来自我的回答:GitHub上有哪些优秀的Java爬虫项目?但是在这个答案中,进行了一些更改并添加了一些项目。这些项目来自github和开源中国。希望这些开源的Java爬虫项目对大家有所帮助。阅读源代码可以帮助您获得质的提升。
1、格科
github地址:xtuhcy/gecco
Gecco是一个用java语言开发的轻量级易用的网络爬虫。集成了jsoup、httpclient、fastjson、spring、htmlunit、redission等框架,只需要配置一些jquery风格的选择器即可快速编写爬虫。Gecco 框架具有出色的可扩展性。框架基于开闭原则设计,对修改封闭,对扩展开放。
2、WebCollector
github地址:CrawlScript/WebCollector
WebCollector是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,用少量的代码就可以实现强大的爬虫。WebCollector-Hadoop 是WebCollector 的Hadoop 版本,支持分布式爬取。
3、蜘蛛侠
码云地址:l-weiwei/Spiderman2-码云-开源中国
用例:展示垂直爬虫的能力——像风一样自由
蜘蛛侠是一个基于微内核+插件架构的网络蜘蛛。它的目标是将复杂的目标网页信息以简单的方式捕获并解析成它需要的业务数据。
4、WebMagic
码云地址:flashsword20/webmagic-码云-中国开源
webmagic是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。
5、Heritrix
Github 地址:internetarchive/heritrix3Heritrix 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循 robots.txt 文件和 META 机器人标签的排除说明。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。
6、crawler4j
GitHub 地址:yasserg/crawler4j · GitHubcrawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
7、纳奇
github地址:apache/nutch
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
在 Nutch 的发展过程中,产生了四个 Java 开源项目,Hadoop、Tika、Gora 和 Crawler Commons。现在这四个项目发展迅速,非常火爆,尤其是Hadoop,已经成为大规模数据处理的事实标准。Tika 使用各种现有的开源内容分析项目从多种格式的文件中提取元数据和结构化文本。Gora 支持将大数据持久化到多个存储实现。Crawler Commons 是一个通用的网络爬虫组件。.
8、SeimiCrawler
github地址:zhegexiaohuozi/SeimiCrawler
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 的灵感来自于 Python 的爬虫框架 Scrapy,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler 的默认 HTML 解析器是 JsoupXpath(独立扩展项目,不收录在 jsoup 中),HTML 数据的默认解析和提取是使用 XPath 完成的(当然,您也可以选择其他解析器进行数据处理)。并结合SeimiAgent,彻底解决复杂的动态页面渲染和爬取问题。
9、Jsoup
github地址:jhy/jsoup
中文指南:jsoup开发指南、jsoup中文文档
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
查看全部
java爬虫抓取动态网页(GitHub上有哪些优秀的Java爬虫项目?这些项目来自github和开源中国
)
本文文章来自我的回答:GitHub上有哪些优秀的Java爬虫项目?但是在这个答案中,进行了一些更改并添加了一些项目。这些项目来自github和开源中国。希望这些开源的Java爬虫项目对大家有所帮助。阅读源代码可以帮助您获得质的提升。
1、格科
github地址:xtuhcy/gecco
Gecco是一个用java语言开发的轻量级易用的网络爬虫。集成了jsoup、httpclient、fastjson、spring、htmlunit、redission等框架,只需要配置一些jquery风格的选择器即可快速编写爬虫。Gecco 框架具有出色的可扩展性。框架基于开闭原则设计,对修改封闭,对扩展开放。
2、WebCollector
github地址:CrawlScript/WebCollector
WebCollector是一个无需配置,方便二次开发的JAVA爬虫框架(内核)。它提供了精简的API,用少量的代码就可以实现强大的爬虫。WebCollector-Hadoop 是WebCollector 的Hadoop 版本,支持分布式爬取。

3、蜘蛛侠
码云地址:l-weiwei/Spiderman2-码云-开源中国
用例:展示垂直爬虫的能力——像风一样自由
蜘蛛侠是一个基于微内核+插件架构的网络蜘蛛。它的目标是将复杂的目标网页信息以简单的方式捕获并解析成它需要的业务数据。
4、WebMagic
码云地址:flashsword20/webmagic-码云-中国开源
webmagic是一个爬虫框架,不需要配置,方便二次开发。提供简单灵活的API,少量代码即可实现爬虫。webmagic采用完全模块化设计,功能覆盖爬虫全生命周期(链接提取、页面下载、内容提取、持久化),支持多线程爬取、分布式爬取,支持自动重试、自定义UA/Cookies等功能。

5、Heritrix
Github 地址:internetarchive/heritrix3Heritrix 是一个开源、可扩展的网络爬虫项目。用户可以使用它从互联网上获取他们想要的资源。Heritrix 的设计严格遵循 robots.txt 文件和 META 机器人标签的排除说明。其最突出的特点是良好的扩展性,方便用户实现自己的抓取逻辑。

6、crawler4j
GitHub 地址:yasserg/crawler4j · GitHubcrawler4j 是一个用 Java 实现的开源网络爬虫。提供简单易用的界面,您可以在几分钟内创建一个多线程的网络爬虫。
7、纳奇
github地址:apache/nutch
Nutch 是一个用开源 Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的所有工具。包括全文搜索和网络爬虫。
在 Nutch 的发展过程中,产生了四个 Java 开源项目,Hadoop、Tika、Gora 和 Crawler Commons。现在这四个项目发展迅速,非常火爆,尤其是Hadoop,已经成为大规模数据处理的事实标准。Tika 使用各种现有的开源内容分析项目从多种格式的文件中提取元数据和结构化文本。Gora 支持将大数据持久化到多个存储实现。Crawler Commons 是一个通用的网络爬虫组件。.
8、SeimiCrawler
github地址:zhegexiaohuozi/SeimiCrawler
SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 的灵感来自于 Python 的爬虫框架 Scrapy,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler 的默认 HTML 解析器是 JsoupXpath(独立扩展项目,不收录在 jsoup 中),HTML 数据的默认解析和提取是使用 XPath 完成的(当然,您也可以选择其他解析器进行数据处理)。并结合SeimiAgent,彻底解决复杂的动态页面渲染和爬取问题。


9、Jsoup
github地址:jhy/jsoup
中文指南:jsoup开发指南、jsoup中文文档
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。

java爬虫抓取动态网页(这是移动端微博信息_selenium_sina__)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-18 05:13
这是一个新浪微博爬虫,使用python+selenium实现。免费资源,希望对你有帮助,虽然是傻瓜式爬虫,但至少能跑。同时在rar中收录了源代码和爬取示例。参考我的文章:【python爬虫】Selenium爬取新浪微博内容和用户信息【python爬虫】Selenium爬取新浪微博客户端用户信息、热点话题和评论(上) 主要爬取内容包括:新浪微博手机用户信息和微博信息。用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等安装过程:1. 先安装Python环境,作者是Python2.7.82.然后安装pip或者easy_install3.通过命令pip install selenium来安装selenium,是一个自动测试爬取工具4.然后修改代码中的用户名和密码,填写自己的用户名和密码5.运行程序,自动调用火狐浏览器登录到微博。注:手机信息更精致简洁,动态加载没有限制,只是显示微博或粉丝id等20个页面,这是它的缺点;虽然客户端可能有动态加载,比如评论和微博,但它的信息更完整。【源码】爬取手机微博信息spider_selenium_sina_content.py 输入: 查看全部
java爬虫抓取动态网页(这是移动端微博信息_selenium_sina__)
这是一个新浪微博爬虫,使用python+selenium实现。免费资源,希望对你有帮助,虽然是傻瓜式爬虫,但至少能跑。同时在rar中收录了源代码和爬取示例。参考我的文章:【python爬虫】Selenium爬取新浪微博内容和用户信息【python爬虫】Selenium爬取新浪微博客户端用户信息、热点话题和评论(上) 主要爬取内容包括:新浪微博手机用户信息和微博信息。用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等安装过程:1. 先安装Python环境,作者是Python2.7.82.然后安装pip或者easy_install3.通过命令pip install selenium来安装selenium,是一个自动测试爬取工具4.然后修改代码中的用户名和密码,填写自己的用户名和密码5.运行程序,自动调用火狐浏览器登录到微博。注:手机信息更精致简洁,动态加载没有限制,只是显示微博或粉丝id等20个页面,这是它的缺点;虽然客户端可能有动态加载,比如评论和微博,但它的信息更完整。【源码】爬取手机微博信息spider_selenium_sina_content.py 输入:
java爬虫抓取动态网页(技术公开了基于Ajax的新闻网页动态数据的抓取方法及系统)
网站优化 • 优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2021-10-18 05:07
本发明专利技术公开了一种基于Ajax的新闻网页动态数据抓取方法及系统;建立新闻网页抓取内容库,设置新闻网页抓取内容库的编码方式;获取待抓取新闻网页的新闻列表页的URL地址信息;访问URL地址,判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具找到请求的数据源;判断请求的数据源的编码是否一致,如果不一致,则对数据源进行编码转换,解析数据格式:将数据源的格式解析为消息的后台语言处理的对象格式或数组格式列表页面;将解析后的数据封装成对象或数组类型;判断是否封装成功,成功只需遍历数据对象或数组类型的输出列表;使用网络爬虫获取的输出列表采集;将采集收到的数据存入数据库。
基于Ajax的新闻网页动态数据抓取方法及系统
本发明公开了一种基于Ajax的动态新闻网络爬取数据的系统及方法;建立新闻网络爬取内容库,设置新闻网络爬取内容库编码;用于抓取新闻网页新闻页面的地址 URL;访问URL地址,判断新闻页面是否是通过Ajax数据的动态加载;如果是,通过浏览器开发者工具找到请求的数据源;判断请求数据源编码是否一致,如果不一致,则进行数据源编码转换,分析数据格式:格式数据源成为后台语言处理对象格式或数组数据格式的新闻页面;分析对象或数组类型判断后的包;打包成功,成功将数据对象或数组类型 爬虫采集的输出列表,
下载所有详细的技术数据
【技术实现步骤总结】
本专利技术涉及一种基于Ajax的新闻网页动态数据捕获方法及系统。
技术介绍
目前,新闻网站的信息具有类别多、更新频率快、多平台发布的特点,数据检索方式也非常灵活。很多新闻网站页面使用ajax来调用数据,这样通过一个数据源就可以在不同的平台上进行解析。例如,PC 网页和移动网页可以通过不同的模板共享数据请求。呈现不同的排版风格。在采集爬取网站新闻数据,会发现很多网站数据是通过ajax获取的动态内容,并没有固定的静态模板。获取数据的 JavaScript 脚本程序往往在整个页面的 DOM 结构加载完毕后执行。如果整个网页的 DOM 结构还没有被加载,网络爬虫在访问这个地方时不会获取数据内容,大大降低了网络数据的效率和质量采集。如果需要获取通过ajax请求动态加载的数据,则需要分析网站的请求的数据源地址。Ajax调用的数据格式多为JSON、JSONP、XML或Inc。经过分析,不同的网站使用不同的网络技术,因此调用Ajax请求时采用的方案也有很大差异,数据源存储格式也是多种多样的。通过对现有技术的分析,发现目前还没有统一的自动化的Ajax数据源分析方法,现有的方法不能解决Ajax一次性获取动态内容的所有问题。
首先,大部分的实现方法还是通过JavaScript脚本中的特征值进行检索,从而进一步猜测和推断Ajax请求的内容。但是,这并不能准确地找出您要采集 的目标数据。目前一个页面很可能收录多个ajax请求,有的是用户信息认证请求,有的是订阅信息的返回数据,有的是广告推送信息。这些信息混杂在一起,仅通过脚本代码中的特征值很难区分哪些数据源需要采集。另外,脚本代码的特征值分析也仅限于JavaScript代码未加密的情况。如今,许多网站出于安全性和访问效率的要求,可能会组合多个JavaScript脚本文件,然后对其进行加密。它会使现有的特征值消失。其次,Ajax调用方法本身会存在跨域问题,这是其自身独有的安全机制。即不在同一个域名下,脚本语言仍然无法成功执行请求并返回数据。在处理这样的调用方式时,由于没有统一域名下的网络环境,很难自动完成Ajax触发请求。也有一些网站在他们的程序中有反爬虫程序。如果经常被访问,二维码等内容会阻止新闻数据的继续采集。最后,即使找到了 Ajax 请求的数据源,仍然会出现格式和编码不匹配的情况。例如,JAVA 语言生成的 JSON 数据不能直接用 PHP 语言处理。一些返回的数据在 JSON 格式本身中会有英文双引号和符号冲突。也有一些请求使用JSONP请求方式,即带有请求头的JSON格式。
技术实现思路
本专利技术的目的是为了解决上述问题,提供一种基于Ajax的新闻网页动态数据捕获方法和系统。专注于数据源的战略分析,针对不同情况采用定制化解决方案。为实现上述目的,本专利技术采用如下技术方案: 基于Ajax的新闻网页动态数据抓取方法,包括以下步骤: 步骤(101):建立新闻网页抓取内容数据库,并设置新闻网页爬取获取内容库的编码方式;获取要爬取的新闻页面的新闻列表页面的URL地址;步骤(102):访问新闻的URL地址要抓取的新闻页面的列表页面,通过浏览器开发者工具判断新闻列表页面是否通过Ajax动态加载;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果没有,结束;step (103): 判断Ajax请求的数据源是否与步骤(101))的编码方式一致。如果不一致,则对数据源进行编码转换,然后去step(104);如果一致,直接进入step(104); Step(104):解析数据格式:将数据源的格式解析成对象新闻列表页面后台语言处理的格式或数组格式; Step (105): Change step (10 4) 将解析的数据封装成对象或数组类型;判断封装是否为成功的,
特殊字符或乱码批量替换,转换为可处理的字符。特殊字符包括:斜线、反斜线、冒号、星号、问号、引号、大于号、小于号或可能影响 JSON 格式的管道符号。可处理的字符包括中文引号、中文逗号、中文冒号等。 步骤(103):如果编码方式不同,则统一编码方式,UTF-8的编码方式步骤(102)和步骤(103))之间设置步骤如下: 步骤(1020):如果Ajax请求是跨域的请求,通过PHP的CURL方式模拟传入页面,通过主机获取请求数据地址;
如果返回的内容收录中英文单引号,如果双引号不规范,使用PHP语言的字符替换功能过滤特殊字符,替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。
由于上述原因,需要去除返回内容的请求头和括号。步骤(1043): 因为有些特殊字符会影响格式规范,有些特殊字符无法识别,所以在封装数据之前,要对这些特殊字符进行处理,即批量替换。空字符。步骤(105):如果步骤(104))解析的数据不是键值对类型,那么步骤(104))解析的数据将封装成data对象,如果步骤(104)中解析的数据是键值对类型,则步骤(104))解析的数据
【技术保护点】
@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(10 6):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(106):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。
【技术特点摘要】
1.一种基于Ajax的新闻网页动态数据抓取方法,其特点是如下步骤: 步骤(101):建立新闻网页爬取内容库,建立新闻网页爬取内容库编码方法; 获取待抓取新闻页面的新闻列表页面的URL地址; 步骤(102):访问待抓取新闻页面的新闻列表页面的URL地址,使用浏览器开发者工具判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具查找ajax请求的数据源;如果不是,则结束;步骤(103):确定ajax请求的数据源和步骤(10)1)的编码方式是否一致,如果不一致,对数据源进行编码转换,然后转步骤(104);如果一致,直接转步骤(104);步骤(104):分析数据)格式:将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;步骤(105):更改步骤(104)将解析的数据封装转化为对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106);否则,将数据作为字符串处理;完成后,进入步骤(106)) @)>; Step(106):遍历数据对象或数组类型输出列表; Step(107):使用网络爬虫采集 Step(106)@ > 获取输出列表;步骤 (108):将来自 采集 的数据存储在数据库中。
2.如权利要求1所述的基于Ajax的新闻网页动态数据抓取方法,其特征在于步骤(101)URL地址包括临时URL地址和重定向地址,需要添加时间戳参数或签名参数后访问的URL地址;步骤(101))的新闻网络爬取内容库的字段包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源和新闻内容;所述步骤(101))的新闻网页抓取的内容数据库的编码方法包括:UTF-8编码或GBK编码。3.如权利要求1所述的动态抓取方法基于Ajax的新闻网页数据特征在于步骤(102)的浏览器开发工具包括:谷歌Chrome开发工具。4.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于步骤(103)如果Ajax请求的数据源中存在特殊字符或乱码5.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于,步骤(10) 3):如果编码方式不同,则统一编码方式,统一采用UTF-8编码方式。 2.权利要求1,其特征在于步骤(102)与步骤(103))之间的步骤如下:步骤(1020):如果Ajax请求是跨域请求,通过PHP的CURL方法模拟传入页面,通过host获取请求的数据地址;步骤(1021):如果Ajax 请求是 P...
【专利技术属性】
技术研发人员:张紫阳、韩强、梁成富、李广庆、李斌、
申请人(专利权):,
类型:发明
国家省市:山东;37
下载所有详细技术资料 我是此专利的所有者 查看全部
java爬虫抓取动态网页(技术公开了基于Ajax的新闻网页动态数据的抓取方法及系统)
本发明专利技术公开了一种基于Ajax的新闻网页动态数据抓取方法及系统;建立新闻网页抓取内容库,设置新闻网页抓取内容库的编码方式;获取待抓取新闻网页的新闻列表页的URL地址信息;访问URL地址,判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具找到请求的数据源;判断请求的数据源的编码是否一致,如果不一致,则对数据源进行编码转换,解析数据格式:将数据源的格式解析为消息的后台语言处理的对象格式或数组格式列表页面;将解析后的数据封装成对象或数组类型;判断是否封装成功,成功只需遍历数据对象或数组类型的输出列表;使用网络爬虫获取的输出列表采集;将采集收到的数据存入数据库。
基于Ajax的新闻网页动态数据抓取方法及系统
本发明公开了一种基于Ajax的动态新闻网络爬取数据的系统及方法;建立新闻网络爬取内容库,设置新闻网络爬取内容库编码;用于抓取新闻网页新闻页面的地址 URL;访问URL地址,判断新闻页面是否是通过Ajax数据的动态加载;如果是,通过浏览器开发者工具找到请求的数据源;判断请求数据源编码是否一致,如果不一致,则进行数据源编码转换,分析数据格式:格式数据源成为后台语言处理对象格式或数组数据格式的新闻页面;分析对象或数组类型判断后的包;打包成功,成功将数据对象或数组类型 爬虫采集的输出列表,
下载所有详细的技术数据
【技术实现步骤总结】
本专利技术涉及一种基于Ajax的新闻网页动态数据捕获方法及系统。
技术介绍
目前,新闻网站的信息具有类别多、更新频率快、多平台发布的特点,数据检索方式也非常灵活。很多新闻网站页面使用ajax来调用数据,这样通过一个数据源就可以在不同的平台上进行解析。例如,PC 网页和移动网页可以通过不同的模板共享数据请求。呈现不同的排版风格。在采集爬取网站新闻数据,会发现很多网站数据是通过ajax获取的动态内容,并没有固定的静态模板。获取数据的 JavaScript 脚本程序往往在整个页面的 DOM 结构加载完毕后执行。如果整个网页的 DOM 结构还没有被加载,网络爬虫在访问这个地方时不会获取数据内容,大大降低了网络数据的效率和质量采集。如果需要获取通过ajax请求动态加载的数据,则需要分析网站的请求的数据源地址。Ajax调用的数据格式多为JSON、JSONP、XML或Inc。经过分析,不同的网站使用不同的网络技术,因此调用Ajax请求时采用的方案也有很大差异,数据源存储格式也是多种多样的。通过对现有技术的分析,发现目前还没有统一的自动化的Ajax数据源分析方法,现有的方法不能解决Ajax一次性获取动态内容的所有问题。
首先,大部分的实现方法还是通过JavaScript脚本中的特征值进行检索,从而进一步猜测和推断Ajax请求的内容。但是,这并不能准确地找出您要采集 的目标数据。目前一个页面很可能收录多个ajax请求,有的是用户信息认证请求,有的是订阅信息的返回数据,有的是广告推送信息。这些信息混杂在一起,仅通过脚本代码中的特征值很难区分哪些数据源需要采集。另外,脚本代码的特征值分析也仅限于JavaScript代码未加密的情况。如今,许多网站出于安全性和访问效率的要求,可能会组合多个JavaScript脚本文件,然后对其进行加密。它会使现有的特征值消失。其次,Ajax调用方法本身会存在跨域问题,这是其自身独有的安全机制。即不在同一个域名下,脚本语言仍然无法成功执行请求并返回数据。在处理这样的调用方式时,由于没有统一域名下的网络环境,很难自动完成Ajax触发请求。也有一些网站在他们的程序中有反爬虫程序。如果经常被访问,二维码等内容会阻止新闻数据的继续采集。最后,即使找到了 Ajax 请求的数据源,仍然会出现格式和编码不匹配的情况。例如,JAVA 语言生成的 JSON 数据不能直接用 PHP 语言处理。一些返回的数据在 JSON 格式本身中会有英文双引号和符号冲突。也有一些请求使用JSONP请求方式,即带有请求头的JSON格式。
技术实现思路
本专利技术的目的是为了解决上述问题,提供一种基于Ajax的新闻网页动态数据捕获方法和系统。专注于数据源的战略分析,针对不同情况采用定制化解决方案。为实现上述目的,本专利技术采用如下技术方案: 基于Ajax的新闻网页动态数据抓取方法,包括以下步骤: 步骤(101):建立新闻网页抓取内容数据库,并设置新闻网页爬取获取内容库的编码方式;获取要爬取的新闻页面的新闻列表页面的URL地址;步骤(102):访问新闻的URL地址要抓取的新闻页面的列表页面,通过浏览器开发者工具判断新闻列表页面是否通过Ajax动态加载;如果是,通过浏览器开发者工具找到Ajax请求的数据源;如果没有,结束;step (103): 判断Ajax请求的数据源是否与步骤(101))的编码方式一致。如果不一致,则对数据源进行编码转换,然后去step(104);如果一致,直接进入step(104); Step(104):解析数据格式:将数据源的格式解析成对象新闻列表页面后台语言处理的格式或数组格式; Step (105): Change step (10 4) 将解析的数据封装成对象或数组类型;判断封装是否为成功的,
特殊字符或乱码批量替换,转换为可处理的字符。特殊字符包括:斜线、反斜线、冒号、星号、问号、引号、大于号、小于号或可能影响 JSON 格式的管道符号。可处理的字符包括中文引号、中文逗号、中文冒号等。 步骤(103):如果编码方式不同,则统一编码方式,UTF-8的编码方式步骤(102)和步骤(103))之间设置步骤如下: 步骤(1020):如果Ajax请求是跨域的请求,通过PHP的CURL方式模拟传入页面,通过主机获取请求数据地址;
如果返回的内容收录中英文单引号,如果双引号不规范,使用PHP语言的字符替换功能过滤特殊字符,替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。使用PHP语言的字符替换功能过滤特殊字符并替换为空字符。step(1042) JSONP是JSON格式的一种使用方式,通常在进行跨域调用的时候使用。因为要对请求进行识别,所以通常使用回调参数作为请求头,而JSON 内容用引号包裹,JSON 格式是带有请求头的 JSON 格式,但是在 JSON 格式解析中,需要将其去掉才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。JSON 格式是带有请求头的 JSON 格式。但是,在 JSON 格式解析中,需要将其删除才能成为标准的 JSON 格式。
由于上述原因,需要去除返回内容的请求头和括号。步骤(1043): 因为有些特殊字符会影响格式规范,有些特殊字符无法识别,所以在封装数据之前,要对这些特殊字符进行处理,即批量替换。空字符。步骤(105):如果步骤(104))解析的数据不是键值对类型,那么步骤(104))解析的数据将封装成data对象,如果步骤(104)中解析的数据是键值对类型,则步骤(104))解析的数据

【技术保护点】
@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。@4); 如果一致,直接进入step(104); step(104):解析数据格式:将数据源的格式解析为后台语言处理的对象格式或数组格式新闻列表页; step(105):将step解析的数据(104) 封装成对象或数组类型;判断封装是否成功,如果成功,直接进入step (106);否则,将数据作为字符串处理;完成后,转到步骤(106);步骤(10 6):遍历数据对象或数组类型到输出list; Step(107):使用网络爬虫采集 Step(106)获取输出列表; Step(108):存储来自采集的数据@> 到数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(10 6):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;step(105):将step(104)解析出来的数据转换成对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106)@) >;否则,将数据作为字符串处理;完成后,转步骤(106);步骤(106):遍历数据对象或数组类型到输出列表;步骤(10< @7):使用网络爬虫采集 Step(106)获取输出列表; Step(108):将采集中的数据存入数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。遍历数据对象或数组类型到输出列表;Step(107):使用网络爬虫采集 Step(106)获取输出列表;Step(108):存储来自采集的数据)到数据库。
【技术特点摘要】
1.一种基于Ajax的新闻网页动态数据抓取方法,其特点是如下步骤: 步骤(101):建立新闻网页爬取内容库,建立新闻网页爬取内容库编码方法; 获取待抓取新闻页面的新闻列表页面的URL地址; 步骤(102):访问待抓取新闻页面的新闻列表页面的URL地址,使用浏览器开发者工具判断新闻列表页面是否通过ajax动态加载数据;如果是,通过浏览器开发者工具查找ajax请求的数据源;如果不是,则结束;步骤(103):确定ajax请求的数据源和步骤(10)1)的编码方式是否一致,如果不一致,对数据源进行编码转换,然后转步骤(104);如果一致,直接转步骤(104);步骤(104):分析数据)格式:将数据源的格式解析为新闻列表页面后台语言处理的对象格式或数组格式;步骤(105):更改步骤(104)将解析的数据封装转化为对象或数组类型;判断是否封装成功,如果成功,直接进入步骤(106);否则,将数据作为字符串处理;完成后,进入步骤(106)) @)>; Step(106):遍历数据对象或数组类型输出列表; Step(107):使用网络爬虫采集 Step(106)@ > 获取输出列表;步骤 (108):将来自 采集 的数据存储在数据库中。
2.如权利要求1所述的基于Ajax的新闻网页动态数据抓取方法,其特征在于步骤(101)URL地址包括临时URL地址和重定向地址,需要添加时间戳参数或签名参数后访问的URL地址;步骤(101))的新闻网络爬取内容库的字段包括:新闻标题、新闻发布时间、新闻爬取时间、新闻来源和新闻内容;所述步骤(101))的新闻网页抓取的内容数据库的编码方法包括:UTF-8编码或GBK编码。3.如权利要求1所述的动态抓取方法基于Ajax的新闻网页数据特征在于步骤(102)的浏览器开发工具包括:谷歌Chrome开发工具。4.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于步骤(103)如果Ajax请求的数据源中存在特殊字符或乱码5.如权利要求1所述的基于Ajax的新闻网页动态数据捕获方法,其特征在于,步骤(10) 3):如果编码方式不同,则统一编码方式,统一采用UTF-8编码方式。 2.权利要求1,其特征在于步骤(102)与步骤(103))之间的步骤如下:步骤(1020):如果Ajax请求是跨域请求,通过PHP的CURL方法模拟传入页面,通过host获取请求的数据地址;步骤(1021):如果Ajax 请求是 P...
【专利技术属性】
技术研发人员:张紫阳、韩强、梁成富、李广庆、李斌、
申请人(专利权):,
类型:发明
国家省市:山东;37
下载所有详细技术资料 我是此专利的所有者
java爬虫抓取动态网页(网络爬虫又称网络蜘蛛、网络机器人的区别及应用方法)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2021-10-16 03:32
网络爬虫也被称为网络蜘蛛和网络机器人。它们是按照一定的规则自动浏览和检索网页信息的程序或脚本。网络爬虫可以自动请求网页并抓取所需的数据。通过处理捕获的数据,可以提取有价值的信息。
认识爬行动物
我们熟悉的一系列搜索引擎都是大型网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都有自己的爬虫程序。比如360浏览器的爬虫叫360Spider,搜狗的爬虫叫Sogouspider。
百度搜索引擎其实可以更形象地称为百度蜘蛛(Baiduspider),它每天从互联网海量信息中抓取优质信息,进行收录。当用户通过百度搜索关键词时,百度会先分析用户输入的关键词,然后从收录的网页中查找相关网页,并对网页进行排名根据排名规则。排序,最后将排序后的结果呈现给用户。在这个过程中,百度蜘蛛起到了非常关键的作用。
百度工程师为“百度蜘蛛”编写了相应的爬取算法。通过应用这些算法,“百度蜘蛛”可以实现相应的搜索策略,例如过滤掉重复的网页和过滤高质量的网页。应用不同的算法,爬虫的运行效率,爬取的结果会有所不同。
履带分类
爬虫可以分为三类:通用网络爬虫、聚焦网络爬虫和增量网络爬虫。
通用网络爬虫:是搜索引擎的重要组成部分。上面已经介绍过了,这里不再赘述。一般的网络爬虫都需要遵守robots协议。网站 通过这个协议告诉搜索引擎哪些页面可以爬取,哪些页面不允许爬取。
机器人协议:是一种称为“协议”的协议,不具有法律效力。它体现了互联网人的“契约精神”。行业从业者会自觉遵守约定,故又称“君子协定”。
专注于网络爬虫:是针对特定需求的网络爬虫程序。它与一般爬虫的区别在于,聚焦爬虫在实现网络爬取时会对网页内容进行过滤和处理,并尽量保证只爬取与需求相关的网页信息。专注于网络爬虫,大大节省了硬件和网络资源。由于保存的页面数量少,更新速度非常快,也满足了某些特定人群对特定领域信息的需求。
增量爬虫:指对下载的网页进行增量更新。它是一个爬虫程序,只爬取新生成或改变的网页,可以保证爬取的页面在一定程度上是最新的页面。
爬虫应用
随着互联网的飞速发展,万维网已经成为海量信息的载体。如何有效地提取和利用这些信息成为一个巨大的挑战。因此,爬虫应运而生。它不仅可以用于搜索引擎领域,还可以用于大数据分析。并在商业领域得到了大规模应用。
1)数据分析
在数据分析领域,网络爬虫通常是采集海量数据必不可少的工具。对于数据分析师来说,要进行数据分析,首先要有数据源,通过学习爬虫,可以得到更多的数据源。在采集的过程中,数据分析师可以根据自己的目的去寻找采集更有价值的数据,过滤掉那些无效的数据。
2)商业领域
对于企业来说,及时获取市场动态和产品信息至关重要。企业可以通过第三方平台购买数据,比如贵阳大数据交易所、数据堂等。当然,如果贵公司有爬虫工程师,可以通过爬虫获取自己想要的信息。
爬虫是一把双刃剑
爬虫是一把双刃剑。在给我们带来便利的同时,也给网络安全带来了隐患。一些不法分子利用爬虫在互联网上非法采集网民信息,或利用爬虫恶意攻击他人网站,造成网站瘫痪的严重后果。关于爬虫的合法使用,建议阅读《中华人民共和国网络安全法》。 查看全部
java爬虫抓取动态网页(网络爬虫又称网络蜘蛛、网络机器人的区别及应用方法)
网络爬虫也被称为网络蜘蛛和网络机器人。它们是按照一定的规则自动浏览和检索网页信息的程序或脚本。网络爬虫可以自动请求网页并抓取所需的数据。通过处理捕获的数据,可以提取有价值的信息。
认识爬行动物
我们熟悉的一系列搜索引擎都是大型网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都有自己的爬虫程序。比如360浏览器的爬虫叫360Spider,搜狗的爬虫叫Sogouspider。
百度搜索引擎其实可以更形象地称为百度蜘蛛(Baiduspider),它每天从互联网海量信息中抓取优质信息,进行收录。当用户通过百度搜索关键词时,百度会先分析用户输入的关键词,然后从收录的网页中查找相关网页,并对网页进行排名根据排名规则。排序,最后将排序后的结果呈现给用户。在这个过程中,百度蜘蛛起到了非常关键的作用。
百度工程师为“百度蜘蛛”编写了相应的爬取算法。通过应用这些算法,“百度蜘蛛”可以实现相应的搜索策略,例如过滤掉重复的网页和过滤高质量的网页。应用不同的算法,爬虫的运行效率,爬取的结果会有所不同。
履带分类
爬虫可以分为三类:通用网络爬虫、聚焦网络爬虫和增量网络爬虫。
通用网络爬虫:是搜索引擎的重要组成部分。上面已经介绍过了,这里不再赘述。一般的网络爬虫都需要遵守robots协议。网站 通过这个协议告诉搜索引擎哪些页面可以爬取,哪些页面不允许爬取。
机器人协议:是一种称为“协议”的协议,不具有法律效力。它体现了互联网人的“契约精神”。行业从业者会自觉遵守约定,故又称“君子协定”。
专注于网络爬虫:是针对特定需求的网络爬虫程序。它与一般爬虫的区别在于,聚焦爬虫在实现网络爬取时会对网页内容进行过滤和处理,并尽量保证只爬取与需求相关的网页信息。专注于网络爬虫,大大节省了硬件和网络资源。由于保存的页面数量少,更新速度非常快,也满足了某些特定人群对特定领域信息的需求。
增量爬虫:指对下载的网页进行增量更新。它是一个爬虫程序,只爬取新生成或改变的网页,可以保证爬取的页面在一定程度上是最新的页面。
爬虫应用
随着互联网的飞速发展,万维网已经成为海量信息的载体。如何有效地提取和利用这些信息成为一个巨大的挑战。因此,爬虫应运而生。它不仅可以用于搜索引擎领域,还可以用于大数据分析。并在商业领域得到了大规模应用。
1)数据分析
在数据分析领域,网络爬虫通常是采集海量数据必不可少的工具。对于数据分析师来说,要进行数据分析,首先要有数据源,通过学习爬虫,可以得到更多的数据源。在采集的过程中,数据分析师可以根据自己的目的去寻找采集更有价值的数据,过滤掉那些无效的数据。
2)商业领域
对于企业来说,及时获取市场动态和产品信息至关重要。企业可以通过第三方平台购买数据,比如贵阳大数据交易所、数据堂等。当然,如果贵公司有爬虫工程师,可以通过爬虫获取自己想要的信息。
爬虫是一把双刃剑
爬虫是一把双刃剑。在给我们带来便利的同时,也给网络安全带来了隐患。一些不法分子利用爬虫在互联网上非法采集网民信息,或利用爬虫恶意攻击他人网站,造成网站瘫痪的严重后果。关于爬虫的合法使用,建议阅读《中华人民共和国网络安全法》。
java爬虫抓取动态网页(爬虫集_零基础入门学习Python学习分三个阶段教程)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-15 16:23
学习爬虫需要一定的基础。有编程基础,学习Python爬虫更容易。但是多看多练,有自己的逻辑思路。使用 Python 来实现自己的学习目标是很有价值的。如果是入门学习和理解,上手学习不难,但深入学习就难了,尤其是大项目。
推荐学习课程:Python400集_零基础入门学习Python全教程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,模拟使用浏览器获取网页信息的过程。向服务器发送请求后,您将获得返回的页面。页面解析完成后,就可以提取出我们想要的部分信息,存放在指定的文档或数据库中。爬虫Python入门学习分为三个阶段:
一、零基础阶段:
从零开始学习爬虫,上手系统,从零开始爬。除了必要的理论知识,爬虫比实际应用更重要。带你抓取4种主流网站数据,掌握主流爬虫抓取方法。
捕获主流网站数据的能力是现阶段的学习目标。
学习重点:爬虫所需的计算机网络/前端/常规//xpath/CSS选择器基础知识;实现静态网页和动态网页两种主流网页类型的数据抓取;模拟登录、响应反爬、验证码识别等难点详解;多线程、多进程等常见应用场景详细讲解。
二、主流框架
主流框架Scrapy实现了海量数据的抓取,提升了从原生爬虫到框架的能力。学完之后可以彻底玩转Scrapy框架,开发自己的分布式爬虫系统,完全胜任中级Python工程师的工作。获得高效捕获海量数据的能力。
学习重点:Scrapy框架知识讲解spider/FormRequest/CrawlSpider等;从单机爬虫到分布式爬虫系统讲解;Scrapy 突破了反爬虫的局限性和 Scrapy 的原理;Scrapy 更高级的功能包括scrapy 信号、自定义中间件;一些海量数据结合 Elasticsearch 来创建搜索引擎。
三、爬虫
深度App数据抓取、爬取能力提升,应对App数据抓取和数据可视化的能力不再局限于网络爬虫。从此拓宽您的爬虫业务,提升您的核心竞争力。掌握App数据抓取,实现数据可视化
学习重点:学习主流抓包工具Fiddler/Mitmproxy的应用;4种App数据抓取实战,结合学习与实践,深入掌握App爬取技巧;基于Docker构建多任务爬取系统,提高工作效率;掌握Pyecharts库基础,绘制基本图形、地图等,实现数据可视化。
Crawler Python 应用在很多领域,比如爬取数据、进行市场调研和商业分析;作为机器学习和数据挖掘的原创数据;抓取优质资源:图片、文字、视频。掌握正确的方法很容易就能在短时间内抓取到主流的网站数据。建议从一开始就为爬虫Python入口设定一个具体的目标。只有目标被驱动,学习才会更有效率。 查看全部
java爬虫抓取动态网页(爬虫集_零基础入门学习Python学习分三个阶段教程)
学习爬虫需要一定的基础。有编程基础,学习Python爬虫更容易。但是多看多练,有自己的逻辑思路。使用 Python 来实现自己的学习目标是很有价值的。如果是入门学习和理解,上手学习不难,但深入学习就难了,尤其是大项目。
推荐学习课程:Python400集_零基础入门学习Python全教程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,模拟使用浏览器获取网页信息的过程。向服务器发送请求后,您将获得返回的页面。页面解析完成后,就可以提取出我们想要的部分信息,存放在指定的文档或数据库中。爬虫Python入门学习分为三个阶段:
一、零基础阶段:
从零开始学习爬虫,上手系统,从零开始爬。除了必要的理论知识,爬虫比实际应用更重要。带你抓取4种主流网站数据,掌握主流爬虫抓取方法。
捕获主流网站数据的能力是现阶段的学习目标。
学习重点:爬虫所需的计算机网络/前端/常规//xpath/CSS选择器基础知识;实现静态网页和动态网页两种主流网页类型的数据抓取;模拟登录、响应反爬、验证码识别等难点详解;多线程、多进程等常见应用场景详细讲解。
二、主流框架
主流框架Scrapy实现了海量数据的抓取,提升了从原生爬虫到框架的能力。学完之后可以彻底玩转Scrapy框架,开发自己的分布式爬虫系统,完全胜任中级Python工程师的工作。获得高效捕获海量数据的能力。
学习重点:Scrapy框架知识讲解spider/FormRequest/CrawlSpider等;从单机爬虫到分布式爬虫系统讲解;Scrapy 突破了反爬虫的局限性和 Scrapy 的原理;Scrapy 更高级的功能包括scrapy 信号、自定义中间件;一些海量数据结合 Elasticsearch 来创建搜索引擎。
三、爬虫
深度App数据抓取、爬取能力提升,应对App数据抓取和数据可视化的能力不再局限于网络爬虫。从此拓宽您的爬虫业务,提升您的核心竞争力。掌握App数据抓取,实现数据可视化
学习重点:学习主流抓包工具Fiddler/Mitmproxy的应用;4种App数据抓取实战,结合学习与实践,深入掌握App爬取技巧;基于Docker构建多任务爬取系统,提高工作效率;掌握Pyecharts库基础,绘制基本图形、地图等,实现数据可视化。
Crawler Python 应用在很多领域,比如爬取数据、进行市场调研和商业分析;作为机器学习和数据挖掘的原创数据;抓取优质资源:图片、文字、视频。掌握正确的方法很容易就能在短时间内抓取到主流的网站数据。建议从一开始就为爬虫Python入口设定一个具体的目标。只有目标被驱动,学习才会更有效率。
java爬虫抓取动态网页(一个基于Java的亚马逊图书监控的简单爬虫实现的思路)
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-15 16:20
前言:最近有博主买了Kindle,觉得亚马逊上的图书资源质量还不错,不时会有低价优质的图书出售,但限于亚马逊,确实有没有很好的打折提醒功能,所以每天都在看。又累了。于是,我写了一个简单的基于Java的亚马逊图书监控爬虫,只要有特价书,它就会自动发送邮件到指定邮箱。
实现思路
简单说一下实现的思路,本文只讲解思路,如果需要完整的童鞋项目请移至文末
只需封装JavaMail,就可以更轻松地阅读发送电子邮件的配置文件。它用于配置电子邮件发送和监控设置。使用 URL 类返回的 URLConnection 对象访问 网站 并捕获数据。(这里有个小技巧,如果你在访问亚马逊的时候没有在请求头中添加Accept-Encoding: gzip, deflate, br,你会在几次之内被拒绝访问(返回503),添加后说明返回数据经过GZIP压缩,此时需要使用GZIPInputStream读取,否则读取乱码)使用正则表达式对获取的数据进行分析,提取有用信息。发送通知邮件。基本上是函数核心代码
因为只截取了部分代码,内容缺失,思路清晰。
获取亚马逊信息
this.url = new URL("https://www.amazon.cn/gp/bests ... 6quot;);
//打开一个连接
URLConnection connection = this.url.openConnection();
//设置请求头,防止被503
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
connection.setRequestProperty("Host", "www.amazon.cn");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
//发起连接
connection.connect();
//获取数据,因为服务器发过来的数据经过GZIP压缩,要用对应的流进行读取
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(connection.getInputStream()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读数据
while ((len = bis.read(tmp)) != -1) {
baos.write(tmp, 0, len);
}
this.rawData = new String(baos.toByteArray(), "utf8");
bis.close();
有规律地分析数据
//先用正则表达式去取单个li标签
Pattern p1 = Pattern.compile(" price ? price : oldPrice;
}
//将数据放入Map中
this.destData.put(name, new Price(price, new Date()));
}
}
完成项目
我把完整的项目放到了我的Github上,更多细节(如何配置,如何使用),有兴趣的孩子可以去加入我们!
仓库地址: 查看全部
java爬虫抓取动态网页(一个基于Java的亚马逊图书监控的简单爬虫实现的思路)
前言:最近有博主买了Kindle,觉得亚马逊上的图书资源质量还不错,不时会有低价优质的图书出售,但限于亚马逊,确实有没有很好的打折提醒功能,所以每天都在看。又累了。于是,我写了一个简单的基于Java的亚马逊图书监控爬虫,只要有特价书,它就会自动发送邮件到指定邮箱。
实现思路
简单说一下实现的思路,本文只讲解思路,如果需要完整的童鞋项目请移至文末
只需封装JavaMail,就可以更轻松地阅读发送电子邮件的配置文件。它用于配置电子邮件发送和监控设置。使用 URL 类返回的 URLConnection 对象访问 网站 并捕获数据。(这里有个小技巧,如果你在访问亚马逊的时候没有在请求头中添加Accept-Encoding: gzip, deflate, br,你会在几次之内被拒绝访问(返回503),添加后说明返回数据经过GZIP压缩,此时需要使用GZIPInputStream读取,否则读取乱码)使用正则表达式对获取的数据进行分析,提取有用信息。发送通知邮件。基本上是函数核心代码
因为只截取了部分代码,内容缺失,思路清晰。
获取亚马逊信息
this.url = new URL("https://www.amazon.cn/gp/bests ... 6quot;);
//打开一个连接
URLConnection connection = this.url.openConnection();
//设置请求头,防止被503
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
connection.setRequestProperty("Host", "www.amazon.cn");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
//发起连接
connection.connect();
//获取数据,因为服务器发过来的数据经过GZIP压缩,要用对应的流进行读取
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(connection.getInputStream()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读数据
while ((len = bis.read(tmp)) != -1) {
baos.write(tmp, 0, len);
}
this.rawData = new String(baos.toByteArray(), "utf8");
bis.close();
有规律地分析数据
//先用正则表达式去取单个li标签
Pattern p1 = Pattern.compile(" price ? price : oldPrice;
}
//将数据放入Map中
this.destData.put(name, new Price(price, new Date()));
}
}
完成项目
我把完整的项目放到了我的Github上,更多细节(如何配置,如何使用),有兴趣的孩子可以去加入我们!
仓库地址:
java爬虫抓取动态网页(#爬虫为什么要监控gecco是一个十分简单的java开源爬虫框架)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-10-14 09:27
#java攀虫geccomonitoring来了,没有连胜##为什么爬虫监控gecco是一个非常简单易用的java开源爬虫框架,也是一个扩展性很强的框架。目前,有:
组合弹簧插件gecco-spring
Gecco-htmlunit,一个与htmlunit结合的插件
插件 gecco-reids 结合 reids
开发爬虫时,需要爬取很多网站和链接,将爬取到的网站内容提取出来。如果不监控大量的链接下载和内容提取,很难发现问题。特别是对于主题爬虫,需要提取页面的具体内容。如果网站被修改,必须尽快发现并纠正。完成基础框架和必要的插件后,gecco爬虫框架将重点进行监控的开发。
gecco框架的基本设计原则是对扩展的开放和对修改的关闭的开闭原则是一致的。gecco爬虫的监控模块也是基于这个原理,基于jmx协议,使用aop模式。
##监控指标###爬虫基本信息
###下载监控
###内容提取监控
##jmxutils 和 jolokia ###jmxutils gecco 的监控使用 jmxutils,一个开源的 mbean 注释框架。在之前的开发工作中,要么使用了原生的动态mbean,要么使用了spring jmx注解框架。原生动态mbean写起来太麻烦。Spring的jmx注解框架用起来还是很方便的,但是现在spring感觉有点重了。jmxutils 框架非常轻量级,可以参考使用。###jolokia Jolokia 是一个开源项目,它使用 JSON 通过 Http 实现 JMX 远程管理。它快速而简单。除了支持基本的 JMX 操作外,它还提供了一些独特的功能来增强 JMX 远程管理,例如批量请求、细粒度的安全策略等。 也就是说,jmx的mbean可以通过http访问,启动java的时候不用配置那么多参数。只需要添加一个servlet:
jolokia-agent
org.jolokia.http.AgentServlet
jolokia-agent
/jmx/*
这样就可以方便地控制和访问应用程序中的mbean。jolokia 还提供了 java 客户端和 js 客户端来访问 mbean。具体用法和权限控制请查看jolokia官方文档 查看全部
java爬虫抓取动态网页(#爬虫为什么要监控gecco是一个十分简单的java开源爬虫框架)
#java攀虫geccomonitoring来了,没有连胜##为什么爬虫监控gecco是一个非常简单易用的java开源爬虫框架,也是一个扩展性很强的框架。目前,有:
组合弹簧插件gecco-spring
Gecco-htmlunit,一个与htmlunit结合的插件
插件 gecco-reids 结合 reids
开发爬虫时,需要爬取很多网站和链接,将爬取到的网站内容提取出来。如果不监控大量的链接下载和内容提取,很难发现问题。特别是对于主题爬虫,需要提取页面的具体内容。如果网站被修改,必须尽快发现并纠正。完成基础框架和必要的插件后,gecco爬虫框架将重点进行监控的开发。
gecco框架的基本设计原则是对扩展的开放和对修改的关闭的开闭原则是一致的。gecco爬虫的监控模块也是基于这个原理,基于jmx协议,使用aop模式。

##监控指标###爬虫基本信息
###下载监控
###内容提取监控
##jmxutils 和 jolokia ###jmxutils gecco 的监控使用 jmxutils,一个开源的 mbean 注释框架。在之前的开发工作中,要么使用了原生的动态mbean,要么使用了spring jmx注解框架。原生动态mbean写起来太麻烦。Spring的jmx注解框架用起来还是很方便的,但是现在spring感觉有点重了。jmxutils 框架非常轻量级,可以参考使用。###jolokia Jolokia 是一个开源项目,它使用 JSON 通过 Http 实现 JMX 远程管理。它快速而简单。除了支持基本的 JMX 操作外,它还提供了一些独特的功能来增强 JMX 远程管理,例如批量请求、细粒度的安全策略等。 也就是说,jmx的mbean可以通过http访问,启动java的时候不用配置那么多参数。只需要添加一个servlet:
jolokia-agent
org.jolokia.http.AgentServlet
jolokia-agent
/jmx/*
这样就可以方便地控制和访问应用程序中的mbean。jolokia 还提供了 java 客户端和 js 客户端来访问 mbean。具体用法和权限控制请查看jolokia官方文档
java爬虫抓取动态网页(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-12 07:21
工具类实现比较简单,只是一个get方法,读取请求地址的响应内容,这里我们是用来爬取网页内容的,这里没有代理,在真正的爬取过程中,当你请求一个大量网站的时候,对方会有一系列的策略来禁用你的请求。这时候代理就派上用场了。通过代理设置不同的IP来抓取数据。
接下来我们找一个有图片的网页,试试爬取功能。
首先抓取网页的内容,然后正常解析出网页的标签,再解析img地址。执行程序我们可以得到如下内容:
通过上面的地址我们可以将图片下载到本地,下面我们来写一个图片下载方法:
这样就很简单的实现了一个抓图和提取图片的功能。好像比较麻烦。如果你需要写正则,我给你介绍一个更简单的方法。如果您熟悉 jQuery,则可以提取元素。很简单,这个框架就是Jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
添加jsoup的依赖:
使用jsoup后提取的代码只需要简单的几行:
通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag方法提取所有图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。
Jsoup 使用起来非常简单。当然,还有很多其他的用于解析网页的操作。您可以查看信息并了解它。
我们再升级一下,做一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后自动下载图片,我们就可以用swing来写界面了。
执行 main 方法后的第一件事是我们的接口,如下所示:
截图 2018-06-18 09.50.34 PM.png
输入地址,点击提取按钮下载图片。
课程推荐
大数据时代,如何形成大数据。
大量的用户,每天大量的日志。
搭建爬虫,抓取数十亿条数据进行分析分析。
不仅仅是 Python 可以做爬虫,Java 仍然可以做。
今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来
图片
本课程将带领大家一步步编写爬虫程序,爬取到我们想要的数据,在非登录或者需要登录的情况下爬下来。
完成本课程后,将培训学员成为合格的Java网络爬虫工程师,并能胜任相关爬虫工作;
学习后,能够使用XPath表达式进行信息抽取;
学习掌握抓包技术后,掌握如何提取屏蔽数据信息,自动模拟Ajax异步请求数据;
熟悉jsoup提取网页数据。
Selenium 控制浏览器获取数据。
课程大纲 查看全部
java爬虫抓取动态网页(工具类实现比较简单,就一个get方法,读取请求地址的响应内容)
工具类实现比较简单,只是一个get方法,读取请求地址的响应内容,这里我们是用来爬取网页内容的,这里没有代理,在真正的爬取过程中,当你请求一个大量网站的时候,对方会有一系列的策略来禁用你的请求。这时候代理就派上用场了。通过代理设置不同的IP来抓取数据。
接下来我们找一个有图片的网页,试试爬取功能。
首先抓取网页的内容,然后正常解析出网页的标签,再解析img地址。执行程序我们可以得到如下内容:
通过上面的地址我们可以将图片下载到本地,下面我们来写一个图片下载方法:
这样就很简单的实现了一个抓图和提取图片的功能。好像比较麻烦。如果你需要写正则,我给你介绍一个更简单的方法。如果您熟悉 jQuery,则可以提取元素。很简单,这个框架就是Jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
添加jsoup的依赖:
使用jsoup后提取的代码只需要简单的几行:
通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag方法提取所有图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。
Jsoup 使用起来非常简单。当然,还有很多其他的用于解析网页的操作。您可以查看信息并了解它。
我们再升级一下,做一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后自动下载图片,我们就可以用swing来写界面了。
执行 main 方法后的第一件事是我们的接口,如下所示:
截图 2018-06-18 09.50.34 PM.png
输入地址,点击提取按钮下载图片。
课程推荐
大数据时代,如何形成大数据。
大量的用户,每天大量的日志。
搭建爬虫,抓取数十亿条数据进行分析分析。
不仅仅是 Python 可以做爬虫,Java 仍然可以做。
今天就带大家写一个简单的抓图程序,把网页上的所有图片都下载下来
图片
本课程将带领大家一步步编写爬虫程序,爬取到我们想要的数据,在非登录或者需要登录的情况下爬下来。
完成本课程后,将培训学员成为合格的Java网络爬虫工程师,并能胜任相关爬虫工作;
学习后,能够使用XPath表达式进行信息抽取;
学习掌握抓包技术后,掌握如何提取屏蔽数据信息,自动模拟Ajax异步请求数据;
熟悉jsoup提取网页数据。
Selenium 控制浏览器获取数据。
课程大纲
java爬虫抓取动态网页(爬取免费代理IP数据遇到的js加密cookie问题的原因)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-12 07:14
第一个序列:
由于需要爬取数据,代理和验证码的识别是一个不可避免的问题。本文总结了爬取免费代理IP数据遇到的js加密cookie问题。
两个问题:
对于常见的静态页面,jsoup 的解析更为常见。
但是如果用这个网站直接用jsoup去取,就会报错。
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=521, URL=http://www.kuaidaili.com/ops/proxylist/1
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:679)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:249)
三、问题分析与解决:
其实浏览器是可以正常浏览的,我们打开浏览器看看流程。以 Chrome 为例
可以清楚的看到第一次报错,HTTP状态码是521,不是200.
第二次是200,但是第二次多了cookies:_ydclearance=a3fd46bd1a232b52d7313218-72dc-4427-aa33-5690668af31d-1506323606
这就是问题的原因。
使用程序模拟并打印参数:
CloseableHttpClient httpClient = HttpClients.createDefault();
Registry cookieSpecProviderRegistry = RegistryBuilder.create()
.register("myCookieSpec", context -> new MyCookieSpec()).build();//注册自定义CookieSpec
String url = baseUrl + i;
HttpGet get = new HttpGet(url);
HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecProviderRegistry);
get.setConfig(RequestConfig.custom().setCookieSpec("myCookieSpec").build());
WebRequest request = null;
WebClient wc = null;
try {
//1、获取521状态时返回setcookie
CloseableHttpResponse response = httpClient.execute(get, context);
// 响应状态
System.out.println("status:" + response.getStatusLine());
System.out.println(">>>>>>headers:");
HeaderIterator iterator = response.headerIterator();
while (iterator.hasNext()) {
System.out.println("\t" + iterator.next());
}
System.out.println(">>>>>>cookies:");
// context.getCookieStore().getCookies().forEach(System.out::println);
String cookie =getCookie(context);
System.out.println("cookie="+cookie);
response.close();
输出日志:
status:HTTP/1.1 521
>>>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
TM真的是很深的套路。不愧是代理爬虫网站,还有一套更后的爬虫。
获取此 cookie 并再次调用目标 URL。看反馈数据:
HttpGet secGet = new HttpGet(url);
secGet.setHeader("Cookie",cookie);
//测试用,对比获取结果
CloseableHttpResponse secResponse = httpClient.execute(secGet, context);
System.out.println("secstatus:" + secResponse.getStatusLine());
String content = EntityUtils.toString(secResponse.getEntity());
System.out.println(content);
secResponse.close();
本以为会返回正常的结果数据,结果发现是我太笨了,返回了一段js,而且被加密了
<p>window.οnlοad=setTimeout("dv(43)", 200); function dv(VC) {var qo, mo="", no="", oo = [0x43,0xe5,0xb0,0x27,0x71,0x6f,0xe9,0x58,0xd8,0x21,0x55,0x56,0xd0,0x4f,0xcd,0x91,0x1c,0x9e,0x09,0xe7,0x80,0x6f,0x8d,0xf3,0x60,0x73,0xe9,0x66,0xd4,0x47,0x1e,0x76,0xec,0x69,0xe3,0xbc,0x27,0x02,0x70,0xe0,0xf2,0x65,0xd1,0xac,0x19,0xf3,0x6c,0xe4,0x57,0x3c,0xc3,0xa8,0x13,0xe1,0xb4,0x37,0x0e,0xf2,0x5f,0x32,0x43,0x0e,0x88,0xfe,0xd7,0x99,0x68,0xe0,0xdb,0xa6,0xd2,0xab,0x80,0x57,0x52,0xd6,0xa3,0x7c,0x5d,0xd5,0x29,0x28,0xa0,0x75,0x48,0x3d,0x18,0x13,0xdd,0x4a,0x21,0xf1,0xbe,0x89,0x70,0x72,0xe0,0x4b,0x16,0xee,0xa7,0x74,0x41,0x40,0x13,0xb3,0x7e,0x53,0x24,0xfa,0x12,0xec,0xbd,0x8e,0x5b,0x37,0x02,0xec,0xdd,0x4c,0xf8,0x59,0xad,0x34,0x8c,0x93,0xfd,0x58,0x33,0x6d,0xc6,0x45,0xc5,0xc2,0xb7,0xac,0x81,0x50,0x4b,0x61,0x98,0x03,0x57,0x52,0x25,0x8d,0x60,0x51,0x26,0x09,0xa2,0x8b,0x5e,0x33,0x1c,0xaa,0x77,0x42,0x37,0x65,0x35,0x73,0x7f,0x66,0x5b,0xae,0x1b,0x99,0x18,0x8a,0x18,0x9a,0x1b,0xf5,0xf6,0x66,0xf0,0x3b,0xad,0x34,0x50,0xbc,0x2f,0xb1,0x2e,0xd9,0x60,0x5d,0xd7,0x56,0x5f,0xd9,0xc4,0xb5,0x0a,0xf9,0x70,0xbc,0x3d,0x1c,0xae,0xad,0xa0,0x87,0x7c,0x47,0x95,0x1c,0x9c,0x05,0x45,0xc7,0x16,0x17,0x83,0x33,0xb1,0x2c,0x76,0xf4,0x2e,0x9c,0x19,0x65,0x66,0x3d,0xb9,0x3c,0xb2,0x25,0xbd,0x0a,0x90,0x0f,0x8f,0xce,0xa9,0x16,0x98,0x0f,0xc5,0x14,0x8e,0xfc,0x79,0xe1,0x2e,0x2f,0x39,0x51,0x42,0x94,0x3b];qo = "qo=251; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>2)|((oo[qo]>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
15:10:27.023 [main] INFO c.g.htmlunit.WebClient - statusCode=[521] contentType=[text/html]
15:10:27.033 [main] INFO c.g.htmlunit.WebClient - window.οnlοad=setTimeout("kt(180)", 200); function kt(OD) {var qo, mo="", no="", oo = [0xe7,0xd1,0x34,0xe1,0x60,0xfd,0x51,0x2f,0xc4,0x2b,0xc2,0x90,0xb5,0x43,0xf0,0x7e,0xfb,0xd9,0x22,0x42,0x32,0x5f,0x5d,0x23,0xe6,0xb4,0x5a,0x38,0xf5,0x2c,0xd6,0x94,0x2a,0xf7,0xd5,0xf5,0x99,0xe9,0x52,0x92,0x68,0x46,0x45,0x4d,0x03,0x53,0x8b,0x61,0xc6,0x2f,0x0d,0x45,0x13,0xe0,0xc7,0x08,0x80,0x80,0xb8,0x9e,0xf2,0x53,0x53,0xa3,0x81,0x21,0xdc,0xb2,0x88,0xc8,0x01,0xc0,0x68,0xd0,0x29,0x61,0xd1,0x71,0x01,0xde,0x1f,0xdc,0x1d,0xbc,0x04,0x6c,0xa4,0xec,0x35,0x3d,0x67,0xcf,0x28,0xf5,0xab,0xe3,0x08,0x78,0x4e,0xed,0x2e,0x8e,0x34,0x7c,0xd4,0x05,0x55,0x9d,0x32,0x8a,0xc2,0x3b,0x2b,0xf2,0x89,0x67,0x6d,0xb3,0x31,0x67,0x78,0x56,0x84,0xa4,0x41,0xee,0x7e,0x14,0xbb,0x63,0xbb,0x1c,0xd4,0x74,0xa1,0x9f,0xc5,0x65,0x25,0x65,0xd5,0x9d,0xc5,0xc5,0xa4,0xbc,0xfc,0x25,0x3d,0x75,0x50,0xa8,0x70,0x5d,0xf9,0x5f,0x37,0x27,0xee,0xd4,0x62,0x20,0xe7,0xa5,0x23,0xd8,0xf8,0x90,0xdd,0x4b,0xa9,0x67,0xe4,0xca,0xdd,0x9b,0x19,0xbe,0x3c,0xd3,0x9f,0x4d,0xfa,0x98,0x88,0x50,0x14,0x5a,0x18,0x7e,0xe3,0x04,0x0a,0xb9,0x89,0x99,0x41,0xaf,0x98,0x16,0xab,0x91,0x3f,0x8d,0x21,0xd8,0xbe,0x4c,0x1a,0x78,0x47,0xe4,0xc2,0x78,0xde,0x76,0xd2,0x78,0x06,0xd3,0x91,0xf7,0xf0,0x6e,0x1c,0xb1,0xd1,0xb7,0x3e,0xcb,0x99,0xf7,0x95,0x73,0x6e,0x04,0x6a,0x02,0x7f,0xb4,0x22,0x87,0x3b];qo = "qo=241; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>5)|((oo[qo]>5)|((oo[qo]>2)|((oo[qo]>2)|((oo[qo] 查看全部
java爬虫抓取动态网页(爬取免费代理IP数据遇到的js加密cookie问题的原因)
第一个序列:
由于需要爬取数据,代理和验证码的识别是一个不可避免的问题。本文总结了爬取免费代理IP数据遇到的js加密cookie问题。
两个问题:
对于常见的静态页面,jsoup 的解析更为常见。
但是如果用这个网站直接用jsoup去取,就会报错。
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=521, URL=http://www.kuaidaili.com/ops/proxylist/1
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:679)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:249)
三、问题分析与解决:
其实浏览器是可以正常浏览的,我们打开浏览器看看流程。以 Chrome 为例
可以清楚的看到第一次报错,HTTP状态码是521,不是200.
第二次是200,但是第二次多了cookies:_ydclearance=a3fd46bd1a232b52d7313218-72dc-4427-aa33-5690668af31d-1506323606
这就是问题的原因。
使用程序模拟并打印参数:
CloseableHttpClient httpClient = HttpClients.createDefault();
Registry cookieSpecProviderRegistry = RegistryBuilder.create()
.register("myCookieSpec", context -> new MyCookieSpec()).build();//注册自定义CookieSpec
String url = baseUrl + i;
HttpGet get = new HttpGet(url);
HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecProviderRegistry);
get.setConfig(RequestConfig.custom().setCookieSpec("myCookieSpec").build());
WebRequest request = null;
WebClient wc = null;
try {
//1、获取521状态时返回setcookie
CloseableHttpResponse response = httpClient.execute(get, context);
// 响应状态
System.out.println("status:" + response.getStatusLine());
System.out.println(">>>>>>headers:");
HeaderIterator iterator = response.headerIterator();
while (iterator.hasNext()) {
System.out.println("\t" + iterator.next());
}
System.out.println(">>>>>>cookies:");
// context.getCookieStore().getCookies().forEach(System.out::println);
String cookie =getCookie(context);
System.out.println("cookie="+cookie);
response.close();
输出日志:
status:HTTP/1.1 521
>>>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
TM真的是很深的套路。不愧是代理爬虫网站,还有一套更后的爬虫。
获取此 cookie 并再次调用目标 URL。看反馈数据:
HttpGet secGet = new HttpGet(url);
secGet.setHeader("Cookie",cookie);
//测试用,对比获取结果
CloseableHttpResponse secResponse = httpClient.execute(secGet, context);
System.out.println("secstatus:" + secResponse.getStatusLine());
String content = EntityUtils.toString(secResponse.getEntity());
System.out.println(content);
secResponse.close();
本以为会返回正常的结果数据,结果发现是我太笨了,返回了一段js,而且被加密了
<p>window.οnlοad=setTimeout("dv(43)", 200); function dv(VC) {var qo, mo="", no="", oo = [0x43,0xe5,0xb0,0x27,0x71,0x6f,0xe9,0x58,0xd8,0x21,0x55,0x56,0xd0,0x4f,0xcd,0x91,0x1c,0x9e,0x09,0xe7,0x80,0x6f,0x8d,0xf3,0x60,0x73,0xe9,0x66,0xd4,0x47,0x1e,0x76,0xec,0x69,0xe3,0xbc,0x27,0x02,0x70,0xe0,0xf2,0x65,0xd1,0xac,0x19,0xf3,0x6c,0xe4,0x57,0x3c,0xc3,0xa8,0x13,0xe1,0xb4,0x37,0x0e,0xf2,0x5f,0x32,0x43,0x0e,0x88,0xfe,0xd7,0x99,0x68,0xe0,0xdb,0xa6,0xd2,0xab,0x80,0x57,0x52,0xd6,0xa3,0x7c,0x5d,0xd5,0x29,0x28,0xa0,0x75,0x48,0x3d,0x18,0x13,0xdd,0x4a,0x21,0xf1,0xbe,0x89,0x70,0x72,0xe0,0x4b,0x16,0xee,0xa7,0x74,0x41,0x40,0x13,0xb3,0x7e,0x53,0x24,0xfa,0x12,0xec,0xbd,0x8e,0x5b,0x37,0x02,0xec,0xdd,0x4c,0xf8,0x59,0xad,0x34,0x8c,0x93,0xfd,0x58,0x33,0x6d,0xc6,0x45,0xc5,0xc2,0xb7,0xac,0x81,0x50,0x4b,0x61,0x98,0x03,0x57,0x52,0x25,0x8d,0x60,0x51,0x26,0x09,0xa2,0x8b,0x5e,0x33,0x1c,0xaa,0x77,0x42,0x37,0x65,0x35,0x73,0x7f,0x66,0x5b,0xae,0x1b,0x99,0x18,0x8a,0x18,0x9a,0x1b,0xf5,0xf6,0x66,0xf0,0x3b,0xad,0x34,0x50,0xbc,0x2f,0xb1,0x2e,0xd9,0x60,0x5d,0xd7,0x56,0x5f,0xd9,0xc4,0xb5,0x0a,0xf9,0x70,0xbc,0x3d,0x1c,0xae,0xad,0xa0,0x87,0x7c,0x47,0x95,0x1c,0x9c,0x05,0x45,0xc7,0x16,0x17,0x83,0x33,0xb1,0x2c,0x76,0xf4,0x2e,0x9c,0x19,0x65,0x66,0x3d,0xb9,0x3c,0xb2,0x25,0xbd,0x0a,0x90,0x0f,0x8f,0xce,0xa9,0x16,0x98,0x0f,0xc5,0x14,0x8e,0xfc,0x79,0xe1,0x2e,0x2f,0x39,0x51,0x42,0x94,0x3b];qo = "qo=251; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>2)|((oo[qo]>>>>headers:
Date: Mon, 25 Sep 2017 07:10:25 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980; Expires=1506330625; Path=/; HttpOnly
Cache-Control: no-cache, no-store
Server: WAF/2.4-12.1
>>>>>>cookies:
cookie=yd_cookie=fa424be4-70a9-4478226851c4b3f3e8e031e4ed7860052980;Expires=Mon Sep 25 17:10:25 CST 2017;Path=/
15:10:27.023 [main] INFO c.g.htmlunit.WebClient - statusCode=[521] contentType=[text/html]
15:10:27.033 [main] INFO c.g.htmlunit.WebClient - window.οnlοad=setTimeout("kt(180)", 200); function kt(OD) {var qo, mo="", no="", oo = [0xe7,0xd1,0x34,0xe1,0x60,0xfd,0x51,0x2f,0xc4,0x2b,0xc2,0x90,0xb5,0x43,0xf0,0x7e,0xfb,0xd9,0x22,0x42,0x32,0x5f,0x5d,0x23,0xe6,0xb4,0x5a,0x38,0xf5,0x2c,0xd6,0x94,0x2a,0xf7,0xd5,0xf5,0x99,0xe9,0x52,0x92,0x68,0x46,0x45,0x4d,0x03,0x53,0x8b,0x61,0xc6,0x2f,0x0d,0x45,0x13,0xe0,0xc7,0x08,0x80,0x80,0xb8,0x9e,0xf2,0x53,0x53,0xa3,0x81,0x21,0xdc,0xb2,0x88,0xc8,0x01,0xc0,0x68,0xd0,0x29,0x61,0xd1,0x71,0x01,0xde,0x1f,0xdc,0x1d,0xbc,0x04,0x6c,0xa4,0xec,0x35,0x3d,0x67,0xcf,0x28,0xf5,0xab,0xe3,0x08,0x78,0x4e,0xed,0x2e,0x8e,0x34,0x7c,0xd4,0x05,0x55,0x9d,0x32,0x8a,0xc2,0x3b,0x2b,0xf2,0x89,0x67,0x6d,0xb3,0x31,0x67,0x78,0x56,0x84,0xa4,0x41,0xee,0x7e,0x14,0xbb,0x63,0xbb,0x1c,0xd4,0x74,0xa1,0x9f,0xc5,0x65,0x25,0x65,0xd5,0x9d,0xc5,0xc5,0xa4,0xbc,0xfc,0x25,0x3d,0x75,0x50,0xa8,0x70,0x5d,0xf9,0x5f,0x37,0x27,0xee,0xd4,0x62,0x20,0xe7,0xa5,0x23,0xd8,0xf8,0x90,0xdd,0x4b,0xa9,0x67,0xe4,0xca,0xdd,0x9b,0x19,0xbe,0x3c,0xd3,0x9f,0x4d,0xfa,0x98,0x88,0x50,0x14,0x5a,0x18,0x7e,0xe3,0x04,0x0a,0xb9,0x89,0x99,0x41,0xaf,0x98,0x16,0xab,0x91,0x3f,0x8d,0x21,0xd8,0xbe,0x4c,0x1a,0x78,0x47,0xe4,0xc2,0x78,0xde,0x76,0xd2,0x78,0x06,0xd3,0x91,0xf7,0xf0,0x6e,0x1c,0xb1,0xd1,0xb7,0x3e,0xcb,0x99,0xf7,0x95,0x73,0x6e,0x04,0x6a,0x02,0x7f,0xb4,0x22,0x87,0x3b];qo = "qo=241; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>5)|((oo[qo]>5)|((oo[qo]>2)|((oo[qo]>2)|((oo[qo]
java爬虫抓取动态网页( Python网络爬虫内容提取器一文讲解)
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-11 23:28
Python网络爬虫内容提取器一文讲解)
1 简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2.提取动态内容的技术成分
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码及实验过程
如果我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:使用直观的采集和搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(在windows10下测试,python3.2),请注意:xslt是一个比较长的字符串,如果把这个字符串删掉,那几行代码也不多,够看Python了强大的
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4. 阅读下一步
至此,我们已经演示了如何通过两个文章来抓取静态和动态的网页内容,这两个文章都使用xslt一次从网页中提取需要的内容。实际上,xslt 是一种更复杂的编程语言。如果你手动写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这是有道理的,程序员不再需要花时间编写和调试捕获规则,这是一项非常耗时费力的工作。接下来,《一分钟快速生成xslt进行网页内容提取》将介绍如何生成xslt。
5.采集GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
5. 文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源码,修改github源码地址 查看全部
java爬虫抓取动态网页(
Python网络爬虫内容提取器一文讲解)
1 简介
在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。这就留下了一个问题:如何提取javascript管理的动态内容?那么这篇文章就回答了这个问题。
2.提取动态内容的技术成分
上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
3、源码及实验过程
如果我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
第一步:使用直观的采集和搜索客户标记功能,可以很快自动生成调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
第二步:执行如下代码(在windows10下测试,python3.2),请注意:xslt是一个比较长的字符串,如果把这个字符串删掉,那几行代码也不多,够看Python了强大的
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url = "http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
""")
# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:如下图所示,网页上手机的名称和价格已被正确抓取
4. 阅读下一步
至此,我们已经演示了如何通过两个文章来抓取静态和动态的网页内容,这两个文章都使用xslt一次从网页中提取需要的内容。实际上,xslt 是一种更复杂的编程语言。如果你手动写xslt,那么最好写离散xpath。如果这个xslt不是手工写的,而是程序自动生成的,这是有道理的,程序员不再需要花时间编写和调试捕获规则,这是一项非常耗时费力的工作。接下来,《一分钟快速生成xslt进行网页内容提取》将介绍如何生成xslt。
5.采集GooSeeker开源代码下载源
1.GooSeeker开源Python网络爬虫GitHub源码
5. 文档修改历史
2016-05-26:V2.0,添加文字说明
2016-05-29:V2.1,增加第五章:源码下载源码,修改github源码地址
java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
网站优化 • 优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-10-11 08:34
最近在做一个项目,有一个需求:从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,后来就稀里糊涂的打了代码(之前用的是Hadoop平台的分布式爬虫框架Nutch,用起来很方便,最后因为速度放弃了,但是生成的统计数据用在后来爬取),很快就成功下载了holder.html和finance.html页面,然后在解析了holder.html页面后,解析了finance.html,然后就郁闷的在这个页面找到了自己需要的东西数据不在 html 源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录后者)。我很高兴,终于找到了解决办法。. 兴奋地使用WebDriver,我想骂人。
以下是对WebDriver的投诉
WebDriver 是一个测试框架。当初设计的时候,不是用来服务爬虫的,但我想说的是:星盘只是有点短,你不能再进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从实际情况出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver 可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码太有限了。解析你写的js代码,js代码简单,当然WebDriver可以毫无压力的完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面用到的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page. asXml(),可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js。会启动一个带界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都免不了要解析js,这需要时间,而且对于没用的内核,js的支持程序也不一样。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身经历)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能得到完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。本来以为driver解析js完成后应该可以抓到状态,于是去找,找,但是根本没有这种方法,所以说为什么WebDriver的设计者没有往前走一步,这样我们就可以在程序中获取解析js后的驱动状态,所以不需要使用Thread.sleep(2000)这样的不确定代码,可惜我找不到它。它真的让我感到难过。领域。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会出现不同,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实如此。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码
在java端执行的代码
public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream(); //后面的代码省略,得到了InputStream就好说了 }
这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码不同编译,java端一直在等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要开启一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
我折腾了好几天了。虽然它没有解决我的问题,但我获得了很多知识。后面的工作就是熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以结合使用Nutch和WebDirver,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫获得的结果的稳定性有什么要说的,欢迎大家,因为我确实没有找到稳定爬虫结果的相关资料。 查看全部
java爬虫抓取动态网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
最近在做一个项目,有一个需求:从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,后来就稀里糊涂的打了代码(之前用的是Hadoop平台的分布式爬虫框架Nutch,用起来很方便,最后因为速度放弃了,但是生成的统计数据用在后来爬取),很快就成功下载了holder.html和finance.html页面,然后在解析了holder.html页面后,解析了finance.html,然后就郁闷的在这个页面找到了自己需要的东西数据不在 html 源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录后者)。我很高兴,终于找到了解决办法。. 兴奋地使用WebDriver,我想骂人。

以下是对WebDriver的投诉
WebDriver 是一个测试框架。当初设计的时候,不是用来服务爬虫的,但我想说的是:星盘只是有点短,你不能再进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从实际情况出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver 可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码太有限了。解析你写的js代码,js代码简单,当然WebDriver可以毫无压力的完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
什么是复杂度?
先贴一段代码
WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
这段代码的意思是大家都明白了。上面用到的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page. asXml(),可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js。会启动一个带界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都免不了要解析js,这需要时间,而且对于没用的内核,js的支持程序也不一样。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身经历)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
什么是多样性
前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能得到完成的页面,类似于下面的形式
WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。本来以为driver解析js完成后应该可以抓到状态,于是去找,找,但是根本没有这种方法,所以说为什么WebDriver的设计者没有往前走一步,这样我们就可以在程序中获取解析js后的驱动状态,所以不需要使用Thread.sleep(2000)这样的不确定代码,可惜我找不到它。它真的让我感到难过。领域。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会出现不同,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实如此。通过Thread.sleep(2000))等待js解析完成,我觉得不是一个好办法,不确定性太大,尤其是大型爬虫工作。
综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
phantomjs端要执行的代码


在java端执行的代码

public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream(); //后面的代码省略,得到了InputStream就好说了 }

这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码不同编译,java端一直在等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要开启一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
我折腾了好几天了。虽然它没有解决我的问题,但我获得了很多知识。后面的工作就是熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以结合使用Nutch和WebDirver,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
如果大家对使用WebDriver辅助爬虫获得的结果的稳定性有什么要说的,欢迎大家,因为我确实没有找到稳定爬虫结果的相关资料。
java爬虫抓取动态网页(java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-10-09 18:07
java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可,效果也不错。做到的主要工作包括:1.提取动态数据:比如图片信息,twitter的信息2.加载动态页面:比如下载一个图片(mongodb)3.关键字过滤:比如某个热点话题、歌曲名称4.查询:某个用户5.爬虫分析:分析数据的构成、各字段值的类型6.再记下某个页面历史记录不知道实现的意义是什么,也不知道是否合理,仅提供思路,欢迎探讨~。
比如说导航网站,要爬xxx2434,数据结构就是要有xxx这个字段,同时要爬取到最多数据字段对应的xxx2434。有可能你爬的动态数据,已经过数据结构的记录了。
有代码才能说明问题,就是有代码,都还是一样的效果,而且这个属于已经有的动态数据。另外任何程序语言都不存在真正意义上的「反爬虫」机制,爬虫出来的数据,都是你自己构造的(只是没有被动态封锁到页面的那些方法),比如你加上xxx2434的类型,爬虫原始数据就一定是txt类型,因为只有txt才能用「反爬虫」过滤掉那些cookie。
—我推荐一个稍稍有点技术性的:在爬虫的每一步都要尽量添加合理的指令实现「动态」数据,要动态的返回结果。说下好处:适合那些网站被封锁等不可抗力或者官方要有不易忽略的目的时使用,比如你要爬某些山地户外的数据库:爬虫的定义在百度百科中,「爬虫(quantumuniversalagent),是网络爬虫的一种,通过为网站生成webapi,为网站提供免费的代理ip,以此来代替站长的工作。
」(原文如下)此处只提前端时代的一些发展。其实最近几年前端地位被后端的网络爬虫取代,从传统ip定向代理,到基于socket的ip代理,再到通过ip隧道技术,更多的实现如网络多路复用,负载均衡等等。但这些东西,会加大爬虫的负担,比如加大后端api返回ip等等规则带来的定向处理的负担。反爬虫在后端时代确实有存在的必要,比如某些社交网站,你的cookie大部分作用是获取更多的用户信息,或者sns网站,你的大部分session的作用是存放你的信息(这是定向请求的差异性,而不是反爬虫)。
爬虫更大的应用是作为一个中间产品,提供一个小小的反爬虫机制。可以简单理解:反爬虫就是为了把在一定条件下,对来访者进行识别的机制,用户体验可能差一点,但是无法100%避免动态伪造,再说动态处理也不见得比反爬虫强。从。 查看全部
java爬虫抓取动态网页(java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可)
java爬虫抓取动态网页还是比较容易的,再加上设置反爬虫机制即可,效果也不错。做到的主要工作包括:1.提取动态数据:比如图片信息,twitter的信息2.加载动态页面:比如下载一个图片(mongodb)3.关键字过滤:比如某个热点话题、歌曲名称4.查询:某个用户5.爬虫分析:分析数据的构成、各字段值的类型6.再记下某个页面历史记录不知道实现的意义是什么,也不知道是否合理,仅提供思路,欢迎探讨~。
比如说导航网站,要爬xxx2434,数据结构就是要有xxx这个字段,同时要爬取到最多数据字段对应的xxx2434。有可能你爬的动态数据,已经过数据结构的记录了。
有代码才能说明问题,就是有代码,都还是一样的效果,而且这个属于已经有的动态数据。另外任何程序语言都不存在真正意义上的「反爬虫」机制,爬虫出来的数据,都是你自己构造的(只是没有被动态封锁到页面的那些方法),比如你加上xxx2434的类型,爬虫原始数据就一定是txt类型,因为只有txt才能用「反爬虫」过滤掉那些cookie。
—我推荐一个稍稍有点技术性的:在爬虫的每一步都要尽量添加合理的指令实现「动态」数据,要动态的返回结果。说下好处:适合那些网站被封锁等不可抗力或者官方要有不易忽略的目的时使用,比如你要爬某些山地户外的数据库:爬虫的定义在百度百科中,「爬虫(quantumuniversalagent),是网络爬虫的一种,通过为网站生成webapi,为网站提供免费的代理ip,以此来代替站长的工作。
」(原文如下)此处只提前端时代的一些发展。其实最近几年前端地位被后端的网络爬虫取代,从传统ip定向代理,到基于socket的ip代理,再到通过ip隧道技术,更多的实现如网络多路复用,负载均衡等等。但这些东西,会加大爬虫的负担,比如加大后端api返回ip等等规则带来的定向处理的负担。反爬虫在后端时代确实有存在的必要,比如某些社交网站,你的cookie大部分作用是获取更多的用户信息,或者sns网站,你的大部分session的作用是存放你的信息(这是定向请求的差异性,而不是反爬虫)。
爬虫更大的应用是作为一个中间产品,提供一个小小的反爬虫机制。可以简单理解:反爬虫就是为了把在一定条件下,对来访者进行识别的机制,用户体验可能差一点,但是无法100%避免动态伪造,再说动态处理也不见得比反爬虫强。从。
java爬虫抓取动态网页(Java_爬虫,如何抓取Js动态生成数据的页面?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-10-09 00:18
Java_爬虫,如何抓取Js生成的动态数据的页面?
很多网站使用js或者jquery来生成数据。后台获取数据后,使用 document.write() 或 ("#id").html="" 写入页面。这时候用浏览器看源码是看不到数据的。
HttpClient 不起作用。看网上的HtmlUnit,说后台js加载后可以得到完整的页面,但是我按照文章上写的,但是不行。
对于答案,典型的是此链接的页面。 java程序中如何获取数据?
------解决思路--------------
试试
String s= "http://xinjinqiao.tprtc.com/ad ... %3Bbr />
URL url = new URL(s);<br />
HttpURLConnection http = (HttpURLConnection) url.openConnection();<br />
http.setDoOutput(true); <br />
http.setDoInput(true); <br />
http.setRequestMethod("POST"); <br />
http.connect(); <br />
OutputStreamWriter out = new OutputStreamWriter(http.getOutputStream(), "UTF-8"); <br />
<br />
String input = "name=flr&nowpage=1&pagesize=10"; <br />
<br />
out.append(input); <br />
out.flush(); <br />
out.close(); <br />
int length = (int) http.getContentLength();<br />
System.out.println(length);<br />
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));<br />
String line;<br />
StringBuffer buffer = new StringBuffer();<br />
while ((line = reader.readLine()) != null) {<br />
buffer.append(line);<br />
}<br />
reader.close();<br />
http.disconnect();<br />
System.out.println(buffer.toString());
------解决思路--------------
可以看代码,也可以抓包看看。 查看全部
java爬虫抓取动态网页(Java_爬虫,如何抓取Js动态生成数据的页面?)
Java_爬虫,如何抓取Js生成的动态数据的页面?
很多网站使用js或者jquery来生成数据。后台获取数据后,使用 document.write() 或 ("#id").html="" 写入页面。这时候用浏览器看源码是看不到数据的。
HttpClient 不起作用。看网上的HtmlUnit,说后台js加载后可以得到完整的页面,但是我按照文章上写的,但是不行。
对于答案,典型的是此链接的页面。 java程序中如何获取数据?
------解决思路--------------
试试
String s= "http://xinjinqiao.tprtc.com/ad ... %3Bbr />
URL url = new URL(s);<br />
HttpURLConnection http = (HttpURLConnection) url.openConnection();<br />
http.setDoOutput(true); <br />
http.setDoInput(true); <br />
http.setRequestMethod("POST"); <br />
http.connect(); <br />
OutputStreamWriter out = new OutputStreamWriter(http.getOutputStream(), "UTF-8"); <br />
<br />
String input = "name=flr&nowpage=1&pagesize=10"; <br />
<br />
out.append(input); <br />
out.flush(); <br />
out.close(); <br />
int length = (int) http.getContentLength();<br />
System.out.println(length);<br />
BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));<br />
String line;<br />
StringBuffer buffer = new StringBuffer();<br />
while ((line = reader.readLine()) != null) {<br />
buffer.append(line);<br />
}<br />
reader.close();<br />
http.disconnect();<br />
System.out.println(buffer.toString());
------解决思路--------------
可以看代码,也可以抓包看看。
java爬虫抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-10-09 00:16
汤
Jsoup:Java HTML 解析器,具有最好的 DOM、CSS 和 jquery
使用入门案例介绍
org.jsoup
jsoup
1.10.2
使用简单
Document document = Jsoup.connect(url)
.timeout(30000)
.validateTLSCertificates(false)
.get();
Elements elements = document.select(".book-chapter-list > .cf:last-child > li");
for (Element element : elements) {
String title = element.text();
String chapUrl = url + element.select("a").attr("href");
// 其他构件存储操作
}
这里的主要目的是指定一个访问的url,然后通过各种选择器获取我们想要的元素信息。
动态js内容背景
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是AJAX获取的,所以分析AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。
缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。
好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,这对于后面的项目部署到浏览器非常不利!
所以推荐第一种方法,代码也是第一种方法。
htmlunitjava 模拟js执行
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(new InputStreamReader(Login.class
.getResourceAsStream("/sha1.js")));
Object t = engine.eval("CryptoJS.SHA1('" + password+ "').toString();");
System.out.println(t);
jsoup 模拟ajax请求
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
jsoup抓取页面js信息
/*设置网页抓取响应时间*/
private static final int TIMEOUT = 10000;
public static Map getSerieExtDetail(int serieId) throws Exception{
/*车系参数配置页面*/
String serieInfo = "http://car.autohome.com.cn/con ... 3B%3B
/*用來封裝要保存的参数*/
Map map = new HashMap();
/*取得车系参数配置页面文档*/
Document document = Jsoup.connect(serieInfo).timeout(TIMEOUT).get();
/*取得script下面的JS变量*/
Elements e = document.getElementsByTag("script").eq(6);
/*循环遍历script下面的JS变量*/
for (Element element : e) {
/*取得JS变量数组*/
String[] data = element.data().toString().split("var");
/*取得单个JS变量*/
for(String variable : data){
/*过滤variable为空的数据*/
if(variable.contains("=")){
/*取到满足条件的JS变量*/
if(variable.contains("option") || variable.contains("config")
|| variable.contains("color") || variable.contains("innerColor")){
String[] kvp = variable.split("=");
/*取得JS变量存入map*/
if(!map.containsKey(kvp[0].trim()))
map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length()-1).toString());
}
}
}
}
return map;
}
进一步阅读
webmagic-另一个爬虫选项 查看全部
java爬虫抓取动态网页(JsoupJsoup:JavaHTMLParser,,andjquery使用入门案例)
汤
Jsoup:Java HTML 解析器,具有最好的 DOM、CSS 和 jquery
使用入门案例介绍
org.jsoup
jsoup
1.10.2
使用简单
Document document = Jsoup.connect(url)
.timeout(30000)
.validateTLSCertificates(false)
.get();
Elements elements = document.select(".book-chapter-list > .cf:last-child > li");
for (Element element : elements) {
String title = element.text();
String chapUrl = url + element.select("a").attr("href");
// 其他构件存储操作
}
这里的主要目的是指定一个访问的url,然后通过各种选择器获取我们想要的元素信息。
动态js内容背景
最近因为工作需要,开始学习爬虫。对于静态加载的页面,爬取并不难,但是遇到ajax动态加载的页面,就无法爬取到动态加载的信息了!
爬取Ajax动态加载的数据,一般有两种方式:
1.因为js渲染页面的数据也是从后端获取的,而且基本都是AJAX获取的,所以分析AJAX请求,找到对应的数据
请求也是一种更可行的方法。并且与页面样式相比,这个界面不太可能发生变化。
缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
2.在爬虫阶段,爬虫内置了一个浏览器内核,执行js渲染页面后,就会被爬取。这方面对应的工具是Selenium,
HtmlUnit 或 PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。
好处是写规则
对于第二种方法,我测试过只有Selenium可以成功爬到Ajax动态加载的页面,但是每次请求页面都会弹出浏览器窗口,这对于后面的项目部署到浏览器非常不利!
所以推荐第一种方法,代码也是第一种方法。
htmlunitjava 模拟js执行
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(new InputStreamReader(Login.class
.getResourceAsStream("/sha1.js")));
Object t = engine.eval("CryptoJS.SHA1('" + password+ "').toString();");
System.out.println(t);
jsoup 模拟ajax请求
//然后就是模拟ajax请求,当然了,根据规律,需要将"datasku"的属性值替换下面链接中的"133537397"和"0000000000"值
Document document1=Jsoup.connect("http://ds.suning.cn/ds/general ... 6quot;)
.ignoreContentType(true)
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.get();
//打印出模拟ajax请求返回的数据,一个json格式的数据,对它进行解析就可以了
System.out.println(document1.text());
jsoup抓取页面js信息
/*设置网页抓取响应时间*/
private static final int TIMEOUT = 10000;
public static Map getSerieExtDetail(int serieId) throws Exception{
/*车系参数配置页面*/
String serieInfo = "http://car.autohome.com.cn/con ... 3B%3B
/*用來封裝要保存的参数*/
Map map = new HashMap();
/*取得车系参数配置页面文档*/
Document document = Jsoup.connect(serieInfo).timeout(TIMEOUT).get();
/*取得script下面的JS变量*/
Elements e = document.getElementsByTag("script").eq(6);
/*循环遍历script下面的JS变量*/
for (Element element : e) {
/*取得JS变量数组*/
String[] data = element.data().toString().split("var");
/*取得单个JS变量*/
for(String variable : data){
/*过滤variable为空的数据*/
if(variable.contains("=")){
/*取到满足条件的JS变量*/
if(variable.contains("option") || variable.contains("config")
|| variable.contains("color") || variable.contains("innerColor")){
String[] kvp = variable.split("=");
/*取得JS变量存入map*/
if(!map.containsKey(kvp[0].trim()))
map.put(kvp[0].trim(), kvp[1].trim().substring(0, kvp[1].trim().length()-1).toString());
}
}
}
}
return map;
}
进一步阅读
webmagic-另一个爬虫选项
java爬虫抓取动态网页(一下栗子:我对爬与反爬的关系的理解 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-08 07:01
)
写之前先说说我对爬行和反爬关系的理解
一、什么是爬虫
Crawler 英文是spliter,意思是蜘蛛。网络爬虫系统的功能是下载网页数据,并对所需数据进行采集。主体是根据初始超链接下载并解析目标页面。这时候有两件事,一是继续往容器中添加相关的超链接,二是解析页面的目标数据,一直循环下去,直到没有url解析出来。举个栗子:我要爬苏宁手机价格数据。爬取的思路是获取第一页的URL作为蜘蛛网的中心点,爬取当前页的手机详情页的价格信息和下一页的URL。并将其添加到容器中,这样只要将url容器存储在循环中,会继续机械执行,直到最后一页没有下一页为止。这是一个扩散的过程。
二、什么是反爬虫,为什么应该是
反爬虫就是根据请求的某些访问特性进行特殊的处理,比如屏蔽IP、轰炸验证码、返回非对应信息等。
反爬大概有几个原因
1、爬虫占了很高的总PV值,相当于一大群僵尸用户访问你的网站。如果不加以控制,只会浪费服务器资源。
2、有些人因为商业竞争问题必须反爬,防止自己的商业信息被竞争对手批量获取。我看到了一个非常合适的例子。对外卖了两个产品,一个家庭写了一个脚本,自动爬取对手的网站产品价格并与自己的产品价格进行比较,并保持在一定价格以下进行动态波动。买之前一定要了解同行业的价格,所以大家都知道结果。对方很快就发现了这里的连队手脚,一场激烈的攀爬和反攀爬比赛开始了。
3、还有一些无人认领的爬虫。可能使用它们的人都忘记了它的存在,一直在艰难地爬行。
三、一些常见的防爬方法
1、 根据IP访问频率和IP数量上限,用户每秒访问页面数十次或每半秒一次,持续数小时。动作明显,封堵结束。
2、 页面加载时也有动态访问,而不是静态数据。比如动态加载一些董的价格信息
3、还有,主页面是异步加载的,嵌套在iframe中,src="about:blank",这个正常下载的页面没有内容
4、 故意挖洞,在页面上做一些隐藏的链接。如果访问明显是爬虫爬进来的,下一步就是拦截
5、 后端查询统计并对userAgent进行阈值判断。这个据说容易误伤
6、 页面展示也有花样,部分价格信息用图片展示。去哪儿网
7、Cookie 反扒,推荐链接,有很好的介绍入口
四、 破解前三个
1.设置ip池周期循环访问
首先,我们从诸如 Xisui 网站 等代理那里获取一些免费 ip,其次,我们执行无效 ip 过滤。此步骤视情况而定。我个人的做法是Xisci网络上的ip有时可以访问有时无效,所以我只是去掉过滤步骤,然后使用这些代理ip进行实际访问。
<p>public class CsdnReadCount implements PageProcessor {
// IP地址代理库Map
private static Map IPProxyRepository = new HashMap();
private static List keysArray = new ArrayList();
private static int index;
private Site site = Site
.me()
.setDomain("http://www.xicidaili.com/")
.setSleepTime(3000).setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
//按照顺序获取一个ip
public static HttpHost getRandomProxy() {
// 随机获取host:port,并构建代理对象
String host = keysArray.get(index);
if(index 查看全部
java爬虫抓取动态网页(一下栗子:我对爬与反爬的关系的理解
)
写之前先说说我对爬行和反爬关系的理解
一、什么是爬虫
Crawler 英文是spliter,意思是蜘蛛。网络爬虫系统的功能是下载网页数据,并对所需数据进行采集。主体是根据初始超链接下载并解析目标页面。这时候有两件事,一是继续往容器中添加相关的超链接,二是解析页面的目标数据,一直循环下去,直到没有url解析出来。举个栗子:我要爬苏宁手机价格数据。爬取的思路是获取第一页的URL作为蜘蛛网的中心点,爬取当前页的手机详情页的价格信息和下一页的URL。并将其添加到容器中,这样只要将url容器存储在循环中,会继续机械执行,直到最后一页没有下一页为止。这是一个扩散的过程。
二、什么是反爬虫,为什么应该是
反爬虫就是根据请求的某些访问特性进行特殊的处理,比如屏蔽IP、轰炸验证码、返回非对应信息等。
反爬大概有几个原因
1、爬虫占了很高的总PV值,相当于一大群僵尸用户访问你的网站。如果不加以控制,只会浪费服务器资源。
2、有些人因为商业竞争问题必须反爬,防止自己的商业信息被竞争对手批量获取。我看到了一个非常合适的例子。对外卖了两个产品,一个家庭写了一个脚本,自动爬取对手的网站产品价格并与自己的产品价格进行比较,并保持在一定价格以下进行动态波动。买之前一定要了解同行业的价格,所以大家都知道结果。对方很快就发现了这里的连队手脚,一场激烈的攀爬和反攀爬比赛开始了。
3、还有一些无人认领的爬虫。可能使用它们的人都忘记了它的存在,一直在艰难地爬行。
三、一些常见的防爬方法
1、 根据IP访问频率和IP数量上限,用户每秒访问页面数十次或每半秒一次,持续数小时。动作明显,封堵结束。
2、 页面加载时也有动态访问,而不是静态数据。比如动态加载一些董的价格信息
3、还有,主页面是异步加载的,嵌套在iframe中,src="about:blank",这个正常下载的页面没有内容
4、 故意挖洞,在页面上做一些隐藏的链接。如果访问明显是爬虫爬进来的,下一步就是拦截
5、 后端查询统计并对userAgent进行阈值判断。这个据说容易误伤
6、 页面展示也有花样,部分价格信息用图片展示。去哪儿网
7、Cookie 反扒,推荐链接,有很好的介绍入口
四、 破解前三个
1.设置ip池周期循环访问
首先,我们从诸如 Xisui 网站 等代理那里获取一些免费 ip,其次,我们执行无效 ip 过滤。此步骤视情况而定。我个人的做法是Xisci网络上的ip有时可以访问有时无效,所以我只是去掉过滤步骤,然后使用这些代理ip进行实际访问。
<p>public class CsdnReadCount implements PageProcessor {
// IP地址代理库Map
private static Map IPProxyRepository = new HashMap();
private static List keysArray = new ArrayList();
private static int index;
private Site site = Site
.me()
.setDomain("http://www.xicidaili.com/")
.setSleepTime(3000).setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
//按照顺序获取一个ip
public static HttpHost getRandomProxy() {
// 随机获取host:port,并构建代理对象
String host = keysArray.get(index);
if(index
java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-10-08 06:27
Selenium 本身是一个自动化测试工具,可以模拟浏览器加载页面。优点是可以通过程序自动完成页面登录、AJAX内容获取等操作。
尤其是在获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,而selenium完美的帮助我们实现了这个功能。
但它也有一些缺点。使用selenium函数时,需要提前加载selenium驱动,通过selenium自身加载页面动态生成的内容,供后期抓取。
但是本节我们只讲selenium的一个基本操作:页面登录
后面我们会讲如何通过selenium抓取动态页面
================================================ 我是萌萌哒分割线============================================== ========
启动代码:
首先我们先通过maven配置selenium的相关依赖
org.seleniumhq.selenium
selenium-java
3.3.1
以上是selenium的相关配置。当然,webmagic 本身也集成了 selenium。相关配置如下:
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
webmagic的这个配置有一个简单的selenium包,看你的喜好了。
使用selenium抓取整个页面时,首先需要下载相关的浏览器驱动。不同版本浏览器的驱动是不同的。
我用的是chrome驱动,所以我也提供了chromedriver的下载地址。其他驱动如火狐和IE在百度上很容易找到。
chromedriver 相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前需要上面两句加载浏览器驱动和爬取目标URL
我以为我把驱动放在了chrome路径下的bin文件夹下,在环境变量路径中添加了chromedriver地址,所以我用新的ChromeDriver的时候没有带参数
如果不想把驱动赋值给环境变量,可以直接把驱动的路径写成参数传入(
例子:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是模拟登录美拍的代码。一些基本的BasePageProcess类之前已经配置好了,站点和一些基本的逻辑功能都放在里面。然后爬虫程序只需要完成页面解析功能,但是当时忘记放BasePageProcess类了。代码贴出来了,有人反馈说程序跑不起来,所以这次把一切都简化了,实现了webmagic最基本的PageProcessor接口。所有的逻辑都体现在上面的程序中。
代码功能比较简单,主要是通过findElement方法定位账号密码输入框,输入对应的账号密码,最后点击login完成整个模拟登陆操作。
Selenium本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高! 查看全部
java爬虫抓取动态网页(selenium使用selenium功能的时候,如何通过selenium进行页面的加载)
Selenium 本身是一个自动化测试工具,可以模拟浏览器加载页面。优点是可以通过程序自动完成页面登录、AJAX内容获取等操作。
尤其是在获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,而selenium完美的帮助我们实现了这个功能。
但它也有一些缺点。使用selenium函数时,需要提前加载selenium驱动,通过selenium自身加载页面动态生成的内容,供后期抓取。
但是本节我们只讲selenium的一个基本操作:页面登录
后面我们会讲如何通过selenium抓取动态页面
================================================ 我是萌萌哒分割线============================================== ========
启动代码:
首先我们先通过maven配置selenium的相关依赖
org.seleniumhq.selenium
selenium-java
3.3.1
以上是selenium的相关配置。当然,webmagic 本身也集成了 selenium。相关配置如下:
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
us.codecraft
webmagic-selenium
${webmagic.version}
org.slf4j
slf4j-log4j12
webmagic的这个配置有一个简单的selenium包,看你的喜好了。
使用selenium抓取整个页面时,首先需要下载相关的浏览器驱动。不同版本浏览器的驱动是不同的。
我用的是chrome驱动,所以我也提供了chromedriver的下载地址。其他驱动如火狐和IE在百度上很容易找到。
chromedriver 相关资源
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前需要上面两句加载浏览器驱动和爬取目标URL
我以为我把驱动放在了chrome路径下的bin文件夹下,在环境变量路径中添加了chromedriver地址,所以我用新的ChromeDriver的时候没有带参数
如果不想把驱动赋值给环境变量,可以直接把驱动的路径写成参数传入(
例子:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}//防止页面未能及时加载出来而设置一段时间延迟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登录按钮,点击
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("账号");
driver.findElement(By.id("passwd")).sendKeys("密码");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List spiderListeners = new ArrayList();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是模拟登录美拍的代码。一些基本的BasePageProcess类之前已经配置好了,站点和一些基本的逻辑功能都放在里面。然后爬虫程序只需要完成页面解析功能,但是当时忘记放BasePageProcess类了。代码贴出来了,有人反馈说程序跑不起来,所以这次把一切都简化了,实现了webmagic最基本的PageProcessor接口。所有的逻辑都体现在上面的程序中。
代码功能比较简单,主要是通过findElement方法定位账号密码输入框,输入对应的账号密码,最后点击login完成整个模拟登陆操作。
Selenium本身没有什么难懂的,它也可以帮助我们更好的完善爬虫的功能。用好它,爬虫的水平一定会提高!
java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-10-07 23:11
免费资源网-
目录Java实现网络爬虫框架一、各个类的功能介绍二、各个类Java实现网络爬虫框架的源码
我目前正在从事与搜索相关的项目。我需要抓取互联网上的一些链接并将它们存储在索引库中。虽然有很多强大的开源爬虫框架,但是我抱着学习的态度写了一个简单的网络爬虫。了解原理。今天就给小伙伴们分享一下这个简单的爬虫程序!!
一、各个类的作用DownloadPage.java的作用就是下载这个超链接的页面源代码。FunctionUtils.java的作用是提供不同的静态方法,包括:页面链接正则表达式匹配、URL链接获取判断是否创建文件、获取页面的Url并转换为标准化的Url、拦截目标网页源文件的内容。HrefOfPage.java 的作用是获取页面源代码的超链接。UrlDataHanding.java 的作用是集成各种类,实现url获取数据到数据处理类。UrlQueue.java 未访问的 Url 队列。VisitedUrlQueue.java 已访问的 URL 队列。二、各个类的源码
DownloadPage.java 为此类使用 HttpClient 组件。
package com.sreach.spider;
import java.io.IOException;
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;
/**
* @author binghe
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrl(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) {
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
此类的 FunctionUtils.java 方法是静态方法
<p>
package com.sreach.spider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author binghe
*/
public class FunctionUtils {
/**
* 匹配超链接的正则表达式
*/
private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";
private static Pattern pattern = Pattern.compile(pat);
private static BufferedWriter writer = null;
/**
* 爬虫搜索深度
*/
public static int depth = 0;
/**
* 以"/"来分割URL,获得超链接的元素
*
* @param url
* @return
*/
public static String[] divUrl(String url) {
return url.split("/");
}
/**
* 判断是否创建文件
*
* @param url
* @return
*/
public static boolean isCreateFile(String url) {
Matcher matcher = pattern.matcher(url);
return matcher.matches();
}
/**
* 创建对应文件
*
* @param content
* @param urlPath
*/
public static void createFile(String content, String urlPath) {
/* 分割url */
String[] elems = divUrl(urlPath);
StringBuffer path = new StringBuffer();
File file = null;
for (int i = 1; i < elems.length; i++) {
if (i != elems.length - 1) {
path.append(elems[i]);
path.append(File.separator);
file = new File("D:" + File.separator + path.toString());
}
if (i == elems.length - 1) {
Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");
Matcher matcher = pattern.matcher(elems[i]);
if ((matcher.matches())) {
if (!file.exists()) {
file.mkdirs();
}
String[] fileName = elems[i].split("\\.");
file = new File("D:" + File.separator + path.toString()
+ File.separator + fileName[0] + ".txt");
try {
file.createNewFile();
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file)));
writer.write(content);
writer.flush();
writer.close();
System.out.println("创建文件成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 获取页面的超链接并将其转换为正式的A标签
*
* @param href
* @return
*/
public static String getHrefOfInOut(String href) {
/* 内外部链接最终转化为完整的链接格式 */
String resultHref = null;
/* 判断是否为外部链接 */
if (href.startsWith("http://")) {
resultHref = href;
} else {
/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */
if (href.startsWith("/")) {
resultHref = "http://www.oschina.net" + href;
}
}
return resultHref;
}
/**
* 截取网页网页源文件的目标内容
*
* @param content
* @return
*/
public static String getGoalContent(String content) {
int sign = content.indexOf(" 查看全部
java爬虫抓取动态网页(每个类的源代码Java实现网络爬虫框架(一))
免费资源网-
目录Java实现网络爬虫框架一、各个类的功能介绍二、各个类Java实现网络爬虫框架的源码
我目前正在从事与搜索相关的项目。我需要抓取互联网上的一些链接并将它们存储在索引库中。虽然有很多强大的开源爬虫框架,但是我抱着学习的态度写了一个简单的网络爬虫。了解原理。今天就给小伙伴们分享一下这个简单的爬虫程序!!
一、各个类的作用DownloadPage.java的作用就是下载这个超链接的页面源代码。FunctionUtils.java的作用是提供不同的静态方法,包括:页面链接正则表达式匹配、URL链接获取判断是否创建文件、获取页面的Url并转换为标准化的Url、拦截目标网页源文件的内容。HrefOfPage.java 的作用是获取页面源代码的超链接。UrlDataHanding.java 的作用是集成各种类,实现url获取数据到数据处理类。UrlQueue.java 未访问的 Url 队列。VisitedUrlQueue.java 已访问的 URL 队列。二、各个类的源码
DownloadPage.java 为此类使用 HttpClient 组件。
package com.sreach.spider;
import java.io.IOException;
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;
/**
* @author binghe
*/
public class DownloadPage {
/**
* 根据URL抓取网页内容
*
* @param url
* @return
*/
public static String getContentFormUrl(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) {
FunctionUtils.createFile(
FunctionUtils.getGoalContent(content), url);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.getConnectionManager().shutdown();
}
return content;
}
}
此类的 FunctionUtils.java 方法是静态方法
<p>
package com.sreach.spider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author binghe
*/
public class FunctionUtils {
/**
* 匹配超链接的正则表达式
*/
private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";
private static Pattern pattern = Pattern.compile(pat);
private static BufferedWriter writer = null;
/**
* 爬虫搜索深度
*/
public static int depth = 0;
/**
* 以"/"来分割URL,获得超链接的元素
*
* @param url
* @return
*/
public static String[] divUrl(String url) {
return url.split("/");
}
/**
* 判断是否创建文件
*
* @param url
* @return
*/
public static boolean isCreateFile(String url) {
Matcher matcher = pattern.matcher(url);
return matcher.matches();
}
/**
* 创建对应文件
*
* @param content
* @param urlPath
*/
public static void createFile(String content, String urlPath) {
/* 分割url */
String[] elems = divUrl(urlPath);
StringBuffer path = new StringBuffer();
File file = null;
for (int i = 1; i < elems.length; i++) {
if (i != elems.length - 1) {
path.append(elems[i]);
path.append(File.separator);
file = new File("D:" + File.separator + path.toString());
}
if (i == elems.length - 1) {
Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");
Matcher matcher = pattern.matcher(elems[i]);
if ((matcher.matches())) {
if (!file.exists()) {
file.mkdirs();
}
String[] fileName = elems[i].split("\\.");
file = new File("D:" + File.separator + path.toString()
+ File.separator + fileName[0] + ".txt");
try {
file.createNewFile();
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file)));
writer.write(content);
writer.flush();
writer.close();
System.out.println("创建文件成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 获取页面的超链接并将其转换为正式的A标签
*
* @param href
* @return
*/
public static String getHrefOfInOut(String href) {
/* 内外部链接最终转化为完整的链接格式 */
String resultHref = null;
/* 判断是否为外部链接 */
if (href.startsWith("http://")) {
resultHref = href;
} else {
/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" rel="external nofollow" */
if (href.startsWith("/")) {
resultHref = "http://www.oschina.net" + href;
}
}
return resultHref;
}
/**
* 截取网页网页源文件的目标内容
*
* @param content
* @return
*/
public static String getGoalContent(String content) {
int sign = content.indexOf("
java爬虫抓取动态网页(让你在5分钟之内写好一个爬虫)
网站优化 • 优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-07 23:08
小型的:
目标是让你在 5 分钟内编写一个爬虫。参考crawler4j,如果经常需要写爬虫,就需要写很多爬虫,还是不错的,因为上手肯定要5分钟以上。缺点是它不是很可定制。
垂直、全栈、模块化爬虫。它更适合捕捉特定领域的信息。收录下载、调度、持久化、页面处理等模块。您可以自己实现每个模块,也可以选择它已经为您实现的解决方案。这使得它高度可定制。
看看它的例子:
编写第一个爬虫
1 import us.codecraft.webmagic.Page;
2 import us.codecraft.webmagic.Site;
3 import us.codecraft.webmagic.Spider;
4 import us.codecraft.webmagic.processor.PageProcessor;
5
6 public class GithubRepoPageProcessor implements PageProcessor {
7
8 private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
9
10 @Override
11 public void process(Page page) {
12 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
13 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
14 page.putField("name", page.getHtml().xpath("//h1[@class=\'entry-title public\']/strong/a/text()").toString());
15 if (page.getResultItems().get("name")==null){
16 //skip this page
17 page.setSkip(true);
18 }
19 page.putField("readme", page.getHtml().xpath("//div[@id=\'readme\']/tidyText()"));
20 }
21
22 @Override
23 public Site getSite() {
24 return site;
25 }
26
27 public static void main(String[] args) {
28 Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
29 }
30 }
使用注解编写爬虫
1 @TargetUrl("https://github.com/\\w+/\\w+")
2 @HelpUrl("https://github.com/\\w+")
3 public class GithubRepo {
4
5 @ExtractBy(value = "//h1[@class=\'entry-title public\']/strong/a/text()", notNull = true)
6 private String name;
7
8 @ExtractByUrl("https://github\\.com/(\\w+)/.*")
9 private String author;
10
11 @ExtractBy("//div[@id=\'readme\']/tidyText()")
12 private String readme;
13
14 public static void main(String[] args) {
15 OOSpider.create(Site.me().setSleepTime(1000)
16 , new ConsolePageModelPipeline(), GithubRepo.class)
17 .addUrl("https://github.com/code4craft").thread(5).run();
18 }
19 }
无论哪种方式,都可以抓取github项目。 查看全部
java爬虫抓取动态网页(让你在5分钟之内写好一个爬虫)
小型的:
目标是让你在 5 分钟内编写一个爬虫。参考crawler4j,如果经常需要写爬虫,就需要写很多爬虫,还是不错的,因为上手肯定要5分钟以上。缺点是它不是很可定制。
垂直、全栈、模块化爬虫。它更适合捕捉特定领域的信息。收录下载、调度、持久化、页面处理等模块。您可以自己实现每个模块,也可以选择它已经为您实现的解决方案。这使得它高度可定制。
看看它的例子:
编写第一个爬虫
1 import us.codecraft.webmagic.Page;
2 import us.codecraft.webmagic.Site;
3 import us.codecraft.webmagic.Spider;
4 import us.codecraft.webmagic.processor.PageProcessor;
5
6 public class GithubRepoPageProcessor implements PageProcessor {
7
8 private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
9
10 @Override
11 public void process(Page page) {
12 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
13 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
14 page.putField("name", page.getHtml().xpath("//h1[@class=\'entry-title public\']/strong/a/text()").toString());
15 if (page.getResultItems().get("name")==null){
16 //skip this page
17 page.setSkip(true);
18 }
19 page.putField("readme", page.getHtml().xpath("//div[@id=\'readme\']/tidyText()"));
20 }
21
22 @Override
23 public Site getSite() {
24 return site;
25 }
26
27 public static void main(String[] args) {
28 Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
29 }
30 }
使用注解编写爬虫
1 @TargetUrl("https://github.com/\\w+/\\w+")
2 @HelpUrl("https://github.com/\\w+")
3 public class GithubRepo {
4
5 @ExtractBy(value = "//h1[@class=\'entry-title public\']/strong/a/text()", notNull = true)
6 private String name;
7
8 @ExtractByUrl("https://github\\.com/(\\w+)/.*")
9 private String author;
10
11 @ExtractBy("//div[@id=\'readme\']/tidyText()")
12 private String readme;
13
14 public static void main(String[] args) {
15 OOSpider.create(Site.me().setSleepTime(1000)
16 , new ConsolePageModelPipeline(), GithubRepo.class)
17 .addUrl("https://github.com/code4craft").thread(5).run();
18 }
19 }
无论哪种方式,都可以抓取github项目。