网站采集数据程序问题...!

wosizy 2010-06-01 11:02:18
因为以前没写过 采集数据的这类程序 所以没有啥很具体的思路 望大家提供些思路 或源码列子
现在我的思路是 首先要建一数据库 表 把需要采集的字段建好 采集数据后存入数据库
采集根据网址来采集 数据库也建一表 存储要采集的网站地址 (需要每天采集一次,也就是有个时间控制)
比如采集 招聘网站的 招聘职位 公司名称 招聘人数 发布日期 这几个字段都要存入数据库
还有个头疼的问题是 分页 招聘网站 都有分页。。。
望有做过这类程序的高手们 提供 思路 或 源码列子
...全文
160 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wosizy 2010-06-02
  • 打赏
  • 举报
回复
顶...
qiqishardgel 2010-06-02
  • 打赏
  • 举报
回复
帮顶!
stning 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wosizy 的回复:]
引用 11 楼 stning 的回复:

帮顶一个,主要是一些采集字段的过滤和替换,这些才麻烦。比如说时间字段,网站都有自己的格式,如果遇到采集的是外国的网站,那么时间格式又不一样了。还有来源。还有就是内容的替换。版权的识别。我之前做了一个。从采集,到导入,图片处理(缩略图,取出logo,打上自己的logo),还得生成静态页面。搞得头都大了。

谢谢你的回答 我这里好像不用存取图片的 因为……
[/Quote]大体上的思路,你可以下载一个万能采集器去看看。
wosizy 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 stning 的回复:]

帮顶一个,主要是一些采集字段的过滤和替换,这些才麻烦。比如说时间字段,网站都有自己的格式,如果遇到采集的是外国的网站,那么时间格式又不一样了。还有来源。还有就是内容的替换。版权的识别。我之前做了一个。从采集,到导入,图片处理(缩略图,取出logo,打上自己的logo),还得生成静态页面。搞得头都大了。
[/Quote]
谢谢你的回答 我这里好像不用存取图片的 因为不是采集人家网上的新闻,就是采取几个信息字段
如:公司名称,等等 一些字段..!
最好能有些思路提供... 谢谢
hxbr110 2010-06-02
  • 打赏
  • 举报
回复
路过。。。。。
sj6071 2010-06-02
  • 打赏
  • 举报
回复
sfdfds
stning 2010-06-02
  • 打赏
  • 举报
回复
帮顶一个,主要是一些采集字段的过滤和替换,这些才麻烦。比如说时间字段,网站都有自己的格式,如果遇到采集的是外国的网站,那么时间格式又不一样了。还有来源。还有就是内容的替换。版权的识别。我之前做了一个。从采集,到导入,图片处理(缩略图,取出logo,打上自己的logo),还得生成静态页面。搞得头都大了。
a82344626 2010-06-01
  • 打赏
  • 举报
回复
lester19872007 2010-06-01
  • 打赏
  • 举报
回复
楼主的想法是正确的,我给出的是通过网址抓取内容的代码,至于数据要要怎么创建就要根据你的需要来创建了!
lester19872007 2010-06-01
  • 打赏
  • 举报
