function one_crawl($form, $form_state) {
$link = 'http://blog.eau-thermale-avene.cn/post/536.html';
blog_crawler($link);
}
//save url content to node:blog.
function blog_crawler($link, &$context = array(), $summary = NULL) {
if (empty($link)) return;
watchdog('crawler link', $link);
$default = array(
'uid' => 1,
);
$fetch = new BlogFetch('blog', $link, $default);
$blog = str_get_html($fetch->html);
//Blog Pushlish date.
$date = $blog->find('#divMain h2.post-title span.post-date', 0)->plaintext;
$blog->find('#divMain h2.post-title span.post-date', 0)->innertext = '';
//dsm($date);
$fetch->set('created', strtotime($date));
//Entity property changed doesn't support writing。。。
//$fetch->set('changed', strtotime($date));
//Blog Title.
$blog->find('#divMain h2.post-title span', 0)->outertext = '';
$title = $blog->find('#divMain h2.post-title', 0)->innertext;
$title = str_replace('Q&A', 'Q&A', $title);
$fetch->set('title', $title);
//Blog Original URL.
$fetch->set('field_link', array('url' => $link));
//Blog Tags.
$terms = array();
$tags = $blog->find('#divMain div.post-body .post-info a');
foreach ($tags as $tag) {
if(!empty($tag->plaintext)) {
$terms[] = avene_taxonomy($tag->plaintext, 'blog_tags');
}
}
$fetch->set('field_blog_tags', $terms);
//Blog Category..
$cate = drupal_substr(trim($blog->find('#divMain div.post-body .post-footer-category', 0)->plaintext),3);
$term = avene_taxonomy($cate, 'blog_category');
$fetch->set('field_blog_type', $term);
//Blog Body.
$blog->find('#divMain div.post-body .post-info', 0)->outertext = '';
$blog->find('#divMain div.post-body .post-footer', 0)->outertext = '';
$body = $blog->find('#divMain div.post-body', 0)->innertext;
$fetch->set('body', array('format' => 'full_html', 'summary' => $summary, 'value' => $body));
//Blog comments...
foreach ($blog->find('.msg-boxes .msg-box-content') as $c) {
if(empty($c->plaintext)) return;
$comment->nid = $fetch->entity->nid; // nid of a node you want to attach a comment to
$comment->cid = 0; // leave it as is
$comment->pid = 0; // parent comment id, 0 if none
$comment->uid = 0; // user's id, who left the comment
//$comment->mail = 'email@example.com'; // user's email
//$comment->name = 'User name'; // If user is authenticated you can omit this field, it will be auto-populated, if the user is anonymous and you want to name him somehow, input his name here
//$comment->thread = '01/'; // OPTIONAL. If you need comments to be threaded you can fill this value. Otherwise omit it.
$c->find('.msgtime a', 0)->outertext = '';
$comment->created = strtotime(trim($c->find('.msgtime', 0)->plaintext));
$comment->is_anonymous = 1; // leave it as is
$comment->status = COMMENT_PUBLISHED; // We auto-publish this comment
$comment->language = LANGUAGE_NONE; // The same as for a node
$comment->subject = '';
$val = filter_var($c->find('.msgarticle', 0)->plaintext, FILTER_SANITIZE_SPECIAL_CHARS);
//$val = preg_replace('/[^(\x20-\x7F)]*/','', $val);
$replace = array( ''=>'');
$val = strtr($val, $replace);
$comment->comment_body[$comment->language][0]['value'] = $val;
$comment->comment_body[$comment->language][0]['format'] = 'full_html';
comment_submit($comment); // saving a comment
comment_save($comment);
}
//$context['results']['processed']++;
$context['message'] = 'fetching ' . $fetch->entity->title;
}
class BlogFetch {
protected $type;
protected $url;
protected $args;
var $html;
var $entity;
function __construct($type, $url, $args = array()) {
$this->type = $type;
$this->args = $args;
$this->url = $url;
$this->fetchData();
$this->buildEntity();
}
//Init entity...
function buildEntity() {
$args = array('type' => $this->type) + $this->args;
$this->entity = entity_create('node', $args);
}
function fetchData() {
$request = drupal_http_request($this->url);
if ($request->code == 200) {
$this->html = $request->data;
} else {
throw new Exception('Failure on fetch:' . $this->url . '. http code:' . $request->code);
return FALSE;
}
}
public function set($property, $value, $type = NULL) {
$wrapper = entity_metadata_wrapper('node', $this->entity);
$wrapper->{$property}->set($value);
$wrapper->save();
}
function __destruct() {
//$this->html->clear();
$this->html = NULL;
$this->entity = NULL;
}
}
相关推荐
HttpClient库使得开发者能够轻松地实现网络数据的抓取和交换,这对于进行Web服务交互、网页爬虫或者任何需要从互联网获取数据的应用来说都非常有用。 ### GET请求 GET请求是最常见的HTTP方法,用于从服务器上获取...
Spring Boot 整合爬虫框架WebMagic并存储数据到数据库是一项常见的数据抓取与处理任务。WebMagic是一个轻量级的Java爬虫框架,而Spring Boot则是流行的微服务开发框架,两者结合能方便地构建高效稳定的爬虫服务。...
在这个案例中,`httpclient`和`htmlparser`的结合使得我们可以高效地抓取和解析网页内容。需要注意的是,在实际爬虫项目中,还需要考虑异常处理、请求速率控制、反爬策略等问题,以确保爬虫的稳定性和效率。此外,...
DIH是Solr的一个模块,它可以定期从外部数据源(如关系型数据库)中抓取数据并将其索引到Solr。这个过程通常分为四个主要步骤: Full Import、Delta Import、Commit 和 Optimize。 1. **Full Import**:这是第一次...
在Android开发中,有时我们需要从网络上获取网页的HTML源代码,以便进行数据抓取或者模拟用户交互。HttpClient是Java中一个常用的HTTP客户端库,它允许我们方便地发送HTTP请求并接收响应。在这个名为"使用HttpClient...
在压缩包中的"jsoup-1.8.1.jar"是Jsoup的库文件,可以直接导入到Java项目中使用。"使用说明-jar包.txt"可能包含了关于如何在项目中引入和使用这两个库的详细步骤。为了正确使用这些库,开发者需要了解Java的Maven或...
用户需要将这些数据导入到工具使用的数据库中,这通常通过SQL的`INSERT INTO`语句或使用数据库管理工具完成。 - **脚本生成**:为避免手动导入的繁琐,提供了一种通过脚本自动生成数据库内容的方式。这可能是一个...
本篇将深入探讨两种实现方式:通过HTTP客户端请求API接口获取XML数据以及利用HTMLUnit解析网页源码抓取天气信息。 首先,我们来看第一种方法,通过HTTP客户端请求中央气象台API接口获取XML数据。Java提供了多种HTTP...
通过上述步骤,可以完成对网页数据的抓取和解析工作。需要注意的是,爬虫编写过程中要遵循目标网站的robots.txt协议,尊重网站的爬取规则和频次,以免造成对网站的负担或引发法律问题。此外,获取到的数据通常需要...
综合以上信息,UC万能小偷V1.7【紧急修复版】很可能是一个基于.NET Core构建的Web应用程序,利用ASP.NET Core MVC框架和HTML Agility Pack来抓取和处理网页数据。同时,它还利用了依赖注入和缓存机制来优化性能,并...
3. **数据抓取与上传**:无论是下载文件还是上传数据,HTTPComponents Client都能提供稳定且高效的解决方案。 三、压缩包内容详解 "httpcomponents-client-4.2.5-bin"压缩包内包含了以下关键组件: - `lib`目录:...
CSV和TSV处理则可能使用了如CsvHelper这样的轻量级库,方便快速地导入导出数据。 2. 数据库操作: 数据库操作是系统存储和检索数据的核心部分。资料中提到支持MySQL、Access、SQL Server等,这意味着源码可能包含...
6. Office操作:通过Microsoft.Office.Interop库,C#可以与Excel、Word等Office应用程序进行交互,实现自动化办公任务,如数据导入导出、文档生成等。 7. IO操作:除了文件操作,C#的System.IO还包含了...
此外,HttpClient类提供了HTTP请求和响应的功能,方便进行Web API调用和网页数据抓取。 六、其他高级主题 C#还包括委托与事件、匿名方法、Lambda表达式、LINQ(Language Integrated Query)等高级特性。委托和事件...
HttpClient 4.2版本是这个库的一个重要迭代,提供了许多增强的功能...其在企业级应用、Web服务调用、数据抓取等场景中都有广泛的应用。了解和熟练掌握HttpClient 4.2的使用,对于提升Java应用的网络通信能力至关重要。
HttpClient 的灵活性和强大功能使其成为 Java 开发者处理 HTTP 任务的首选工具,无论是简单的网页抓取还是复杂的 Web 服务交互,HttpClient 都能提供稳定和高效的解决方案。随着 HTTP 协议的发展,HttpClient 也在...
5. **Office集成**:通过Microsoft.Office.Interop命名空间,如Excel、Word,可以与Office应用程序进行交互,实现数据导入导出或自动化办公任务。 6. **IO操作**:除了基本的文件操作,BufferedStream、FileStream...
- **外连接抓取**:设置是否启用外连接抓取,以及如何配置相关属性。 - **二进制流**:处理二进制数据流,如图片或文件,以及最佳实践。 - **二级缓存与查询缓存**:配置和使用 Hibernate 的二级缓存和查询缓存,以...
- **外连接抓取**:控制是否使用外连接抓取机制提高查询性能。 - **二进制流处理**:配置如何处理 BLOB 类型的数据。 - **自定义缓存提供者**:支持第三方缓存实现。 - **事务策略配置**:定义事务管理策略。 - **...
- **1.1.7 加载并存储对象**:演示如何使用 Hibernate API 来加载数据库中的数据到 Java 对象,并将 Java 对象持久化到数据库。 ##### 1.2 第二部分 — 关联映射 此章节深入探讨了 Hibernate 中对象之间的关联映射...