`

抓取网页数据导入到entity

 
阅读更多
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 get、post 请求,抓取网络数据,jar包以及源码

    HttpClient库使得开发者能够轻松地实现网络数据的抓取和交换,这对于进行Web服务交互、网页爬虫或者任何需要从互联网获取数据的应用来说都非常有用。 ### GET请求 GET请求是最常见的HTTP方法,用于从服务器上获取...

    spring boot 整合爬虫框架webmagic,并将数据存储到数据库

    Spring Boot 整合爬虫框架WebMagic并存储数据到数据库是一项常见的数据抓取与处理任务。WebMagic是一个轻量级的Java爬虫框架,而Spring Boot则是流行的微服务开发框架,两者结合能方便地构建高效稳定的爬虫服务。...

    爬数据案例 httpclient htmlparser

    在这个案例中,`httpclient`和`htmlparser`的结合使得我们可以高效地抓取和解析网页内容。需要注意的是,在实际爬虫项目中,还需要考虑异常处理、请求速率控制、反爬策略等问题,以确保爬虫的稳定性和效率。此外,...

    solr连接数据库配置

    DIH是Solr的一个模块,它可以定期从外部数据源(如关系型数据库)中抓取数据并将其索引到Solr。这个过程通常分为四个主要步骤: Full Import、Delta Import、Commit 和 Optimize。 1. **Full Import**:这是第一次...

    使用HttpClient获取网页html源代码.zip

    在Android开发中,有时我们需要从网络上获取网页的HTML源代码,以便进行数据抓取或者模拟用户交互。HttpClient是Java中一个常用的HTTP客户端库,它允许我们方便地发送HTTP请求并接收响应。在这个名为"使用HttpClient...

    HttpClient和jsoup架包

    在压缩包中的"jsoup-1.8.1.jar"是Jsoup的库文件,可以直接导入到Java项目中使用。"使用说明-jar包.txt"可能包含了关于如何在项目中引入和使用这两个库的详细步骤。为了正确使用这些库,开发者需要了解Java的Maven或...

    C#做的刷网工具代码及其数据库和脚本语言

    用户需要将这些数据导入到工具使用的数据库中,这通常通过SQL的`INSERT INTO`语句或使用数据库管理工具完成。 - **脚本生成**:为避免手动导入的繁琐,提供了一种通过脚本自动生成数据库内容的方式。这可能是一个...

    java获取天气预报

    本篇将深入探讨两种实现方式:通过HTTP客户端请求API接口获取XML数据以及利用HTMLUnit解析网页源码抓取天气信息。 首先,我们来看第一种方法,通过HTTP客户端请求中央气象台API接口获取XML数据。Java提供了多种HTTP...

    java通过Jsoup爬取网页过程详解

    通过上述步骤,可以完成对网页数据的抓取和解析工作。需要注意的是,爬虫编写过程中要遵循目标网站的robots.txt协议,尊重网站的爬取规则和频次,以免造成对网站的负担或引发法律问题。此外,获取到的数据通常需要...

    UC万能小偷V1.7【紧急修复版】

    综合以上信息,UC万能小偷V1.7【紧急修复版】很可能是一个基于.NET Core构建的Web应用程序,利用ASP.NET Core MVC框架和HTML Agility Pack来抓取和处理网页数据。同时,它还利用了依赖注入和缓存机制来优化性能,并...

    httpcomponents-client-4.2.5-bin

    3. **数据抓取与上传**:无论是下载文件还是上传数据,HTTPComponents Client都能提供稳定且高效的解决方案。 三、压缩包内容详解 "httpcomponents-client-4.2.5-bin"压缩包内包含了以下关键组件: - `lib`目录:...

    常用功能类库源码

    CSV和TSV处理则可能使用了如CsvHelper这样的轻量级库,方便快速地导入导出数据。 2. 数据库操作: 数据库操作是系统存储和检索数据的核心部分。资料中提到支持MySQL、Access、SQL Server等,这意味着源码可能包含...

    C#最常用的100多个类库集合分享

    6. Office操作:通过Microsoft.Office.Interop库,C#可以与Excel、Word等Office应用程序进行交互,实现自动化办公任务,如数据导入导出、文档生成等。 7. IO操作:除了文件操作,C#的System.IO还包含了...

    Visual C#.NET 应用编程150例

    此外,HttpClient类提供了HTTP请求和响应的功能,方便进行Web API调用和网页数据抓取。 六、其他高级主题 C#还包括委托与事件、匿名方法、Lambda表达式、LINQ(Language Integrated Query)等高级特性。委托和事件...

    HttpClient4.2

    HttpClient 4.2版本是这个库的一个重要迭代,提供了许多增强的功能...其在企业级应用、Web服务调用、数据抓取等场景中都有广泛的应用。了解和熟练掌握HttpClient 4.2的使用,对于提升Java应用的网络通信能力至关重要。

    华三交换机mib库(标准和私有)

    配置华三交换机的MIB库到Zabbix中,可以通过以下步骤: - 在Zabbix服务器上导入华三的MIB文件。 - 配置Zabbix代理或主机的SNMP参数,指向华三交换机,并启用相应的MIB支持。 - 创建监控项,利用MIB中的OIDS...

    httpClient4.1入门教程.docx

    HttpClient 的灵活性和强大功能使其成为 Java 开发者处理 HTTP 任务的首选工具,无论是简单的网页抓取还是复杂的 Web 服务交互,HttpClient 都能提供稳定和高效的解决方案。随着 HTTP 协议的发展,HttpClient 也在...

    .Net和C#常用类库100多个

    5. **Office集成**:通过Microsoft.Office.Interop命名空间,如Excel、Word,可以与Office应用程序进行交互,实现数据导入导出或自动化办公任务。 6. **IO操作**:除了基本的文件操作,BufferedStream、FileStream...

    Hibernate Reference Documentation

    - **外连接抓取**:控制是否使用外连接抓取机制提高查询性能。 - **二进制流处理**:配置如何处理 BLOB 类型的数据。 - **自定义缓存提供者**:支持第三方缓存实现。 - **事务策略配置**:定义事务管理策略。 - **...

Global site tag (gtag.js) - Google Analytics