回复
struct resinfo
{
/// <summary>
/// 完整的原始路径
/// </summary>
public string orgurl;
/// <summary>
/// 原始文件名
/// </summary>
public string orgname;
/// <summary>
/// 原始的扩展文件名
/// </summary>
public string extname;
/// <summary>
/// 新文件名
/// </summary>
public string newname;
}
/// <summary>
/// 获取(网页)内容中的远程资源
/// </summary>
public class RemoteResource
{
private int SeriesNum;
private string FileNum;
private string restype = ".gif|.jpg|.bmp|.png|.jpeg";
private string _remoteurl;
private string _localurl;
private string _localpath;
private string _content = "";
private bool _rename;
private bool bcomp = false;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="Content">包含要获取远程资源的内容</param>
/// <param name="LocalURLDirectory">要将文件保存到本地服务器的虚拟目录,用于替换原来的远程链接地址,如:http://www.Com2000888.com/remoteres,可以为空,也可以为../一个或多个。</param>
/// <param name="LocalPhysicalDirectory">要将文件保存到本地服务器的磁盘路径,如:C:\Inetpub\wwwroot\remoteres,如果不存在可以创建</param>
/// <param name="RemoteUrl">用于处理相对路径(如src="../images/Com2000888.gif")的资源,如果为空,则只取完整路径的资源,以http(或https,ftp,rtsp,mms)://开头</param>
/// <param name="RenameFile">是否要重命名资源文件,如为false则自动覆盖重名文件</param>
public RemoteResource(string Content,string LocalURLDirectory,string LocalPhysicalDirectory,string RemoteUrl,bool RenameFile)
{
_content = Content;
_localurl= LocalURLDirectory.Trim();
_localpath = LocalPhysicalDirectory.Trim();
if (RemoteUrl == null)
_remoteurl = "";
else
_remoteurl = RemoteUrl.Trim();
if (_remoteurl.Equals(""))
bcomp = true;
if (_localpath.Equals(""))
throw new NullReferenceException ("本地的物理路径不能为空!");
_rename = RenameFile;
SeriesNum = 1;
// FileNum = Com2000888.Common.Rand.Number(6);
_localpath = _localpath.Replace("/", "\\");
_localurl = _localurl.Replace("\\", "/");
_remoteurl = _remoteurl.Replace("\\", "/");
_localpath = _localpath.TrimEnd('\\');
_localurl = _localurl.TrimEnd('/');
if (!Directory.Exists(_localpath))
Directory.CreateDirectory(_localpath);
}
/// <summary>
/// 要获取的资源文件扩展名,扩展名不要加点(.),如{"gif","jpg","png"},默认的下载文件有gif,jpg,bmp,png
/// </summary>
public string[] FileExtends
{
set
{
restype = "";
string[] flexs = value;
for(int i=0;i<flexs.Length;i++)
{
if (i > 0)
restype += "|";
restype += "." + flexs[i].TrimStart('.');
}
}
}
/// <summary>
/// 获取远程资源的路径
/// </summary>
private IList<resinfo> ObtainResURL()
{
IList<resinfo> list = new List<resinfo>();
string pattern = "src\\s?=\\s?['\"]?(?<resurl>.+?(" + restype.Replace(".", "\\.") + "))";
//string pattern = "[=\\(]['\"\\ ]??(?<resurl>[^<>\"]+?(" + restype.Replace(".","\\.") + "))";
if (bcomp)
pattern = @"(http|https|ftp|rtsp|mms)://\S+(" + restype.Replace(".", "\\.") + ")";
Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
Match m = reg.Match(_content);
while (m.Success)
{
string url = "";
if (bcomp)
{
url = m.Value;
}
else
{
url = m.Groups["resurl"].Value;
}
bool bsame = false;
foreach (resinfo res in list)
{
if (res.orgurl.Equals(url))
{
bsame = true;
break;
}
}
if (!bsame)
{
#region 加入资源列表
string name = "";
string curl = url.Replace("\\", "/").Trim();
if (curl.IndexOf("/") >= 0)
{
name = curl.Substring(curl.LastIndexOf("/") + 1);
}
else
{
name = url;
}
int pos = name.LastIndexOf(".");
resinfo r;
r.orgurl = url;
r.orgname = name.Substring(0, pos);
r.extname = name.Substring(pos + 1);
r.newname = "";
list.Add(r);
#endregion 加入资源列表
}
m = m.NextMatch();
}
return list;
}
/// <summary>
/// 保存远程图片并替换原文内容
/// </summary>
public void FetchResource()
{
WebClient wb = new WebClient();
IList<resinfo> list = ObtainResURL();
if(!_localurl.Equals(""))
_localurl += "/";
foreach (resinfo r in list)
{
try
{
string url = UtilityPage.StickUrl(_remoteurl, r.orgurl);
string newurl = "",newpath="";
if (_rename)
{
#region 生成新文件名
string newname = FileNum + SeriesNum.ToString().PadLeft(3, '0') + "." + r.extname;

while (File.Exists(_localpath +"\\"+ newname))
{
SeriesNum++;
newname = FileNum + SeriesNum.ToString().PadLeft(3, '0') + "." + r.extname;
}
newpath = _localpath + "\\" + newname;
newurl = _localurl + newname;
wb.DownloadFile(url,newpath);
#endregion
}
else
{
newurl = _localurl + r.orgname + "." + r.extname;
wb.DownloadFile(url, _localpath + "\\" + r.orgname + "." + r.extname);
}
#region 替换文件名
_content = _content.Replace(r.orgurl,newurl);
#endregion 替换文件名
SeriesNum++;
}
catch
{ }
}
if (wb != null)
wb.Dispose();
}
/// <summary>
/// 获取内容
/// </summary>
public string Content
{
get { return _content; }
}
}
lester19872007 2010-06-01
  • 打赏
  • 举报
