抓取网页新闻(前几天非常的好(网络爬虫基本原理二)(组图))

优采云 发布时间: 2021-09-11 00:13

  抓取网页新闻(前几天非常的好(网络爬虫基本原理二)(组图))

  前几天做数据库实验的时候,总是手动添加少量的固定数据到数据库中,所以想知道如何将大量的动态数据导入到数据库中?我在互联网上了解了网络爬虫。它可以帮助我们完成这项工作。关于网络爬虫的原理和基础知识有很多相关的介绍。 (网络爬虫基本原理一、网络爬虫基本原理二).

  本博客以采集博客园首页的新闻版块为例。本例使用MVC直观简单的将采集接收到的数据展示在页面上(其实有很多小网站是利用爬虫技术在网上抓取自己需要的信息,然后做相应的应用程序)。另外在实际爬取过程中可以使用多线程爬取来加速采集。

  先来看看博客园的首页,做相关分析:

  

  采集 后的结果:

  

  爬取的原理:先获取对应url页面的html内容,然后找出你要爬取的目标数据的html结构,看看这个结构有没有一定的规律,然后使用regular rules 来匹配这条规则,匹配到之后就可以采集出来了。我们可以先查看页面的源码,我们可以找到新闻版块的规则:位于id="post_list"

  的那个

  之间

  

  这样,我们就可以得到对应的正则表达式了。

  ”

  \\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*

  \\s*.*)\"\\s*target=\"_blank\">(?.*).*\\s*

  \\s*(?.*)\\s*

  ”

  原理很简单。下面我将给出源码:创建一个空的MVC项目,在Controller文件下添加一个控制器HomeController,并为控制器添加一个视图索引

  HomeController.cs 代码的一部分:

  

  using System;

using System.Collections.Generic;

using System.IO;

using System.Net;

using System.Text.RegularExpressions;

using System.Web.Mvc;

namespace WebApplication1.Controllers

{

public class HomeController : Controller

{

///

/// 通过Url地址获取具体网页内容 发起一个请求获得html内容

///

///

///

public static string SendUrl(string strUrl)

{

try

{

WebRequest webRequest = WebRequest.Create(strUrl);

WebResponse webResponse = webRequest.GetResponse();

StreamReader reader = new StreamReader(webResponse.GetResponseStream());

string result = reader.ReadToEnd();

return result;

}

catch (Exception ex)

{

throw ex;

}

}

public ActionResult Index()

{

string strPattern = "\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*\\s*(?.*)</a>.*\\s*\\s*(?.*)\\s*";

List list = new List();

Regex regex = new Regex(strPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant);

if (regex.IsMatch(SendUrl("http://www.cnblogs.com/")))

{

MatchCollection matchCollection = regex.Matches(SendUrl("http://www.cnblogs.com/"));

foreach (Match match in matchCollection)

{

List one_list = new List();

one_list.Add(match.Groups[2].Value);//获取到的是列表数据的标题

one_list.Add(match.Groups[3].Value);//获取到的是内容

one_list.Add(match.Groups[1].Value);//获取到的是链接到的地址

list.Add(one_list);

}

}

ViewBag.list = list;

return View();

}

}

}</p>

  部分索引视图代码:

  

  @{

Layout = null;

}

Index

#customers {

font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;

width: 100%;

border-collapse: collapse;

outline: #00ff00 dotted thick;

}

#customers td, #customers th {

font-size: 1em;

border: 1px solid #98bf21;

padding: 3px 7px 2px 7px;

}

#customers th {

font-size: 1.1em;

text-align: left;

padding-top: 5px;

padding-bottom: 4px;

background-color: #A7C942;

color: #ffffff;

}

标题

内容

链接

@foreach (var a in ViewBag.list)

{

int count = 0;

@foreach (string b in a)

{

if (++count == 3)

{

@HttpUtility.HtmlDecode(b)@*使转义符正常输出*@

}

else if(count==1)

{

@HttpUtility.HtmlDecode(b)

}

else

{

@HttpUtility.HtmlDecode(b)

}

}

}

  

  如博客所写,可以运行一个完整的MVC项目,但是我只采集一页,我们也可以在博客园首页采集下翻页部分(即pager_buttom)采集

  p>

  

  ,只需要添加实现分页的方法,这里就不贴代码了,自己试试吧。但是,如果要将信息导入到数据库中,则需要创建相应的表,然后根据表中的属性从html中一一采集提取所需的相应信息。另外,我们不应该将采集添加到每个新闻条目对应的页面的源代码中,而每个新闻条目对应的链接都应该存储在数据库中。原因是下载大量新闻页面需要花费大量时间。佩服采集的效率,在数据库中存放大量的新闻页面文件会占用大量内存,影响数据库性能。

  posted @ 2017-11-28 14:06 Pooh Bear 320 Reading (254)评论(0)Edit)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线