在线抓取网页(前几天非常的好(网络爬虫基本原理二)(组图))
优采云 发布时间: 2022-03-10 20:01在线抓取网页(前几天非常的好(网络爬虫基本原理二)(组图))
前几天做数据库实验的时候,总是手动往数据库中添加少量固定数据,所以想知道如何将大量动态数据导入数据库?我在网上了解了网络爬虫,它可以帮助我们完成这项工作。关于网络爬虫的原理和基础知识,网上有很多相关的介绍。不错(网络爬虫基本原理一、网络爬虫基本原理二)。
本博客以采集博客园首页的新闻栏目为例。本例中,为了直观简单,使用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 追求消音器阅读(158 5) 评论(3) 已编辑)