回复
[costruct resinfo
{
/// <summary>
/// 完整的原始路径
/// </summary>
public string orgurl;
/// <summary>
/// 原始文件名
/// </summary>
public string orgname;
/// <summary>
/// 原始的扩展文件名
/// </summary>
public string extname;
/// <summary>
/// 新文件名
/// </summary>
public string newname;
}
/// <summary>
/// 获取(网页)内容中的远程资源
/// </summary>
public class RemoteResource
{
private int SeriesNum;
private string FileNum;
private string restype = ".gif|.jpg|.bmp|.png|.jpeg";
private string _remoteurl;
private string _localurl;
private string _localpath;
private string _content = "";
private bool _rename;
private bool bcomp = false;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="Content">包含要获取远程资源的内容</param>
/// <param name="LocalURLDirectory">要将文件保存到本地服务器的虚拟目录,用于替换原来的远程链接地址,如:http://www.Com2000888.com/remoteres,可以为空,也可以为../一个或多个。</param>
/// <param name="LocalPhysicalDirectory">要将文件保存到本地服务器的磁盘路径,如:C:\Inetpub\wwwroot\remoteres,如果不存在可以创建</param>
/// <param name="RemoteUrl">用于处理相对路径(如src="../images/Com2000888.gif")的资源,如果为空,则只取完整路径的资源,以http(或https,ftp,rtsp,mms)://开头</param>
/// <param name="RenameFile">是否要重命名资源文件,如为false则自动覆盖重名文件</param>
public RemoteResource(string Content,string LocalURLDirectory,string LocalPhysicalDirectory,string RemoteUrl,bool RenameFile)
{
_content = Content;
_localurl= LocalURLDirectory.Trim();
_localpath = LocalPhysicalDirectory.Trim();
if (RemoteUrl == null)
_remoteurl = "";
else
_remoteurl = RemoteUrl.Trim();
if (_remoteurl.Equals(""))
bcomp = true;
if (_localpath.Equals(""))
throw new NullReferenceException ("本地的物理路径不能为空!");
_rename = RenameFile;
SeriesNum = 1;
// FileNum = Com2000888.Common.Rand.Number(6);
_localpath = _localpath.Replace("/", "\\");
_localurl = _localurl.Replace("\\", "/");
_remoteurl = _remoteurl.Replace("\\", "/");
_localpath = _localpath.TrimEnd('\\');
_localurl = _localurl.TrimEnd('/');
if (!Directory.Exists(_localpath))
Directory.CreateDirectory(_localpath);
}
/// <summary>
/// 要获取的资源文件扩展名,扩展名不要加点(.),如{"gif","jpg","png"},默认的下载文件有gif,jpg,bmp,png
/// </summary>
public string[] FileExtends
{
set
{
restype = "";
string[] flexs = value;
for(int i=0;i<flexs.Length;i++)
{
if (i > 0)
restype += "|";
restype += "." + flexs[i].TrimStart('.');
}
}
}
/// <summary>
/// 获取远程资源的路径
/// </summary>
private IList<resinfo> ObtainResURL()
{
IList<resinfo> list = new List<resinfo>();
string pattern = "src\\s?=\\s?['\"]?(?<resurl>.+?(" + restype.Replace(".", "\\.") + "))";
//string pattern = "[=\\(]['\"\\ ]??(?<resurl>[^<>\"]+?(" + restype.Replace(".","\\.") + "))";
if (bcomp)
pattern = @"(http|https|ftp|rtsp|mms)://\S+(" + restype.Replace(".", "\\.") + ")";
Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
Match m = reg.Match(_content);
while (m.Success)
{
string url = "";
if (bcomp)
{
url = m.Value;
}
else
{
url = m.Groups["resurl"].Value;
}
bool bsame = false;
foreach (resinfo res in list)
{
if (res.orgurl.Equals(url))
{
bsame = true;
break;
}
}
if (!bsame)
{
#region 加入资源列表
string name = "";
string curl = url.Replace("\\", "/").Trim();
if (curl.IndexOf("/") >= 0)
{
name = curl.Substring(curl.LastIndexOf("/") + 1);
}
else
{
name = url;
}
int pos = name.LastIndexOf(".");
resinfo r;
r.orgurl = url;
r.orgname = name.Substring(0, pos);
r.extname = name.Substring(pos + 1);
r.newname = "";
list.Add(r);
#endregion 加入资源列表
}
m = m.NextMatch();
}
return list;
}
/// <summary>
/// 保存远程图片并替换原文内容
/// </summary>
public void FetchResource()
{
WebClient wb = new WebClient();
IList<resinfo> list = ObtainResURL();
if(!_localurl.Equals(""))
_localurl += "/";
foreach (resinfo r in list)
{
try
{
string url = UtilityPage.StickUrl(_remoteurl, r.orgurl);
string newurl = "",newpath="";
if (_rename)
{
#region 生成新文件名
string newname = FileNum + SeriesNum.ToString().PadLeft(3, '0') + "." + r.extname;

while (File.Exists(_localpath +"\\"+ newname))
{
SeriesNum++;
newname = FileNum + SeriesNum.ToString().PadLeft(3, '0') + "." + r.extname;
}
newpath = _localpath + "\\" + newname;
newurl = _localurl + newname;
wb.DownloadFile(url,newpath);
#endregion
}
else
{
newurl = _localurl + r.orgname + "." + r.extname;
wb.DownloadFile(url, _localpath + "\\" + r.orgname + "." + r.extname);
}
#region 替换文件名
_content = _content.Replace(r.orgurl,newurl);
#endregion 替换文件名
SeriesNum++;
}
catch
{ }
}
if (wb != null)
wb.Dispose();
}
/// <summary>
/// 获取内容
/// </summary>
public string Content
{
get { return _content; }
}
}de=C#]

[/code]
harderLi 2010-06-01
  • 打赏
  • 举报
回复
很简单的 HttpWebRequest
要么搜索关键字 采集 抓取
winner2050 2010-06-01
  • 打赏
  • 举报
回复
在下载栏目那里搜索我的资源。

有源码呢。
zhxingway 2010-06-01
  • 打赏
  • 举报
回复

沙发啊,终于做到沙发了.
zhxingway 2010-06-01
  • 打赏
  • 举报
回复
帮顶了,路过
wosizy 2010-06-01
  • 打赏
  • 举报
回复
顶 今晚回来 把数据库设计好..明天开始写程序..!
课程简介:  本项目课程是一门极具综合性和完整性的大型项目课程;课程项目的业务背景源自各类互联网公司对海量用户浏览行为数据和业务数据分析的需求及企业数据管理、数据运营需求。 本课程项目涵盖数据采集与预处理、数据仓库体系建设、用户画像系统建设、数据治理(元数据管理、数据质量管理)、任务调度系统、数据服务层建设、OLAP即席分析系统建设等大量模块,力求原汁原味重现一个完备的企业级大型数据运营系统。  拒绝demo,拒绝宏观抽象,拒绝只讲不练,本课程高度揉和理论与实战,并兼顾各层次的学员,真正从0开始,循序渐进,每一个步骤每一个环节,都会带领学员从需求分析开始,到逻辑设计,最后落实到每一行代码,所有流程都采用企业级解决方案,并手把手带领学员一一实现,拒绝复制粘贴,拒绝demo化的实现。并且会穿插大量的原创图解,来帮助学员理解复杂逻辑,掌握关键流程,熟悉核心架构。   跟随项目课程,历经接近100+小时的时间,从需求分析开始,到数据埋点采集,到预处理程序代码编写,到数仓体系搭建......逐渐展开整个项目的宏大视图,构建起整个项目的摩天大厦。  由于本课程不光讲解项目的实现,还会在实现过程中反复揉和各种技术细节,各种设计思想,各种最佳实践思维,学完本项目并勤于实践的话,学员的收获将远远超越一个项目的具体实现,更能对大型数据系统开发产生深刻体悟,对很多技术的应用将感觉豁然开朗,并带来融会贯通能力的巨大飞跃。当然,最直接的收获是,学完本课程,你将很容易就拿到大数据数仓建设或用户画像建设等岗位的OFFER课程模块: 1. 数据采集:涉及到埋点日志flume采集系统,sqoop业务数据抽取系统等; 2. 数据预处理:涉及到各类字典数据构建,复杂结构数据清洗解析,数据集成,数据修正,以及多渠道数据的用户身份标识打通:ID-MAPPING等;3. 数据仓库:涉及到hive数仓基础设施搭建,数仓分层体系设计,数仓分析主题设计,多维分析实现,ETL任务脚本开发,ETL任务调度,数据生命周期管理等;4. 数据治理:涉及数据资产查询管理,数据质量监控管理,atlas元数据管理系统,atlas数据血缘管理等;5. 用户画像系统:涉及画像标签体系设计,标签体系层级关系设计,各类标签计算实现,兴趣类标签的衰减合并,模型标签的机器学习算法应用及特征提取、模型训练等;6. OLAP即席分析平台:涉及OLAP平台的整体架构设计,技术选型,底层存储实现,Presto查询引擎搭建,数据服务接口开发等;7. 数据服务:涉及数据服务的整体设计理念,架构搭建,各类数据访问需求的restapi开发等;课程所涉及的技术: 整个项目课程中,将涉及到一个大型数据系统中所用到的几乎所有主要技术,具体来说,包含但不限于如下技术组件:l Hadoopl Hivel HBasel SparkCore /SparkSQL/ Spark GRAPHX / Spark Mllibl Sqoopl Azkabanl Flumel lasal Kafkal Zookeeperl Solrl Prestop

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