抓取动态网页(前几天非常的好(网络爬虫基本原理二)(组图))
优采云 发布时间: 2021-11-24 07:08抓取动态网页(前几天非常的好(网络爬虫基本原理二)(组图))
前几天做数据库实验的时候,总是手动添加少量的固定数据到数据库中,所以想知道如何将大量的动态数据导入到数据库中?我在互联网上了解了网络爬虫。它可以帮助我们完成这项工作。关于网络爬虫的原理和基础知识有很多相关的介绍。好(网络爬虫的基本原理一、网络爬虫的基本原理二)。
本篇博客以博客园首页的新闻版块为例。本示例使用MVC直观、简单的将采集接收到的数据显示在页面上。(其实有很多小网站就是利用爬虫技术在网上抓取自己需要的信息,然后做相应的应用)。另外,在实际的爬取过程中可以使用多线程爬取来加速采集。
我们先来看看博客园的首页,做相关分析:
采集后的结果:
爬取的原理:先获取对应url页面的html内容,然后找出你要爬取的目标数据的html结构,看看这个结构有没有一定的规则,然后用正则的规则匹配这个规则,匹配到了以后就可以采集出来了。我们可以先查看页面的源码,我们可以找到新闻版块的规则:位于id="post_list"的那个
之间
这样,我们就可以得到相应的正则表达式。
”
\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*
\\s*.*)\"\\s*target=\"_blank\">(?.*).*\\s*
\\s*(?.*)\\s*
”
原理很简单。下面我将给出源码:创建一个空的MVC项目,在Controller文件下添加一个控制器HomeController,并为该控制器添加一个视图Index。
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)
{
<a href=span style="color: rgba(128, 0, 0, 1)""/spanspan style="color: rgba(128, 0, 0, 1)"@b/spanspan style="color: rgba(128, 0, 0, 1)""/span>@HttpUtility.HtmlDecode(b)</a>@*使转义符正常输出*@
}
else if(count==1)
{
@HttpUtility.HtmlDecode(b)
}
else
{
@HttpUtility.HtmlDecode(b)
}
}
}
此时在博客中可以运行一个完整的MVC项目,但是我只有采集一个页面,我们也可以采集下博客园首页的分页部分(即pager_buttom)
,然后添加实现分页的方法,这里就不贴代码了,自己试试吧。但是,如果要将信息导入到数据库中,则需要创建相应的表,然后根据表中的属性从html 采集 中提取所需的相应信息。另外,不要添加采集每个新闻对应的页面的源代码都存储在数据库中,每个新闻对应的链接都应该存储在数据库中。原因是下载大量新闻页面需要很多时间,采集的效率,以及在数据库中存储大量新闻页面文件会占用大量内存,影响性能的数据库。
我也是菜鸟,刚学,还请大家批评指正。谢谢。不要笑。. .
太轻松的日子不一定能给人幸福,很容易毁掉一个人的理想,败坏一个人的灵魂
发布于 @ 2016-04-27 17:16 无声追求者阅读(1549)评论(3)编辑