c#抓取网页数据

c#抓取网页数据

c#抓取网页数据( 常见的提高抓取效率的策略有:抓取最多的网页)

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2021-12-22 02:24 • 来自相关话题

  c#抓取网页数据(
常见的提高抓取效率的策略有:抓取最多的网页)
  
  Spider是整个搜索引擎系统中非常重要的一部分,可以说是搜索引擎的基础。它不仅为搜索引擎提供了海量数据的搜索对象,更重要的是,它使搜索引擎从一个检索工具上升为一个信息集成平台。
  爬行效率
  爬行的效率与计算机硬件的性能、硬件的数量、网络的带宽有关。但是,为了提高爬取效率,不能一味地增加硬件,而是利用有限的硬件资源,在一定时间内抓取最多。网页。
  提高爬取效率的常用策略有:
  (1) 多线程并发爬取
  (2) 单线程、非阻塞 i/o 获取
  (3)分布式爬取,爬取工作分布到多台服务器来完成。对于google等搜索引擎,还包括地域分布,将爬取服务器集群分布到全球各个国家的骨干网。挑选。
  爬行质量
  蜘蛛设计的目标不是捕获互联网上的所有网页,而是捕获最重要和最新的网页。
  如何抓取高质量的网页?哪些网页质量更高?这里要求设计师对互联网和用户的使用习惯和常识有一定的了解。
  从整个互联网的角度来看,网站中各个网页之间的链接关系是一个非常重要的资源。因此,在抓取网页时应记录网页之间的链接关系进行链接分析,从而通过链接关系来评价网页的质量。
  爬行的礼貌问题
  礼貌爬取具体表现在:网站不爬取未爬取的网页,控制访问网站的频率。蜘蛛的爬行行为不应影响正常用户的访问。因此,蜘蛛必须:
  (1)限制单位时间内爬取的网页数量为一个网站。
  (2)限制可以同时爬取到同一个网站的线程/进程数。
  (3)控制捕获相同网站的时间间隔。
  (4)遵循robots、meta tag、sitemap.htm协议,不允许的目录不要访问。
  (5)在抓取网页时发送的请求中,user-agent和form字段用于识别蜘蛛的身份,联系邮箱,以及spdier防范页面的url。
  避免重复爬行
  重复爬取的原因是:
  (1)网上有很多网络
  该页面被其他网页引用,使得同一个网页的URL出现在多个不同的网页中,这就需要蜘蛛具备URL去重功能。
  (2)网页被其他网页转载,导致同一篇文章文章出现在不同url的页面中,这就需要蜘蛛具备内容去重功能,目前实现难度较大,目前有很多搜索引擎公司并没有很好地解决这个问题。
  (3)网页的URL有多种表示,是dns和ip的对应关系造成的。
  爬取数据的更新
  更新爬取数据的问题是一个非常重要的问题。它决定了用户是否可以立即搜索到最新的新闻和最新的内容。但是由于互联网上的网页数量众多,一次爬取的周期很长。每次都重新爬一次更新,更新周期势必很长。
  蜘蛛抓取的网页可能会被修改或删除。Spider会定期检查这些网页的更新状态,同时更新原创网页数据库、提取数据库和索引数据库。
  6.内容提取
  蜘蛛需要抓取的文件有很多种,比如html、xml网页、doc、ppt、xls、pdf等格式文档,以及图片、音频、视频等多媒体数据。对于这些不同类型的文件,蜘蛛必须提取文件中的纯文本内容。
  对于doc、pdf等文件,专业厂商提供的软件生成的此类文件,厂商会提供相应的文本提取接口。
  对于html和xml页面,除了title和body之外,还会有很多版权信息、广告链接、公众频道链接。这些链接与正文无关。在提取页面内容时,还需要过滤掉这些无用的链接。
  以上就是代理IP服务器如何提高c#爬虫爬虫效率的相关介绍。Sun HTTP代理是专业的企业级优质代理IP供应平台,为大数据提供优质HTTP代理IP和Socks5代理IP采集提供服务。也可以联系客服免费试用! 查看全部

  c#抓取网页数据(
常见的提高抓取效率的策略有:抓取最多的网页)
  
  Spider是整个搜索引擎系统中非常重要的一部分,可以说是搜索引擎的基础。它不仅为搜索引擎提供了海量数据的搜索对象,更重要的是,它使搜索引擎从一个检索工具上升为一个信息集成平台。
  爬行效率
  爬行的效率与计算机硬件的性能、硬件的数量、网络的带宽有关。但是,为了提高爬取效率,不能一味地增加硬件,而是利用有限的硬件资源,在一定时间内抓取最多。网页。
  提高爬取效率的常用策略有:
  (1) 多线程并发爬取
  (2) 单线程、非阻塞 i/o 获取
  (3)分布式爬取,爬取工作分布到多台服务器来完成。对于google等搜索引擎,还包括地域分布,将爬取服务器集群分布到全球各个国家的骨干网。挑选。
  爬行质量
  蜘蛛设计的目标不是捕获互联网上的所有网页,而是捕获最重要和最新的网页。
  如何抓取高质量的网页?哪些网页质量更高?这里要求设计师对互联网和用户的使用习惯和常识有一定的了解。
  从整个互联网的角度来看,网站中各个网页之间的链接关系是一个非常重要的资源。因此,在抓取网页时应记录网页之间的链接关系进行链接分析,从而通过链接关系来评价网页的质量。
  爬行的礼貌问题
  礼貌爬取具体表现在:网站不爬取未爬取的网页,控制访问网站的频率。蜘蛛的爬行行为不应影响正常用户的访问。因此,蜘蛛必须:
  (1)限制单位时间内爬取的网页数量为一个网站。
  (2)限制可以同时爬取到同一个网站的线程/进程数。
  (3)控制捕获相同网站的时间间隔。
  (4)遵循robots、meta tag、sitemap.htm协议,不允许的目录不要访问。
  (5)在抓取网页时发送的请求中,user-agent和form字段用于识别蜘蛛的身份,联系邮箱,以及spdier防范页面的url。
  避免重复爬行
  重复爬取的原因是:
  (1)网上有很多网络
  该页面被其他网页引用,使得同一个网页的URL出现在多个不同的网页中,这就需要蜘蛛具备URL去重功能。
  (2)网页被其他网页转载,导致同一篇文章文章出现在不同url的页面中,这就需要蜘蛛具备内容去重功能,目前实现难度较大,目前有很多搜索引擎公司并没有很好地解决这个问题。
  (3)网页的URL有多种表示,是dns和ip的对应关系造成的。
  爬取数据的更新
  更新爬取数据的问题是一个非常重要的问题。它决定了用户是否可以立即搜索到最新的新闻和最新的内容。但是由于互联网上的网页数量众多,一次爬取的周期很长。每次都重新爬一次更新,更新周期势必很长。
  蜘蛛抓取的网页可能会被修改或删除。Spider会定期检查这些网页的更新状态,同时更新原创网页数据库、提取数据库和索引数据库。
  6.内容提取
  蜘蛛需要抓取的文件有很多种,比如html、xml网页、doc、ppt、xls、pdf等格式文档,以及图片、音频、视频等多媒体数据。对于这些不同类型的文件,蜘蛛必须提取文件中的纯文本内容。
  对于doc、pdf等文件,专业厂商提供的软件生成的此类文件,厂商会提供相应的文本提取接口。
  对于html和xml页面,除了title和body之外,还会有很多版权信息、广告链接、公众频道链接。这些链接与正文无关。在提取页面内容时,还需要过滤掉这些无用的链接。
  以上就是代理IP服务器如何提高c#爬虫爬虫效率的相关介绍。Sun HTTP代理是专业的企业级优质代理IP供应平台,为大数据提供优质HTTP代理IP和Socks5代理IP采集提供服务。也可以联系客服免费试用!

c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-21 14:04 • 来自相关话题

  c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))
  当前网页中有相当一部分使用了 AJAX 技术。无论是WebClient还是C#中的HttpRequest,都无法得到正确的结果,因为这些脚本都是在服务端发送后执行的!
  但是我们用IE浏览页面是正常的,所以只有一种解决方法就是使用WebBrowser控件
  但是使用Webbrowser,你会发现在DownloadComplete事件中,你无法知道页面什么时候真正加载了!
  当然,个别带有 Frame 的网页可能会多次触发 Complete。即使你使用counter的方法,也就是在Navigated event++中,在DownloadComplete中进行,JS执行完成后依然无法得到结果。一开始也觉得很奇怪,直到后来GG相关AJAX文章才明白了原委。
  最终的解决方案是使用WebBrowser+Timer解决页面爬行问题
  关键还是页面状态,我们可以使用webBrowser1.StatusText,如果返回“Done”,则表示页面已加载!
  示例代码如下:
  private void timer1_Tick(object sender, EventArgs e)
{

textBox1.Text += webBrowser1.StatusText;
if (webBrowser1.StatusText == "完成")
{

timer1.Enabled = false;
//页面加载完成,做一些其它的事
textBox1.Text += webBrowser1.Document.Body.OuterHtml;
//webBrowser1.DocumentText 注意不要用这个,这个和查看源文件一样的
}
}
private void Form1_Load(object sender, EventArgs e)
{
string Url = "http://cd.mei8.cn/face/work/wi ... 3B%3B
webBrowser1.Navigate(Url);
}
  放置三个控件,webBrowser、timer、textBox定时器设置为可用 查看全部

  c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))
  当前网页中有相当一部分使用了 AJAX 技术。无论是WebClient还是C#中的HttpRequest,都无法得到正确的结果,因为这些脚本都是在服务端发送后执行的!
  但是我们用IE浏览页面是正常的,所以只有一种解决方法就是使用WebBrowser控件
  但是使用Webbrowser,你会发现在DownloadComplete事件中,你无法知道页面什么时候真正加载了!
  当然,个别带有 Frame 的网页可能会多次触发 Complete。即使你使用counter的方法,也就是在Navigated event++中,在DownloadComplete中进行,JS执行完成后依然无法得到结果。一开始也觉得很奇怪,直到后来GG相关AJAX文章才明白了原委。
  最终的解决方案是使用WebBrowser+Timer解决页面爬行问题
  关键还是页面状态,我们可以使用webBrowser1.StatusText,如果返回“Done”,则表示页面已加载!
  示例代码如下:
  private void timer1_Tick(object sender, EventArgs e)
{

textBox1.Text += webBrowser1.StatusText;
if (webBrowser1.StatusText == "完成")
{

timer1.Enabled = false;
//页面加载完成,做一些其它的事
textBox1.Text += webBrowser1.Document.Body.OuterHtml;
//webBrowser1.DocumentText 注意不要用这个,这个和查看源文件一样的
}
}
private void Form1_Load(object sender, EventArgs e)
{
string Url = "http://cd.mei8.cn/face/work/wi ... 3B%3B
webBrowser1.Navigate(Url);
}
  放置三个控件,webBrowser、timer、textBox定时器设置为可用

c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析 )

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-20 16:03 • 来自相关话题

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天学习了爬虫的基础知识,这里简单总结一下。
  获取的网页商品数据保存在Excel表格中,效果如下:
  
  使用Jumony Core引擎,是一个非常强大且几乎完美的HTML解析引擎,支持css3选择器,直接抓取网页文档进行分析,并根据HTTP头自动识别。
  博客园站点导航top信息抓取示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/").Find("#site_nav_top").FirstOrDefault();
  太强大了。如果您熟悉 CSS,则不必手动编写大量可读性差的正则表达式来匹配和获取数据。
  封装一个简单的操作库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
} 查看全部

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天学习了爬虫的基础知识,这里简单总结一下。
  获取的网页商品数据保存在Excel表格中,效果如下:
  
  使用Jumony Core引擎,是一个非常强大且几乎完美的HTML解析引擎,支持css3选择器,直接抓取网页文档进行分析,并根据HTTP头自动识别。
  博客园站点导航top信息抓取示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/";).Find("#site_nav_top").FirstOrDefault();
  太强大了。如果您熟悉 CSS,则不必手动编写大量可读性差的正则表达式来匹配和获取数据。
  封装一个简单的操作库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
}

c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-19 09:08 • 来自相关话题

  c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)
  达到效果
  抢行政区划代码
  地址:
  解决方案
  分析页面数据规则,模拟请求获取页面内容,定时过滤,数据存储,递归
  代码示例创建表、添加、删除
   public void CreateDB(string tableName)
{
string strSql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo." + tableName
+ "') AND type in (N'U')) DROP TABLE dbo." + tableName;
string strC = " CREATE TABLE dbo." + tableName + "([id] [varchar](50) NULL,[type] [varchar](50) NULL,[name] [nvarchar](50) NULL,[pid] [varchar](50) NULL,[url] [varchar](100) NULL) ON [PRIMARY]";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
sqlh.ExecuteSQLNonQuery(strC);
}
public void InsertDB(Region r, string tableName)
{
string strSql = "INSERT INTO " + tableName + " ([id],[type],[name],[pid],[url]) VALUES('" + r.id
+ "','" + r.type + "','" + r.name + "','" + r.pid + "','" + r.url + "')";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
public void DeleteDB()
{
string strSql = "delete from [GetRegion] ";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
  数据抓取
   ///
/// 模拟请求返回数据
///
/// 网页地址
/// POST、GET
/// UTF-8、gb2312
/// 网页内容
public string Send(string strUrl, string strType, string strEncoding)
{
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); ////创建request请求
if (httpReq == null)
{
throw new ApplicationException(string.Format("Invalid url string: {0}", strUrl));
}
httpReq.Method = strType;
httpReq.Timeout = 1000 * 30;
//设置请求方式
HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse(); ////返回response数据
Stream myRequestStream = httpRes.GetResponseStream(); ////取得内容
StreamReader myStreamRead = new StreamReader(myRequestStream, Encoding.GetEncoding(strEncoding)); ////读取流
string strdata = string.Empty;
strdata = myStreamRead.ReadToEnd();
myStreamRead.Close();
myRequestStream.Close();
return strdata;
}
  递归
<p> public void GetRegion(string strUrl, string strPid, string tableName)
{
string strHtml = Send(strUrl, "GET", "gb2312");
string strTable = AnalyzeHtml(strHtml);
//街道
if (strHtml.Contains("villagetable"))
{
Regex reg = new Regex(@"(?.*?)");
MatchCollection mc = reg.Matches(strTable);
for (int i = 0; i < (mc.Count - 1) / 3; i++)
{
Region r = new Region();
r.id = mc[i * 3 + 1].ToString().Replace("", "").Replace("", "");
r.type = mc[i * 3 + 2].ToString().Replace("", "").Replace("", "");
r.pid = strPid;
r.name = mc[i * 3 + 3].ToString().Replace("", "").Replace("", "");
//listR.Add(r);
InsertDB(r, tableName);
}
}
else
{
Regex reg = new Regex(@"(?is)]*?href=(['""]?)(?[^'""\s>]+)\1[^>]*>(?(?:(?! 查看全部

  c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)
  达到效果
  抢行政区划代码
  地址:
  解决方案
  分析页面数据规则,模拟请求获取页面内容,定时过滤,数据存储,递归
  代码示例创建表、添加、删除
   public void CreateDB(string tableName)
{
string strSql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo." + tableName
+ "') AND type in (N'U')) DROP TABLE dbo." + tableName;
string strC = " CREATE TABLE dbo." + tableName + "([id] [varchar](50) NULL,[type] [varchar](50) NULL,[name] [nvarchar](50) NULL,[pid] [varchar](50) NULL,[url] [varchar](100) NULL) ON [PRIMARY]";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
sqlh.ExecuteSQLNonQuery(strC);
}
public void InsertDB(Region r, string tableName)
{
string strSql = "INSERT INTO " + tableName + " ([id],[type],[name],[pid],[url]) VALUES('" + r.id
+ "','" + r.type + "','" + r.name + "','" + r.pid + "','" + r.url + "')";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
public void DeleteDB()
{
string strSql = "delete from [GetRegion] ";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
  数据抓取
   ///
/// 模拟请求返回数据
///
/// 网页地址
/// POST、GET
/// UTF-8、gb2312
/// 网页内容
public string Send(string strUrl, string strType, string strEncoding)
{
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); ////创建request请求
if (httpReq == null)
{
throw new ApplicationException(string.Format("Invalid url string: {0}", strUrl));
}
httpReq.Method = strType;
httpReq.Timeout = 1000 * 30;
//设置请求方式
HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse(); ////返回response数据
Stream myRequestStream = httpRes.GetResponseStream(); ////取得内容
StreamReader myStreamRead = new StreamReader(myRequestStream, Encoding.GetEncoding(strEncoding)); ////读取流
string strdata = string.Empty;
strdata = myStreamRead.ReadToEnd();
myStreamRead.Close();
myRequestStream.Close();
return strdata;
}
  递归
<p> public void GetRegion(string strUrl, string strPid, string tableName)
{
string strHtml = Send(strUrl, "GET", "gb2312");
string strTable = AnalyzeHtml(strHtml);
//街道
if (strHtml.Contains("villagetable"))
{
Regex reg = new Regex(@"(?.*?)");
MatchCollection mc = reg.Matches(strTable);
for (int i = 0; i < (mc.Count - 1) / 3; i++)
{
Region r = new Region();
r.id = mc[i * 3 + 1].ToString().Replace("", "").Replace("", "");
r.type = mc[i * 3 + 2].ToString().Replace("", "").Replace("", "");
r.pid = strPid;
r.name = mc[i * 3 + 3].ToString().Replace("", "").Replace("", "");
//listR.Add(r);
InsertDB(r, tableName);
}
}
else
{
Regex reg = new Regex(@"(?is)]*?href=(['""]?)(?[^'""\s>]+)\1[^>]*>(?(?:(?!

c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析 )

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-16 22:40 • 来自相关话题

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天我已经学会了爬行动物的基本知识。这里有一个简短的总结
  捕获的web产品数据存储在Excel表格中,效果如下:
  
  使用jumony core引擎。它是一个非常强大且近乎完美的HTML解析引擎。它支持CSS3选择器,直接抓取web文档进行分析,并根据HTTP头自动识别它们
  捕获博客公园站点顶部导航信息的示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/").Find("#site_nav_top").FirstOrDefault();
  它太强大了。如果您熟悉CSS,就不必手动编写大量可读性差的正则表达式来匹配和获取数据
  封装一个简单的操作类库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
} 查看全部

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天我已经学会了爬行动物的基本知识。这里有一个简短的总结
  捕获的web产品数据存储在Excel表格中,效果如下:
  
  使用jumony core引擎。它是一个非常强大且近乎完美的HTML解析引擎。它支持CSS3选择器,直接抓取web文档进行分析,并根据HTTP头自动识别它们
  捕获博客公园站点顶部导航信息的示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/";).Find("#site_nav_top").FirstOrDefault();
  它太强大了。如果您熟悉CSS,就不必手动编写大量可读性差的正则表达式来匹配和获取数据
  封装一个简单的操作类库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
}

c#抓取网页数据( 这篇就是分享:各种数组赋值转换的方法和结果对比)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-16 01:19 • 来自相关话题

  c#抓取网页数据(
这篇就是分享:各种数组赋值转换的方法和结果对比)
  浅谈C#中各种数组的直接数据拷贝/转换
  更新时间:2016-08-23 09:48:40 投稿:景贤
  下面小编就为大家带来一篇关于C#中各种数组的直接数据复制/转换的文章。我觉得还不错,现在分享给大家,给大家参考。跟着小编一起来看看吧
  之前我用C#的SharpGL库做Opengl程序,里面有各种奇怪的绑定函数,比如原型是:
  
void glInterleavedArrays(uint format, int stride, void * pointer);
  该函数绑定到:
  
private static extern void glInterleavedArrays(uint format, int stride, int[] pointer);
  然后就迫不及待的学习了各种float[]转int[]的方法,对比一下它们的效率(其实我还是觉得C++更快,一个指针类型的转换,哦啦)
  下面是我写的各种数组赋值转换的方法和结果的对比。
  1.Marshal.Copy,有2个数组拷贝到IntPtr和IntPtr到数组【当T2不是Copy支持的类型时,会报错。引入动态dTo的原因是因为使用T2[] dTo无法编译],处理2000000*100字节1120.0018ms
  
public static T2[] Arr2Arr(T1[] from)
where T1: struct
where T2 :struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dFrom = from;
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = Marshal.AllocHGlobal(byteNum);
Marshal.Copy(dFrom, 0, ptr, from.Length);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  2.unsafe 方法使用指针获取IntPtr,减少一个副本,变得更快。【当T2不是Copy支持的类型时,会报错。引入 pFrom 的原因是泛型类型 T1[] 无法修复。它处理 2000000 *100 字节 695.9993ms
  
public unsafe static T2[] Arr2Arr(T1[] from, void * pFrom)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = new IntPtr(pFrom);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  3.通过GCHandle获取IntPtr,然后复制【T2不是Copy支持的类型时出错】,处理2000000*100字节930.0481ms
  
public static T2[] Arr2Arr2(T1[] from)
where T1 : struct
where T2 : struct
{
var gch = GCHandle.Alloc(from,GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
Marshal.Copy(ptr, dTo, 0, dTo.Length);
gch.Free();
return dTo;
}
  4.Array.Copy方法,原生数组复制方法【无Copy,可以处理任何值类型】,处理2000000*100字节620.042ms
  
public static T2[] Arr2Arr3(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Array.Copy(from, dTo, dTo.Length);
return dTo;
}
  5. 通过Buffer.BlockCopy复制数组,最快,感觉和c++的memcpy类似【不用Copy,可以处理任何值类型】,处理2000000*100字节300.0329ms
  
public static T2[] Arr2Arr4(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Buffer.BlockCopy(from, 0, dTo, 0, byteNum);
return dTo;
}
  测试部分代码:
  
byte[] from = new byte[100];
from[0] = 1;
from[1] = 1;
var last = DateTime.Now;
for (int i = 0; i < 2000000; i++)
{
。。。
}
Console.WriteLine((DateTime.Now- last).TotalMilliseconds);
  
//sizeof扩展方法internal static class ExFunc
{
public static int Sizeof(this ValueType t)
{
return Marshal.SizeOf(t);
}
}
  综上所述,Buffer.BlockCopy 是适用范围最广、效率最高的。
  以上文章讲到C#中各种数组的直接数据拷贝/转换都是小编分享的内容,希望能给大家一个参考,也希望大家多多支持脚本之家。 查看全部

  c#抓取网页数据(
这篇就是分享:各种数组赋值转换的方法和结果对比)
  浅谈C#中各种数组的直接数据拷贝/转换
  更新时间:2016-08-23 09:48:40 投稿:景贤
  下面小编就为大家带来一篇关于C#中各种数组的直接数据复制/转换的文章。我觉得还不错,现在分享给大家,给大家参考。跟着小编一起来看看吧
  之前我用C#的SharpGL库做Opengl程序,里面有各种奇怪的绑定函数,比如原型是:
  
void glInterleavedArrays(uint format, int stride, void * pointer);
  该函数绑定到:
  
private static extern void glInterleavedArrays(uint format, int stride, int[] pointer);
  然后就迫不及待的学习了各种float[]转int[]的方法,对比一下它们的效率(其实我还是觉得C++更快,一个指针类型的转换,哦啦)
  下面是我写的各种数组赋值转换的方法和结果的对比。
  1.Marshal.Copy,有2个数组拷贝到IntPtr和IntPtr到数组【当T2不是Copy支持的类型时,会报错。引入动态dTo的原因是因为使用T2[] dTo无法编译],处理2000000*100字节1120.0018ms
  
public static T2[] Arr2Arr(T1[] from)
where T1: struct
where T2 :struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dFrom = from;
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = Marshal.AllocHGlobal(byteNum);
Marshal.Copy(dFrom, 0, ptr, from.Length);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  2.unsafe 方法使用指针获取IntPtr,减少一个副本,变得更快。【当T2不是Copy支持的类型时,会报错。引入 pFrom 的原因是泛型类型 T1[] 无法修复。它处理 2000000 *100 字节 695.9993ms
  
public unsafe static T2[] Arr2Arr(T1[] from, void * pFrom)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = new IntPtr(pFrom);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  3.通过GCHandle获取IntPtr,然后复制【T2不是Copy支持的类型时出错】,处理2000000*100字节930.0481ms
  
public static T2[] Arr2Arr2(T1[] from)
where T1 : struct
where T2 : struct
{
var gch = GCHandle.Alloc(from,GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
Marshal.Copy(ptr, dTo, 0, dTo.Length);
gch.Free();
return dTo;
}
  4.Array.Copy方法,原生数组复制方法【无Copy,可以处理任何值类型】,处理2000000*100字节620.042ms
  
public static T2[] Arr2Arr3(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Array.Copy(from, dTo, dTo.Length);
return dTo;
}
  5. 通过Buffer.BlockCopy复制数组,最快,感觉和c++的memcpy类似【不用Copy,可以处理任何值类型】,处理2000000*100字节300.0329ms
  
public static T2[] Arr2Arr4(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Buffer.BlockCopy(from, 0, dTo, 0, byteNum);
return dTo;
}
  测试部分代码:
  
byte[] from = new byte[100];
from[0] = 1;
from[1] = 1;
var last = DateTime.Now;
for (int i = 0; i < 2000000; i++)
{
。。。
}
Console.WriteLine((DateTime.Now- last).TotalMilliseconds);
  
//sizeof扩展方法internal static class ExFunc
{
public static int Sizeof(this ValueType t)
{
return Marshal.SizeOf(t);
}
}
  综上所述,Buffer.BlockCopy 是适用范围最广、效率最高的。
  以上文章讲到C#中各种数组的直接数据拷贝/转换都是小编分享的内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-12-16 00:29 • 来自相关话题

  c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)
  本文描述了c#使用正则表达式获取网站信息的方法。与您分享,供您参考,如下所示:
  这里,以京东商城的商品细节为例
  1、创建jdrobber CS程序类
<p>
public class JdRobber
{
///
/// 判断是否京东链接
///
///
///
public bool ValidationUrl(string url)
{
bool result = false;
if (!String.IsNullOrEmpty(url))
{
Regex regex = new Regex(@"^http://item.jd.com/\d+.html$");
Match match = regex.Match(url);
if (match.Success)
{
result = true;
}
}
return result;
}
///
/// 抓取京东信息
///
///
///
public void GetInfo(string url)
{
if (ValidationUrl(url))
{
string htmlStr = WebHandler.GetHtmlStr(url, "Default");
if (!String.IsNullOrEmpty(htmlStr))
{
string pattern = ""; //正则表达式
string sourceWebID = ""; //商品关键ID
string title = ""; //标题
decimal price = 0; //价格
string picName = ""; //图片
//提取商品关键ID
pattern = @"http://item.jd.com/(?\d+).html";
sourceWebID = WebHandler.GetRegexText(url, pattern);
//提取标题
pattern = @"[\s\S]*(?.*?)";
title = WebHandler.GetRegexText(htmlStr, pattern);
//提取图片
int begin = htmlStr.IndexOf(" 查看全部

  c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)
  本文描述了c#使用正则表达式获取网站信息的方法。与您分享,供您参考,如下所示:
  这里,以京东商城的商品细节为例
  1、创建jdrobber CS程序类
<p>
public class JdRobber
{
///
/// 判断是否京东链接
///
///
///
public bool ValidationUrl(string url)
{
bool result = false;
if (!String.IsNullOrEmpty(url))
{
Regex regex = new Regex(@"^http://item.jd.com/\d+.html$");
Match match = regex.Match(url);
if (match.Success)
{
result = true;
}
}
return result;
}
///
/// 抓取京东信息
///
///
///
public void GetInfo(string url)
{
if (ValidationUrl(url))
{
string htmlStr = WebHandler.GetHtmlStr(url, "Default");
if (!String.IsNullOrEmpty(htmlStr))
{
string pattern = ""; //正则表达式
string sourceWebID = ""; //商品关键ID
string title = ""; //标题
decimal price = 0; //价格
string picName = ""; //图片
//提取商品关键ID
pattern = @"http://item.jd.com/(?\d+).html";
sourceWebID = WebHandler.GetRegexText(url, pattern);
//提取标题
pattern = @"[\s\S]*(?.*?)";
title = WebHandler.GetRegexText(htmlStr, pattern);
//提取图片
int begin = htmlStr.IndexOf("

c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-12-16 00:05 • 来自相关话题

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集器
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength 查看全部

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength

c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-12-15 12:15 • 来自相关话题

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集器
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength 查看全部

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength

c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2021-12-13 14:12 • 来自相关话题

  c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)
  在redis集群中,当存在大量数据时,直接搜索特定键将导致页面变白
  在C++11中,通常如何定义参数中带有回调函数的异步函数
  根据你的经验。bug管理如何才能取得更好的效果
  Django中的视图py中函数的第一个参数是request。此请求的生命周期有多长
  如何在IE下设置AD的渐变
  什么网站可以检测到JavaScript浏览器的支持
  如何制作php://input从另一个PHP接收数据
  当前流行的面向对象编程方式是什么
  HTML乱码
  硬盘中的文件名使用大写字母,但在VS2010中打开时,会以小写字母显示
  Nagios:ndoutils乱码问题(Nagios中文状态信息显示乱码问题)
  切片列表后的反向顺序
  web后端应该具备什么样的知识结构
  缺少“使用严格”语句
  会话存储是如何顺序存储的
  使用阿里巴巴百川上传头像时会有一个闪回。错误报告如下
  Selenium无法操作浏览器选项卡。还有什么替代方案
  拍摄图片时发生错误,但ValueError除外 查看全部

  c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)
  在redis集群中,当存在大量数据时,直接搜索特定键将导致页面变白
  在C++11中,通常如何定义参数中带有回调函数的异步函数
  根据你的经验。bug管理如何才能取得更好的效果
  Django中的视图py中函数的第一个参数是request。此请求的生命周期有多长
  如何在IE下设置AD的渐变
  什么网站可以检测到JavaScript浏览器的支持
  如何制作php://input从另一个PHP接收数据
  当前流行的面向对象编程方式是什么
  HTML乱码
  硬盘中的文件名使用大写字母,但在VS2010中打开时,会以小写字母显示
  Nagios:ndoutils乱码问题(Nagios中文状态信息显示乱码问题)
  切片列表后的反向顺序
  web后端应该具备什么样的知识结构
  缺少“使用严格”语句
  会话存储是如何顺序存储的
  使用阿里巴巴百川上传头像时会有一个闪回。错误报告如下
  Selenium无法操作浏览器选项卡。还有什么替代方案
  拍摄图片时发生错误,但ValueError除外

c#抓取网页数据(保险起见输入账号密码)

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-11 08:32 • 来自相关话题

  c#抓取网页数据(保险起见输入账号密码)
  4.输入账号密码,确认登录,得到如下数据:
  
  关注POST请求中的Url和postdata,以及服务器返回的cookies
  
  cookie 收录登录信息。为安全起见,我们可以将所有 4 个 cookie 值都传递给服务器。
  首先给出C#发送POST请求的代码:(目的是获取服务器返回的cookie)
   string Url = "URL";
string postDataStr = "POST Data";//因为上面都是离散的键值对,我们可以从Stream中直接找到postDataStr
//登录并获取cookie
HttpPost(Url, postDataStr, ref cookie);
private string HttpPost(string Url, string postDataStr, ref CookieContainer cookie)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = postData.Length;
request.CookieContainer = cookie;
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(postData, 0, postData.Length);
myRequestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
  有了cookie之后,就可以从网站中抓取自己需要的数据,下一步就是发送GET请求
  因为服务器返回的是html,如何从大量的html中快速获取到需要的信息?在这里,我们可以引用一个高效强大的第三方库NSoup(网上也有人推荐htmlparser,但是通过我个人的对比,我发现htmlparser在效率和简单性上都远不如NSoup)
  由于网上的NSoup教程比较好,也可以参考JSoup的教程:
  最后,给我一些我从 网站 抓取的数据:
  
  纸上谈兵,我从来不知道我必须亲自去做。 查看全部

  c#抓取网页数据(保险起见输入账号密码)
  4.输入账号密码,确认登录,得到如下数据:
  
  关注POST请求中的Url和postdata,以及服务器返回的cookies
  
  cookie 收录登录信息。为安全起见,我们可以将所有 4 个 cookie 值都传递给服务器。
  首先给出C#发送POST请求的代码:(目的是获取服务器返回的cookie)
   string Url = "URL";
string postDataStr = "POST Data";//因为上面都是离散的键值对,我们可以从Stream中直接找到postDataStr
//登录并获取cookie
HttpPost(Url, postDataStr, ref cookie);
private string HttpPost(string Url, string postDataStr, ref CookieContainer cookie)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = postData.Length;
request.CookieContainer = cookie;
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(postData, 0, postData.Length);
myRequestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
  有了cookie之后,就可以从网站中抓取自己需要的数据,下一步就是发送GET请求
  因为服务器返回的是html,如何从大量的html中快速获取到需要的信息?在这里,我们可以引用一个高效强大的第三方库NSoup(网上也有人推荐htmlparser,但是通过我个人的对比,我发现htmlparser在效率和简单性上都远不如NSoup)
  由于网上的NSoup教程比较好,也可以参考JSoup的教程:
  最后,给我一些我从 网站 抓取的数据:
  
  纸上谈兵,我从来不知道我必须亲自去做。

c#抓取网页数据(1.讲故事民生资讯号民生民生)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-10 02:10 • 来自相关话题

  c#抓取网页数据(1.讲故事民生资讯号民生民生)
  一:背景1.讲故事
  前段时间,我创建了一个当地民生信息账号。我复制了你的信息。你复制了官方媒体。市民喜欢奇怪的东西,所以就需要如何瞄准和捕捉奇怪的东西。账号上的消息其实做起来很简单,用logistic回归就可以了。本文主要讨论如何爬取。在C#中,大家都知道抓取的通用库是HtmlAgilityPack,但是这个库的主流方法是使用xpath来提取网页的内容,让我很不爽。毕竟,我不熟悉莫名的抵抗。我这个年纪的码农至少学了 5-6 年的 Jquery,所以我必须使用类似 Jquery 的方法。python中有pyquery。在 C# 中是否有类似的方法可以做到这一点?哎,真的有全能的github。. .
  二:CSQuery1.安装
  github地址:然后直接在vs中点击nuget:
  
  2. 举几个例子
  万事俱备,那么如何使用呢?别着急,我举两个博客园里的例子。
  1) 从主页提取友情链接到
  
  如上图所示,这里如果要获取友情链接的几个大字,直接用text()肯定是不行的。默认情况下,它还会捕获所有子节点的文本,如下图所示:
  
  如何处理?可以使用jquery提供的contents方法,然后判断获取到的所有子节点中是否存在文本节点,最后获取文本节点的内容,如下代码所示:
  
  是用js做的,但是用CSQuery代码怎么做呢?模仿一下,如下代码:
  
static void Main(string[] args)
{
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));
var content = jquery["#friend_link"].Contents().Filter((dom) =>
{
return dom.NodeType == NodeType.TEXT_NODE;
}).Text();
Console.WriteLine(content);
}
  
  不知道用xpath提取这样的内容是不是很麻烦,但是用jquery也不是很方便,但是熟悉。
  2) 如何给html中的一些元素着色
  有时需要为业务更改一些html标签的颜色,例如将首页tabmenu中的博客和区域更改为红色,如下图所示:
  
  如何处理CSQuery?如果你玩过jquery,一般来说步骤如下:
  有了步骤,C#代码如下:
  
static void Main(string[] args)
{
Config.HtmlEncoder = HtmlEncoders.None;
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));
var html = jquery["#nav_left li"].Each(dom =>
{
var self = jquery[dom];
var text = self.Text();
if (text == "博问" || text == "专区")
{
self.Find("a").CssSet(new { color = "red" });
}
}).Render();
}

  
  3) 其他操作方法
  除了以上两种操作方法,还可以使用after、before、replaceAll、IS等百种实用方法,本文当然不能一一介绍,有兴趣的可以下载到看看和玩把戏。小提琴。
  三:其他用途
  除了抓取html中的元素,我觉得这个东西还可以用来在发邮件的时候操作邮件模板。毕竟很久以前大家都是用jquery来画html的,所以CSQuery也是可以的。与xslt相比,有优点也有缺点。, 举个例子:
  1. 生成html模板
  2. 使用 CSQuery 将 li 附加到 ul
  您可以使用 Append 将内容附加到 查看全部

  c#抓取网页数据(1.讲故事民生资讯号民生民生)
  一:背景1.讲故事
  前段时间,我创建了一个当地民生信息账号。我复制了你的信息。你复制了官方媒体。市民喜欢奇怪的东西,所以就需要如何瞄准和捕捉奇怪的东西。账号上的消息其实做起来很简单,用logistic回归就可以了。本文主要讨论如何爬取。在C#中,大家都知道抓取的通用库是HtmlAgilityPack,但是这个库的主流方法是使用xpath来提取网页的内容,让我很不爽。毕竟,我不熟悉莫名的抵抗。我这个年纪的码农至少学了 5-6 年的 Jquery,所以我必须使用类似 Jquery 的方法。python中有pyquery。在 C# 中是否有类似的方法可以做到这一点?哎,真的有全能的github。. .
  二:CSQuery1.安装
  github地址:然后直接在vs中点击nuget:
  
  2. 举几个例子
  万事俱备,那么如何使用呢?别着急,我举两个博客园里的例子。
  1) 从主页提取友情链接到
  
  如上图所示,这里如果要获取友情链接的几个大字,直接用text()肯定是不行的。默认情况下,它还会捕获所有子节点的文本,如下图所示:
  
  如何处理?可以使用jquery提供的contents方法,然后判断获取到的所有子节点中是否存在文本节点,最后获取文本节点的内容,如下代码所示:
  
  是用js做的,但是用CSQuery代码怎么做呢?模仿一下,如下代码:
  
static void Main(string[] args)
{
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com";));
var content = jquery["#friend_link"].Contents().Filter((dom) =>
{
return dom.NodeType == NodeType.TEXT_NODE;
}).Text();
Console.WriteLine(content);
}
  
  不知道用xpath提取这样的内容是不是很麻烦,但是用jquery也不是很方便,但是熟悉。
  2) 如何给html中的一些元素着色
  有时需要为业务更改一些html标签的颜色,例如将首页tabmenu中的博客和区域更改为红色,如下图所示:
  
  如何处理CSQuery?如果你玩过jquery,一般来说步骤如下:
  有了步骤,C#代码如下:
  
static void Main(string[] args)
{
Config.HtmlEncoder = HtmlEncoders.None;
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com";));
var html = jquery["#nav_left li"].Each(dom =>
{
var self = jquery[dom];
var text = self.Text();
if (text == "博问" || text == "专区")
{
self.Find("a").CssSet(new { color = "red" });
}
}).Render();
}

  
  3) 其他操作方法
  除了以上两种操作方法,还可以使用after、before、replaceAll、IS等百种实用方法,本文当然不能一一介绍,有兴趣的可以下载到看看和玩把戏。小提琴。
  三:其他用途
  除了抓取html中的元素,我觉得这个东西还可以用来在发邮件的时候操作邮件模板。毕竟很久以前大家都是用jquery来画html的,所以CSQuery也是可以的。与xslt相比,有优点也有缺点。, 举个例子:
  1. 生成html模板
  2. 使用 CSQuery 将 li 附加到 ul
  您可以使用 Append 将内容附加到

c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图) )

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-09 07:11 • 来自相关话题

  c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图)
)
  求一个C#网页数据抓取源码 谁能抓取C#网页数据源码,最好是完整的,可以直接运行抓取,VS2008开发
  最近想做这个,很烦恼。希望好心人能给我一些现成的参考!
  邮件:
  先感谢您。求一个C#网页数据捕获源码--------------------编程问答--------------- ---
<p><br />
#region 范例<br />
//抓取的就是这个地址http://www.baidu.com/s%3Fie%3D ... D3873 这个百度搜索结果页面的如【imis.tmall.com/ 20小时前】中的URL的集合。 <br />
public static IList GetUrls()<br />
{<br />
   WebClient MyWebClient = new WebClient();<br />
   MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据<br />
   Byte[] pageData = MyWebClient.DownloadData("http://www.baidu.com/s%3Fie%3D ... 6quot;); //从指定网站下载数据<br />
    //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句            <br />
    string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句<br />
   string test = @"(?isx)]*class=""g"">(?>(?)|(?)|(?:(?! 查看全部

  c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图)
)
  求一个C#网页数据抓取源码 谁能抓取C#网页数据源码,最好是完整的,可以直接运行抓取,VS2008开发
  最近想做这个,很烦恼。希望好心人能给我一些现成的参考!
  邮件:
  先感谢您。求一个C#网页数据捕获源码--------------------编程问答--------------- ---
<p><br />
#region 范例<br />
//抓取的就是这个地址http://www.baidu.com/s%3Fie%3D ... D3873 这个百度搜索结果页面的如【imis.tmall.com/ 20小时前】中的URL的集合。 <br />
public static IList GetUrls()<br />
{<br />
   WebClient MyWebClient = new WebClient();<br />
   MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据<br />
   Byte[] pageData = MyWebClient.DownloadData("http://www.baidu.com/s%3Fie%3D ... 6quot;); //从指定网站下载数据<br />
    //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句            <br />
    string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句<br />
   string test = @"(?isx)]*class=""g"">(?>(?)|(?)|(?:(?!

c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-08 10:07 • 来自相关话题

  c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)
  c#抓取网页数据,根据给的链接,找到相应的googleapi。只需要几分钟。1.一个工作日吧。我记得我4月18号做这个完整版,花了50分钟。
  从你的问题来看你并不喜欢google你只是想恶心恶心百度那看我另一个问题的回答吧
  如果仅仅是想恶心恶心百度的话,本地安装/卸载火狐/360就可以了.如果你觉得其他大公司也恶心,觉得只是百度太渣了才有这些渣...买断制嘛,几块钱一个g,然后你就懂了.
  知乎开live也有这方面的内容。
  几分钟
  投放任何广告的前提是必须有用户访问,
  可以把域名注册到一个百度网站上面,然后在你要抓取的网站的关键词页面输入你的域名就可以开始抓取了。
  通过支付宝,你可以每天花几分钟进行这个过程。几毛钱就搞定了。
  请百度腾讯阿里搜狗
  5分钟,
  1分钟足矣。
  嗯很容易,百度搜一下几分钟google就可以把这个东西搜出来。
  有专门做这个的,如果你需要他们可以邮件你,价格不超过50块。
  匿名用户:谷歌搞,最好别用百度,
  xxx网是一个什么网站?现在开始抓取你的页面,找哪些关键词最适合做大词。保证不丢失域名。 查看全部

  c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)
  c#抓取网页数据,根据给的链接,找到相应的googleapi。只需要几分钟。1.一个工作日吧。我记得我4月18号做这个完整版,花了50分钟。
  从你的问题来看你并不喜欢google你只是想恶心恶心百度那看我另一个问题的回答吧
  如果仅仅是想恶心恶心百度的话,本地安装/卸载火狐/360就可以了.如果你觉得其他大公司也恶心,觉得只是百度太渣了才有这些渣...买断制嘛,几块钱一个g,然后你就懂了.
  知乎开live也有这方面的内容。
  几分钟
  投放任何广告的前提是必须有用户访问,
  可以把域名注册到一个百度网站上面,然后在你要抓取的网站的关键词页面输入你的域名就可以开始抓取了。
  通过支付宝,你可以每天花几分钟进行这个过程。几毛钱就搞定了。
  请百度腾讯阿里搜狗
  5分钟,
  1分钟足矣。
  嗯很容易,百度搜一下几分钟google就可以把这个东西搜出来。
  有专门做这个的,如果你需要他们可以邮件你,价格不超过50块。
  匿名用户:谷歌搞,最好别用百度,
  xxx网是一个什么网站?现在开始抓取你的页面,找哪些关键词最适合做大词。保证不丢失域名。

c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-07 23:30 • 来自相关话题

  c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
  【转】基于C#.NET 2的高端智能网络爬虫
  这个故事的原因是携程网的一名技术经理。他说他会用自己超高的智商完美碾压爬虫开发者。作为一个业余爬虫开发爱好者,我当然不能发表这样的言论。忽略它。于是,最后一个基础爬虫和这个进阶爬虫开发教程就诞生了。
  
  有人在我上一篇文章中评论了简单爬虫:代码太简单了,太弱了。真是被这群有教养的孩子给震撼到了!我得猜你是不是携程的托儿。为什么在我写完之前就知道你很弱?好像不期待一点点的凶猛,是不会满足的!
  
  今天我们将学习高级爬虫的开发。同时,我们将使用简单的爬虫程序来实现分布式爬虫的Links Master部分,以提高分布式爬虫的效率。
  下面我们要讲的内容涉及到很多开源软件。不要太紧张,通常封装的越高级的东西就越好,只要你放轻松,综合使用,我首先假设你对以下工具有一定的了解:
  一、什么是高级爬虫?
  我们讲了很久的高级爬虫,通常是指它具有浏览器的运行特性,需要第三方库或工具的支持,比如以下常见的东西:
  很多人认为分布式爬虫可以算是高级爬虫。这绝对是错误的理解。分布式只是我们实现爬虫架构的一种手段,而不是定义它的高级因素。
  
  我们称它们为高级爬虫组件主要是因为它们不仅可以直接爬取网页源代码,还可以渲染网站页面的HTML、CSS、Javascript等内容。
  这样的功能对于爬虫的开发有什么好处呢?说到这个好处,就有点谦虚了,毫不夸张的说:这东西可以称得上是“攀登无敌”!!!
  
  我猜你还有这个表达式,因为它强大的机制,它可以让我们执行Javascript代码,触发各种鼠标和键盘事件,操纵页面的Dom结构,使用XPath语法抓取数据,几乎直接在网站 页面。做你可以在浏览器上做的一切。
  
  很多网站使用Ajax动态加载和翻页,比如携程的评论数据。如果之前使用简单的爬虫,很难直接抓取所有的评论数据。我们需要分析满天的Javascript代码才能找到API数据接口,时刻提防对方添加数据陷阱或者修改API接口。
  如果使用高级爬虫,完全可以忽略这些问题。无论他们如何加密Javascript代码隐藏API接口,最终的数据都必须呈现在网站页面的Dom结构中,否则普通用户是看不到的。到达。所以我们可以直接从Dom中提取数据,完全不用分析API数据接口,甚至不用写复杂的正则表达式。
  
  二、高级爬虫如何开发?
  现在我们要一步一步地实现这个高级爬虫。接下来,我们将利用目前正在蓬勃发展的两个组件来完成一个具有基本功能的高级爬虫。首先,我们将下载开源组件:
  
  PhantomJS:可以算是一个没有UI界面的浏览器。主要用于实现页面自动测试。我们使用它的页面解析功能进行网站内容爬取。下载解压后,将bin文件夹下的phantomjs.exe文件复制到你的爬虫项目下的任意文件夹中,我们只需要这个。
  下载链接:
  
  Selenium:是一个自动化的测试工具,封装了很多WebDriver与浏览器内核进行通信。我用开发语言调用它来实现PhantomJS的自动化操作。它的下载页面有很多东西,我们只需要Selenium Client,它支持多种语言(C#、JAVA、Ruby、Python、NodeJS),用你学习的语言下载即可。
  下载链接:
  这里我下载了C#语言客户端,将这4个DLL文件添加到项目引用中。其他语言的开发者请自行寻找方法,然后开始我们的编码之旅。
  
  老规矩,打开Visual Studio 2015新建一个控制台应用,添加一个简单的StrongCrawler类,因为这两个爬虫类有一个共同的部分,符合DRY的原则,需要重构部分代码,我们先提取一个 ICrawler 接口:
  
  然后我们使用StrongCrawler类来实现这个接口:
  
  然后我们编写它的异步爬虫方法:
  
  好了,这个高级爬虫的基本功能就定义好了。我们以携程的酒店数据为例进行爬取。让我们测试一下爬取(酒店名称、地址、评级、价格、评论数量、当前评论页数和评论旁边)。尝试使用详细数据,例如一个页码、评论页总数、每页评论数)。我们现在使用控制台程序来调用它:
  
  从上图可以看出,等待酒店页面加载后,我们通过XPath语法搜索页面元素,首先点击页面上的“酒店评论”按钮,然后等待页面的Dom结构更改,即等待Ajax加载成功,然后抓取需要的数据。看一下代码的执行结果:
  
  我们轻松地在酒店的第一页上抓取了酒店信息和所有评论数据。由于携程网的评论数据是通过ajax进行分页的,为了抓取所有评论,还抓取了评论页码等数据。我们来看看执行性能:
  
  不错,484 毫秒。可以说,在所有高级爬虫组件中,PhantomJS 的效率应该是最高的,几乎没有其他组件可以直接与之抗衡。有了页码数据,我们就可以对评论进行翻页抓取操作。在这个速度下,爬取数百页的评论数据不需要分发。
  三、如何实现分布式?
  分布式爬虫通常使用消息队列来实现。目前,网上有很多开源的消息队列。今天我们将介绍一个非常流行的分布式消息队列开源组件:
  
  RabbitMQ 是一个开源的 AMQP 实现。服务器采用Erlang语言编写,支持.NET、Python、Ruby、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等多种客户端,并支持AJAX。它用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现非常出色。
  下载链接:
  分布式爬虫通常需要两端:
  控制端主要负责控制爬虫运行、监控爬虫状态、配置爬虫抓取方式等,爬虫主机的作用是抓取数据,并将数据提交给数据清洗服务。
  爬虫端也需要分离Master爬虫和Worker爬虫。Master爬虫主要采用简单的爬虫操作方式来实现高性能的超链接。Worker 爬虫使用高级爬虫特性来采集 细化数据,例如 Ajax 加载的内容。给最合适的爬虫做你最擅长的事。
  聪明的你应该已经想到了它们之间的通信方式是消息队列。Master爬虫只需要把抓到的Links扔进数据抓包队列。Worker爬虫通过周期性的拉取队列中的Links来实现数据抓取,抓取完成后将数据提交到数据清洗队列。
  原理应该很清楚了吧?然后自己实现代码。RabbitMQ官网上有示例代码,这里不再赘述。
  四、如何实现一个稳定的加密代理?
  在这个互联网时代,免费的东西基本都在消失,即使存在也绝对是垃圾。所以今天要讲的Shadowsocks也是需要小费的东西。这东西的厉害之处在于,它的流量特征并不明显,而且可以提供非常稳定的上网代理。
  
  下载链接:
  Shadowsocks客户端会在本地启动一个socks5代理,通过这个代理的网络访问请求从客户端发送到服务器,服务器发送请求,然后将响应数据发送回客户端。中间使用AES-256加密传输数据,所以普通代理服务器肯定安全很多。我们来看看它的运行模式:
  
  如图所示,需要在本地运行客户端程序,并连接到远程代理服务器的服务端程序,实现加密通信。然后在本地模拟代理端口,让本地流量由本地客户端加密,然后传输到远程服务器,完成代理转发服务。
  因此,我们只需要购买一台基于Linux的VPS服务器,费用大约15元/月,安装服务器后,可以实现非常稳定的加密代理服务。网上有很多相关的教材,这里就不啰嗦了。
  五、结论
  由于一些压力,我不会在这里发布详细的爬虫源代码。看上面的例子,我绝对可以自己完成一个更强大的高级爬虫。完整源代码下载: 查看全部

  c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
  【转】基于C#.NET 2的高端智能网络爬虫
  这个故事的原因是携程网的一名技术经理。他说他会用自己超高的智商完美碾压爬虫开发者。作为一个业余爬虫开发爱好者,我当然不能发表这样的言论。忽略它。于是,最后一个基础爬虫和这个进阶爬虫开发教程就诞生了。
  
  有人在我上一篇文章中评论了简单爬虫:代码太简单了,太弱了。真是被这群有教养的孩子给震撼到了!我得猜你是不是携程的托儿。为什么在我写完之前就知道你很弱?好像不期待一点点的凶猛,是不会满足的!
  
  今天我们将学习高级爬虫的开发。同时,我们将使用简单的爬虫程序来实现分布式爬虫的Links Master部分,以提高分布式爬虫的效率。
  下面我们要讲的内容涉及到很多开源软件。不要太紧张,通常封装的越高级的东西就越好,只要你放轻松,综合使用,我首先假设你对以下工具有一定的了解:
  一、什么是高级爬虫?
  我们讲了很久的高级爬虫,通常是指它具有浏览器的运行特性,需要第三方库或工具的支持,比如以下常见的东西:
  很多人认为分布式爬虫可以算是高级爬虫。这绝对是错误的理解。分布式只是我们实现爬虫架构的一种手段,而不是定义它的高级因素。
  
  我们称它们为高级爬虫组件主要是因为它们不仅可以直接爬取网页源代码,还可以渲染网站页面的HTML、CSS、Javascript等内容。
  这样的功能对于爬虫的开发有什么好处呢?说到这个好处,就有点谦虚了,毫不夸张的说:这东西可以称得上是“攀登无敌”!!!
  
  我猜你还有这个表达式,因为它强大的机制,它可以让我们执行Javascript代码,触发各种鼠标和键盘事件,操纵页面的Dom结构,使用XPath语法抓取数据,几乎直接在网站 页面。做你可以在浏览器上做的一切。
  
  很多网站使用Ajax动态加载和翻页,比如携程的评论数据。如果之前使用简单的爬虫,很难直接抓取所有的评论数据。我们需要分析满天的Javascript代码才能找到API数据接口,时刻提防对方添加数据陷阱或者修改API接口。
  如果使用高级爬虫,完全可以忽略这些问题。无论他们如何加密Javascript代码隐藏API接口,最终的数据都必须呈现在网站页面的Dom结构中,否则普通用户是看不到的。到达。所以我们可以直接从Dom中提取数据,完全不用分析API数据接口,甚至不用写复杂的正则表达式。
  
  二、高级爬虫如何开发?
  现在我们要一步一步地实现这个高级爬虫。接下来,我们将利用目前正在蓬勃发展的两个组件来完成一个具有基本功能的高级爬虫。首先,我们将下载开源组件:
  
  PhantomJS:可以算是一个没有UI界面的浏览器。主要用于实现页面自动测试。我们使用它的页面解析功能进行网站内容爬取。下载解压后,将bin文件夹下的phantomjs.exe文件复制到你的爬虫项目下的任意文件夹中,我们只需要这个。
  下载链接:
  
  Selenium:是一个自动化的测试工具,封装了很多WebDriver与浏览器内核进行通信。我用开发语言调用它来实现PhantomJS的自动化操作。它的下载页面有很多东西,我们只需要Selenium Client,它支持多种语言(C#、JAVA、Ruby、Python、NodeJS),用你学习的语言下载即可。
  下载链接:
  这里我下载了C#语言客户端,将这4个DLL文件添加到项目引用中。其他语言的开发者请自行寻找方法,然后开始我们的编码之旅。
  
  老规矩,打开Visual Studio 2015新建一个控制台应用,添加一个简单的StrongCrawler类,因为这两个爬虫类有一个共同的部分,符合DRY的原则,需要重构部分代码,我们先提取一个 ICrawler 接口:
  
  然后我们使用StrongCrawler类来实现这个接口:
  
  然后我们编写它的异步爬虫方法:
  
  好了,这个高级爬虫的基本功能就定义好了。我们以携程的酒店数据为例进行爬取。让我们测试一下爬取(酒店名称、地址、评级、价格、评论数量、当前评论页数和评论旁边)。尝试使用详细数据,例如一个页码、评论页总数、每页评论数)。我们现在使用控制台程序来调用它:
  
  从上图可以看出,等待酒店页面加载后,我们通过XPath语法搜索页面元素,首先点击页面上的“酒店评论”按钮,然后等待页面的Dom结构更改,即等待Ajax加载成功,然后抓取需要的数据。看一下代码的执行结果:
  
  我们轻松地在酒店的第一页上抓取了酒店信息和所有评论数据。由于携程网的评论数据是通过ajax进行分页的,为了抓取所有评论,还抓取了评论页码等数据。我们来看看执行性能:
  
  不错,484 毫秒。可以说,在所有高级爬虫组件中,PhantomJS 的效率应该是最高的,几乎没有其他组件可以直接与之抗衡。有了页码数据,我们就可以对评论进行翻页抓取操作。在这个速度下,爬取数百页的评论数据不需要分发。
  三、如何实现分布式?
  分布式爬虫通常使用消息队列来实现。目前,网上有很多开源的消息队列。今天我们将介绍一个非常流行的分布式消息队列开源组件:
  
  RabbitMQ 是一个开源的 AMQP 实现。服务器采用Erlang语言编写,支持.NET、Python、Ruby、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等多种客户端,并支持AJAX。它用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现非常出色。
  下载链接:
  分布式爬虫通常需要两端:
  控制端主要负责控制爬虫运行、监控爬虫状态、配置爬虫抓取方式等,爬虫主机的作用是抓取数据,并将数据提交给数据清洗服务。
  爬虫端也需要分离Master爬虫和Worker爬虫。Master爬虫主要采用简单的爬虫操作方式来实现高性能的超链接。Worker 爬虫使用高级爬虫特性来采集 细化数据,例如 Ajax 加载的内容。给最合适的爬虫做你最擅长的事。
  聪明的你应该已经想到了它们之间的通信方式是消息队列。Master爬虫只需要把抓到的Links扔进数据抓包队列。Worker爬虫通过周期性的拉取队列中的Links来实现数据抓取,抓取完成后将数据提交到数据清洗队列。
  原理应该很清楚了吧?然后自己实现代码。RabbitMQ官网上有示例代码,这里不再赘述。
  四、如何实现一个稳定的加密代理?
  在这个互联网时代,免费的东西基本都在消失,即使存在也绝对是垃圾。所以今天要讲的Shadowsocks也是需要小费的东西。这东西的厉害之处在于,它的流量特征并不明显,而且可以提供非常稳定的上网代理。
  
  下载链接:
  Shadowsocks客户端会在本地启动一个socks5代理,通过这个代理的网络访问请求从客户端发送到服务器,服务器发送请求,然后将响应数据发送回客户端。中间使用AES-256加密传输数据,所以普通代理服务器肯定安全很多。我们来看看它的运行模式:
  
  如图所示,需要在本地运行客户端程序,并连接到远程代理服务器的服务端程序,实现加密通信。然后在本地模拟代理端口,让本地流量由本地客户端加密,然后传输到远程服务器,完成代理转发服务。
  因此,我们只需要购买一台基于Linux的VPS服务器,费用大约15元/月,安装服务器后,可以实现非常稳定的加密代理服务。网上有很多相关的教材,这里就不啰嗦了。
  五、结论
  由于一些压力,我不会在这里发布详细的爬虫源代码。看上面的例子,我绝对可以自己完成一个更强大的高级爬虫。完整源代码下载:

c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)

网站优化优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2021-12-07 23:28 • 来自相关话题

  c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)
  【DotnetSpider系列目录】我们为什么要造轮子
  同学们可以去各大招聘网站查看爬虫工程师的要求,大部分招聘JAVA、PYTHON,甚至NODEJS、C++;或者去开源中国查询C#爬虫项目,只有几个非常Simple或者几年没更新的项目。
  与JAVA相比,纯性能方面,PYTHON并不处于劣势,而是在开发上具有优势(得益于世界上最强大的IDE)。爬虫性能瓶颈多在并发下载(网速)和IP池,为什么.NET没有强大的爬虫框架?老实说,我不知道。可能爬虫框架的核心比较简单,或者.NET的开发者没有其他语言的开发者勤奋,或者.NET的开源氛围没有其他语言的高。直到.NET即将发布开源版本的消息传出,我觉得是时候开发一个跨平台、跨语言的爬虫框架了。但一开始,我还挺紧张的。我觉得我还不够好,无法完全重新设计一个新框架。于是参考了JAVA的轻量级爬虫框架webmagic,加上自己的理解和改进。设计或文笔不好请指正海涵
  框架设计
  由于我指的是webmagic,所以整体架构没有大的变化。设计图如下(图片直接来自webmagic)
  
  基本使用
  基本使用只需要引用DotnetSpider2.Core(Nuget中获取)
  DotnetSpider 需要 4 个模块来实现一个完整的爬虫:Scheduler、Downloader、PageProcessor 和 Pipeline。由于Downloader和Scheduler都有基本的实现,所以只需要实现PageProcessor和Pipeline就可以实现一个基本的爬虫。这种方式也是最自由的方式。
  完整定制示例如下:
  
   public static void Main(string[] args)
{
// Custmize processor and pipeline 完全自定义页面解析和数据管道
CustmizeProcessorAndPipeline();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
  
  
   public static void CustmizeProcessorAndPipeline()
{
// Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
for (int i = 1; i < 5; ++i)
{
// Add start/feed urls. 添加初始采集链接
site.AddStartUrl($"http://list.youku.com/category ... _1_p_{i}.html");
}
Spider spider = Spider.Create(site,
// use memoery queue scheduler. 使用内存调度
new QueueDuplicateRemovedScheduler(),
// use custmize processor for youku 为优酷自定义的 Processor
new YoukuPageProcessor())
// use custmize pipeline for youku 为优酷自定义的 Pipeline
.AddPipeline(new YoukuPipeline());
spider.Downloader = new HttpClientDownloader();
spider.ThreadNum = 1;
spider.EmptySleepTime = 3000;
// Start crawler 启动爬虫
spider.Run();
}
public class YoukuPipeline : BasePipeline
{
private static long count = 0;
public override void Process(params ResultItems[] resultItems)
{
foreach (var resultItem in resultItems)
{
StringBuilder builder = new StringBuilder();
foreach (YoukuVideo entry in resultItem.Results["VideoResult"])
{
count++;
builder.Append($" [YoukuVideo {count}] {entry.Name}");
}
Console.WriteLine(builder);
}
// Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
}
}
public class YoukuPageProcessor : BasePageProcessor
{
protected override void Handle(Page page)
{
// 利用 Selectable 查询并构造自己想要的数据对象
var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
List results = new List();
foreach (var videoElement in totalVideoElements)
{
var video = new YoukuVideo();
video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
results.Add(video);
}
// Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
page.AddResultItem("VideoResult", results);
// Add target requests to scheduler. 解析需要采集的URL
//foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes())
//{
// page.AddTargetRequest(new Request(url.GetValue(), null));
//}
}
}
public class YoukuVideo
{
public string Name { get; set; }
}
  
  个人资料爬虫
  配置爬虫需要额外参考DotnetSpider2.Extension(Nuget中获取)
  在大多数情况下,只需要一个配置文件来实现一个 采集 任务。配置爬虫与基本用法相比,只需要几行代码就可以实现一个爬虫。但凡事有利有弊,配置爬取的自由度比较低。
  使用配置文件爬虫的步骤如下:
  定义数据实体类,通过添加Attribute来定义数据存储规则,通过页面数据的解析规则定义爬虫任务的定义,继承EntitySpider在Main方法中实例化定义的爬虫任务,并调用运行方法
  完整代码如下,自己感受一下,后面的章节会详细介绍如何实现:
  
   public class JdSkuSampleSpider : EntitySpider
{
public JdSkuSampleSpider() : base("JdSkuSample", new Site
{
//HttpProxyPool = new HttpProxyPool(new KuaidailiProxySupplier("快代理API"))
})
{
}
protected override void MyInit(params string[] arguments)
{
Identity = Identity ?? "JD SKU SAMPLE";
ThreadNum = 1;
// dowload html by http client
Downloader = new HttpClientDownloader();
// storage data to mysql, default is mysql entity pipeline, so you can comment this line. Don't miss sslmode.
AddPipeline(new MySqlEntityPipeline("Database='mysql';Data Source=localhost;User ID=root;Password=;Port=3306;SslMode=None;"));
AddStartUrl("http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main", new Dictionary { { "name", "手机" }, { "cat3", "655" } });
AddEntityType();
}
[EntityTable("test", "jd_sku", EntityTable.Monday, Indexs = new[] { "Category" }, Uniques = new[] { "Category,Sku", "Sku" })]
[EntitySelector(Expression = "//li[@class='gl-item']/div[contains(@class,'j-sku-item')]")]
[TargetUrlsSelector(XPaths = new[] { "//span[@class=\"p-num\"]" }, Patterns = new[] { @"&page=[0-9]+&" })]
public class Product : SpiderEntity
{
[PropertyDefine(Expression = "./@data-sku", Length = 100)]
public string Sku { get; set; }
[PropertyDefine(Expression = "name", Type = SelectorType.Enviroment, Length = 100)]
public string Category { get; set; }
[PropertyDefine(Expression = "cat3", Type = SelectorType.Enviroment)]
public int CategoryId { get; set; }
[PropertyDefine(Expression = "./div[1]/a/@href")]
public string Url { get; set; }
[PropertyDefine(Expression = "./div[5]/strong/a")]
public long CommentsCount { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-shop']/@data-shop_name", Length = 100)]
public string ShopName { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-name']/a/em", Length = 100)]
public string Name { get; set; }
[PropertyDefine(Expression = "./@venderid", Length = 100)]
public string VenderId { get; set; }
[PropertyDefine(Expression = "./@jdzy_shop_id", Length = 100)]
public string JdzyShopId { get; set; }
[PropertyDefine(Expression = "Monday", Type = SelectorType.Enviroment)]
public DateTime RunId { get; set; }
}
}
  
  
  public class Program
{
public static void Main(string[] args)
{
JdSkuSampleSpider spider = new JdSkuSampleSpider();
spider.Run();
}
}
  
  代码地址
  希望大家加星:) 查看全部

  c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)
  【DotnetSpider系列目录】我们为什么要造轮子
  同学们可以去各大招聘网站查看爬虫工程师的要求,大部分招聘JAVA、PYTHON,甚至NODEJS、C++;或者去开源中国查询C#爬虫项目,只有几个非常Simple或者几年没更新的项目。
  与JAVA相比,纯性能方面,PYTHON并不处于劣势,而是在开发上具有优势(得益于世界上最强大的IDE)。爬虫性能瓶颈多在并发下载(网速)和IP池,为什么.NET没有强大的爬虫框架?老实说,我不知道。可能爬虫框架的核心比较简单,或者.NET的开发者没有其他语言的开发者勤奋,或者.NET的开源氛围没有其他语言的高。直到.NET即将发布开源版本的消息传出,我觉得是时候开发一个跨平台、跨语言的爬虫框架了。但一开始,我还挺紧张的。我觉得我还不够好,无法完全重新设计一个新框架。于是参考了JAVA的轻量级爬虫框架webmagic,加上自己的理解和改进。设计或文笔不好请指正海涵
  框架设计
  由于我指的是webmagic,所以整体架构没有大的变化。设计图如下(图片直接来自webmagic)
  
  基本使用
  基本使用只需要引用DotnetSpider2.Core(Nuget中获取)
  DotnetSpider 需要 4 个模块来实现一个完整的爬虫:Scheduler、Downloader、PageProcessor 和 Pipeline。由于Downloader和Scheduler都有基本的实现,所以只需要实现PageProcessor和Pipeline就可以实现一个基本的爬虫。这种方式也是最自由的方式。
  完整定制示例如下:
  
   public static void Main(string[] args)
{
// Custmize processor and pipeline 完全自定义页面解析和数据管道
CustmizeProcessorAndPipeline();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
  
  
   public static void CustmizeProcessorAndPipeline()
{
// Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
for (int i = 1; i < 5; ++i)
{
// Add start/feed urls. 添加初始采集链接
site.AddStartUrl($"http://list.youku.com/category ... _1_p_{i}.html");
}
Spider spider = Spider.Create(site,
// use memoery queue scheduler. 使用内存调度
new QueueDuplicateRemovedScheduler(),
// use custmize processor for youku 为优酷自定义的 Processor
new YoukuPageProcessor())
// use custmize pipeline for youku 为优酷自定义的 Pipeline
.AddPipeline(new YoukuPipeline());
spider.Downloader = new HttpClientDownloader();
spider.ThreadNum = 1;
spider.EmptySleepTime = 3000;
// Start crawler 启动爬虫
spider.Run();
}
public class YoukuPipeline : BasePipeline
{
private static long count = 0;
public override void Process(params ResultItems[] resultItems)
{
foreach (var resultItem in resultItems)
{
StringBuilder builder = new StringBuilder();
foreach (YoukuVideo entry in resultItem.Results["VideoResult"])
{
count++;
builder.Append($" [YoukuVideo {count}] {entry.Name}");
}
Console.WriteLine(builder);
}
// Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
}
}
public class YoukuPageProcessor : BasePageProcessor
{
protected override void Handle(Page page)
{
// 利用 Selectable 查询并构造自己想要的数据对象
var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
List results = new List();
foreach (var videoElement in totalVideoElements)
{
var video = new YoukuVideo();
video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
results.Add(video);
}
// Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
page.AddResultItem("VideoResult", results);
// Add target requests to scheduler. 解析需要采集的URL
//foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes())
//{
// page.AddTargetRequest(new Request(url.GetValue(), null));
//}
}
}
public class YoukuVideo
{
public string Name { get; set; }
}
  
  个人资料爬虫
  配置爬虫需要额外参考DotnetSpider2.Extension(Nuget中获取)
  在大多数情况下,只需要一个配置文件来实现一个 采集 任务。配置爬虫与基本用法相比,只需要几行代码就可以实现一个爬虫。但凡事有利有弊,配置爬取的自由度比较低。
  使用配置文件爬虫的步骤如下:
  定义数据实体类,通过添加Attribute来定义数据存储规则,通过页面数据的解析规则定义爬虫任务的定义,继承EntitySpider在Main方法中实例化定义的爬虫任务,并调用运行方法
  完整代码如下,自己感受一下,后面的章节会详细介绍如何实现:
  
   public class JdSkuSampleSpider : EntitySpider
{
public JdSkuSampleSpider() : base("JdSkuSample", new Site
{
//HttpProxyPool = new HttpProxyPool(new KuaidailiProxySupplier("快代理API"))
})
{
}
protected override void MyInit(params string[] arguments)
{
Identity = Identity ?? "JD SKU SAMPLE";
ThreadNum = 1;
// dowload html by http client
Downloader = new HttpClientDownloader();
// storage data to mysql, default is mysql entity pipeline, so you can comment this line. Don't miss sslmode.
AddPipeline(new MySqlEntityPipeline("Database='mysql';Data Source=localhost;User ID=root;Password=;Port=3306;SslMode=None;"));
AddStartUrl("http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main", new Dictionary { { "name", "手机" }, { "cat3", "655" } });
AddEntityType();
}
[EntityTable("test", "jd_sku", EntityTable.Monday, Indexs = new[] { "Category" }, Uniques = new[] { "Category,Sku", "Sku" })]
[EntitySelector(Expression = "//li[@class='gl-item']/div[contains(@class,'j-sku-item')]")]
[TargetUrlsSelector(XPaths = new[] { "//span[@class=\"p-num\"]" }, Patterns = new[] { @"&page=[0-9]+&" })]
public class Product : SpiderEntity
{
[PropertyDefine(Expression = "./@data-sku", Length = 100)]
public string Sku { get; set; }
[PropertyDefine(Expression = "name", Type = SelectorType.Enviroment, Length = 100)]
public string Category { get; set; }
[PropertyDefine(Expression = "cat3", Type = SelectorType.Enviroment)]
public int CategoryId { get; set; }
[PropertyDefine(Expression = "./div[1]/a/@href")]
public string Url { get; set; }
[PropertyDefine(Expression = "./div[5]/strong/a")]
public long CommentsCount { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-shop']/@data-shop_name", Length = 100)]
public string ShopName { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-name']/a/em", Length = 100)]
public string Name { get; set; }
[PropertyDefine(Expression = "./@venderid", Length = 100)]
public string VenderId { get; set; }
[PropertyDefine(Expression = "./@jdzy_shop_id", Length = 100)]
public string JdzyShopId { get; set; }
[PropertyDefine(Expression = "Monday", Type = SelectorType.Enviroment)]
public DateTime RunId { get; set; }
}
}
  
  
  public class Program
{
public static void Main(string[] args)
{
JdSkuSampleSpider spider = new JdSkuSampleSpider();
spider.Run();
}
}
  
  代码地址
  希望大家加星:)

c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-12-02 08:03 • 来自相关话题

  c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)
  c#抓取网页数据,可以通过这个post请求来实现,通过zxing可以统计所有项目的打开时间,某些项目的进入时间等信息。
  按是否压缩进行分类,可以分为以下几种:1,压缩。只保留源代码中的c++部分。2,解压缩。不保留源代码中的c++部分,但只保留关键字。3,二进制。包含所有的c++文件。4,blob。不包含关键字。ps:if的update是对于普通读写取的情况下的,对于单例读写在writeaccess时会执行,sendinterval中读取或postinterval时不会执行。
  blob,binary,二进制。
  除了blob和二进制外,还有blazing,
  file。
  内网/可以直接做成web页面,也可以转成bson做成数据库存储。可以是分布式的,也可以是集中化的。现在在用go,
  如果可以的话,数据库的分页,或者类似于redis里面的list,按照条件排序都可以实现,
  blob格式的内存数据比对方便,有些项目很久没有运行了,估计上层应用是运行中的。
  说下我的情况。上线时间长的项目,更多是对代码实现的修改,推荐使用blob数据,这样可以提供更多的数据保留时间,或者达到二进制的读取速度。大多数项目还是推荐notability的getoutput.buffers这个包。不是特别变态的需求可以不用使用blob。 查看全部

  c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)
  c#抓取网页数据,可以通过这个post请求来实现,通过zxing可以统计所有项目的打开时间,某些项目的进入时间等信息。
  按是否压缩进行分类,可以分为以下几种:1,压缩。只保留源代码中的c++部分。2,解压缩。不保留源代码中的c++部分,但只保留关键字。3,二进制。包含所有的c++文件。4,blob。不包含关键字。ps:if的update是对于普通读写取的情况下的,对于单例读写在writeaccess时会执行,sendinterval中读取或postinterval时不会执行。
  blob,binary,二进制。
  除了blob和二进制外,还有blazing,
  file。
  内网/可以直接做成web页面,也可以转成bson做成数据库存储。可以是分布式的,也可以是集中化的。现在在用go,
  如果可以的话,数据库的分页,或者类似于redis里面的list,按照条件排序都可以实现,
  blob格式的内存数据比对方便,有些项目很久没有运行了,估计上层应用是运行中的。
  说下我的情况。上线时间长的项目,更多是对代码实现的修改,推荐使用blob数据,这样可以提供更多的数据保留时间,或者达到二进制的读取速度。大多数项目还是推荐notability的getoutput.buffers这个包。不是特别变态的需求可以不用使用blob。

c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2021-11-30 03:19 • 来自相关话题

  c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)
  描述:C#编写的多线程异步网络爬虫控制台程序。功能:目前只能提取网络链接,使用的两个记录文件不需要很大。暂时无法抓取网页文字、图片、视频和html代码,敬请谅解。但是需要注意的是,网页的数量非常多。下面的代码理论上可以捕获整个Internet网页链接。但实际上,由于处理器功能和网络条件(主要是网速)的限制,一般家用电脑最多可以处理12个线程的爬虫任务,爬虫速度是有限的。它可以爬行,但需要时间和耐心。当然,这个程序可以捕获所有链接,因为链接不占用太多系统空间,并且借助日志文件,可以将爬取的网页数量堆积起来,甚至可以访问所有互联网网络链接,当然最好是分批进行。建议将maxNum设置为500-1000左右,慢慢积累。另外,由于是控制台程序,有时显示的字符过多,系统会暂停显示。这时候,只需点击控制台并按回车键即可。当程序暂停时,您可以按 Enter 尝试。/// 要使用这个程序,请确保已经创建了相应的记录文件。为简化代码,本程序不够健壮,请见谅。/// 默认文件创建在E盘根目录下的两个文本文件,“待抓取的网址.txt”和“待抓取的网址.txt”。这两个文件需要用户自己创建,注意不要带后缀。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。 查看全部

  c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)
  描述:C#编写的多线程异步网络爬虫控制台程序。功能:目前只能提取网络链接,使用的两个记录文件不需要很大。暂时无法抓取网页文字、图片、视频和html代码,敬请谅解。但是需要注意的是,网页的数量非常多。下面的代码理论上可以捕获整个Internet网页链接。但实际上,由于处理器功能和网络条件(主要是网速)的限制,一般家用电脑最多可以处理12个线程的爬虫任务,爬虫速度是有限的。它可以爬行,但需要时间和耐心。当然,这个程序可以捕获所有链接,因为链接不占用太多系统空间,并且借助日志文件,可以将爬取的网页数量堆积起来,甚至可以访问所有互联网网络链接,当然最好是分批进行。建议将maxNum设置为500-1000左右,慢慢积累。另外,由于是控制台程序,有时显示的字符过多,系统会暂停显示。这时候,只需点击控制台并按回车键即可。当程序暂停时,您可以按 Enter 尝试。/// 要使用这个程序,请确保已经创建了相应的记录文件。为简化代码,本程序不够健壮,请见谅。/// 默认文件创建在E盘根目录下的两个文本文件,“待抓取的网址.txt”和“待抓取的网址.txt”。这两个文件需要用户自己创建,注意不要带后缀。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。

c#抓取网页数据( 类的代码:2016年10月26日(周四) )

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-11-28 19:16 • 来自相关话题

  c#抓取网页数据(
类的代码:2016年10月26日(周四)
)
  正则表达式相关:C#抓取网页类(获取网页中的所有信息)
  课程代码:
<p> 1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Net;
5 using System.IO;
6 using System.Text;
7 using System.Collections.Generic;
8 using System.Text.RegularExpressions;
9 using System.Threading;
10 using System.Web;
11 using System.Web.UI.MobileControls;
12 ///
13 /// 网页类
14 ///
15 public class WebPage
16 {
17 #region 私有成员
18 private Uri m_uri; //url
19 private List m_links; //此网页上的链接
20 private string m_title; //标题
21 private string m_html; //HTML代码
22 private string m_outstr; //网页可输出的纯文本
23 private bool m_good; //网页是否可用
24 private int m_pagesize; //网页的大小
25 private static Dictionary webcookies = new Dictionary();//存放所有网页的Cookie
26
27 #endregion
28
29 #region 属性
30
31 ///
32 /// 通过此属性可获得本网页的网址,只读
33 ///
34 public string URL
35 {
36 get
37 {
38 return m_uri.AbsoluteUri;
39 }
40 }
41
42 ///
43 /// 通过此属性可获得本网页的标题,只读
44 ///
45 public string Title
46 {
47 get
48 {
49 if (m_title == "")
50 {
51 Regex reg = new Regex(@"(?m)]*>(?(?:\w|\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
52 Match mc = reg.Match(m_html);
53 if (mc.Success)
54 m_title = mc.Groups["title"].Value.Trim();
55 }
56 return m_title;
57 }
58 }
59 public string M_html
60 {
61 get
62 {
63 if (m_html == null)
64 {
65 m_html = "";
66 }
67 return m_html;
68 }
69 }
70 ///
71 /// 此属性获得本网页的所有链接信息,只读
72 ///
73 public List Links
74 {
75 get
76 {
77 if (m_links.Count == 0) getLinks();
78 return m_links;
79 }
80 }
81
82
83 ///
84 /// 此属性返回本网页的全部纯文本信息,只读
85 ///
86 public string Context
87 {
88 get
89 {
90 if (m_outstr == "") getContext(Int16.MaxValue);
91 return m_outstr;
92 }
93 }
94
95 ///
96 /// 此属性获得本网页的大小
97 ///
98 public int PageSize
99 {
100 get
101 {
102 return m_pagesize;
103 }
104 }
105 ///
106 /// 此属性获得本网页的所有站内链接
107 ///
108 public List InsiteLinks
109 {
110 get
111 {
112 return getSpecialLinksByUrl("^http://" + m_uri.Host, Int16.MaxValue);
113 }
114 }
115
116 ///
117 /// 此属性表示本网页是否可用
118 ///
119 public bool IsGood
120 {
121 get
122 {
123 return m_good;
124 }
125 }
126 ///
127 /// 此属性表示网页的所在的网站
128 ///
129 public string Host
130 {
131 get
132 {
133 return m_uri.Host;
134 }
135 }
136 #endregion
137
138
139 ///
140 /// 从HTML代码中分析出链接信息
141 ///
142 /// List
143 private List getLinks()
144 {
145 if (m_links.Count == 0)
146 {
147 Regex[] regex = new Regex[2];
148 regex[0] = new Regex(@"(?[^]*>", RegexOptions.IgnoreCase);
150
151 for (int i = 0; i < 2; i++)
152 {
153 Match match = regex[i].Match(m_html);
154 while (match.Success)
155 {
156 try
157 {
158 string url = HttpUtility.UrlDecode(new Uri(m_uri, match.Groups["URL"].Value).AbsoluteUri);
159
160 string text = "";
161 if (i == 0) text = new Regex("(]+>)|(\\s)|( )|&|\"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");
162
163 Link link = new Link();
164 link.Text = text;
165 link.NavigateUrl = url;
166
167 m_links.Add(link);
168 }
169 catch (Exception ex) { Console.WriteLine(ex.Message); };
170 match = match.NextMatch();
171 }
172 }
173 }
174 return m_links;
175 }
176 ///
177 /// 此私有方法从一段HTML文本中提取出一定字数的纯文本
178 ///
179 /// HTML代码
180 /// 提取从头数多少个字
181 /// 是否要链接里面的字
182 /// 纯文本
183 private string getFirstNchar(string instr, int firstN, bool withLink)
184 {
185 if (m_outstr == "")
186 {
187 m_outstr = instr.Clone() as string;
188 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
189 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
190 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
191 if (!withLink) m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
192 Regex objReg = new System.Text.RegularExpressions.Regex("(]+?>)| ", RegexOptions.Multiline | RegexOptions.IgnoreCase);
193 m_outstr = objReg.Replace(m_outstr, "");
194 Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
195 m_outstr = objReg2.Replace(m_outstr, " ");
196
197 }
198 return m_outstr.Length > firstN ? m_outstr.Substring(0, firstN) : m_outstr;
199 }
200
201
202 #region 公有文法
203 ///
204 /// 此公有方法提取网页中一定字数的纯文本,包括链接文字
205 ///
206 /// 字数
207 ///
208 public string getContext(int firstN)
209 {
210 return getFirstNchar(m_html, firstN, true);
211 }
212
213 ///
214 /// 此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式
215 ///
216 /// 正则式
217 /// 返回的链接的个数
218 /// List
219 public List getSpecialLinksByUrl(string pattern, int count)
220 {
221 if (m_links.Count == 0) getLinks();
222 List SpecialLinks = new List();
223 List.Enumerator i;
224 i = m_links.GetEnumerator();
225 int cnt = 0;
226 while (i.MoveNext() && cnt 1 查看全部

  c#抓取网页数据(
类的代码:2016年10月26日(周四)
)
  正则表达式相关:C#抓取网页类(获取网页中的所有信息)
  课程代码:
<p> 1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Net;
5 using System.IO;
6 using System.Text;
7 using System.Collections.Generic;
8 using System.Text.RegularExpressions;
9 using System.Threading;
10 using System.Web;
11 using System.Web.UI.MobileControls;
12 ///
13 /// 网页类
14 ///
15 public class WebPage
16 {
17 #region 私有成员
18 private Uri m_uri; //url
19 private List m_links; //此网页上的链接
20 private string m_title; //标题
21 private string m_html; //HTML代码
22 private string m_outstr; //网页可输出的纯文本
23 private bool m_good; //网页是否可用
24 private int m_pagesize; //网页的大小
25 private static Dictionary webcookies = new Dictionary();//存放所有网页的Cookie
26
27 #endregion
28
29 #region 属性
30
31 ///
32 /// 通过此属性可获得本网页的网址,只读
33 ///
34 public string URL
35 {
36 get
37 {
38 return m_uri.AbsoluteUri;
39 }
40 }
41
42 ///
43 /// 通过此属性可获得本网页的标题,只读
44 ///
45 public string Title
46 {
47 get
48 {
49 if (m_title == "")
50 {
51 Regex reg = new Regex(@"(?m)]*>(?(?:\w|\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
52 Match mc = reg.Match(m_html);
53 if (mc.Success)
54 m_title = mc.Groups["title"].Value.Trim();
55 }
56 return m_title;
57 }
58 }
59 public string M_html
60 {
61 get
62 {
63 if (m_html == null)
64 {
65 m_html = "";
66 }
67 return m_html;
68 }
69 }
70 ///
71 /// 此属性获得本网页的所有链接信息,只读
72 ///
73 public List Links
74 {
75 get
76 {
77 if (m_links.Count == 0) getLinks();
78 return m_links;
79 }
80 }
81
82
83 ///
84 /// 此属性返回本网页的全部纯文本信息,只读
85 ///
86 public string Context
87 {
88 get
89 {
90 if (m_outstr == "") getContext(Int16.MaxValue);
91 return m_outstr;
92 }
93 }
94
95 ///
96 /// 此属性获得本网页的大小
97 ///
98 public int PageSize
99 {
100 get
101 {
102 return m_pagesize;
103 }
104 }
105 ///
106 /// 此属性获得本网页的所有站内链接
107 ///
108 public List InsiteLinks
109 {
110 get
111 {
112 return getSpecialLinksByUrl("^http://" + m_uri.Host, Int16.MaxValue);
113 }
114 }
115
116 ///
117 /// 此属性表示本网页是否可用
118 ///
119 public bool IsGood
120 {
121 get
122 {
123 return m_good;
124 }
125 }
126 ///
127 /// 此属性表示网页的所在的网站
128 ///
129 public string Host
130 {
131 get
132 {
133 return m_uri.Host;
134 }
135 }
136 #endregion
137
138
139 ///
140 /// 从HTML代码中分析出链接信息
141 ///
142 /// List
143 private List getLinks()
144 {
145 if (m_links.Count == 0)
146 {
147 Regex[] regex = new Regex[2];
148 regex[0] = new Regex(@"(?[^]*>", RegexOptions.IgnoreCase);
150
151 for (int i = 0; i < 2; i++)
152 {
153 Match match = regex[i].Match(m_html);
154 while (match.Success)
155 {
156 try
157 {
158 string url = HttpUtility.UrlDecode(new Uri(m_uri, match.Groups["URL"].Value).AbsoluteUri);
159
160 string text = "";
161 if (i == 0) text = new Regex("(]+>)|(\\s)|( )|&|\"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");
162
163 Link link = new Link();
164 link.Text = text;
165 link.NavigateUrl = url;
166
167 m_links.Add(link);
168 }
169 catch (Exception ex) { Console.WriteLine(ex.Message); };
170 match = match.NextMatch();
171 }
172 }
173 }
174 return m_links;
175 }
176 ///
177 /// 此私有方法从一段HTML文本中提取出一定字数的纯文本
178 ///
179 /// HTML代码
180 /// 提取从头数多少个字
181 /// 是否要链接里面的字
182 /// 纯文本
183 private string getFirstNchar(string instr, int firstN, bool withLink)
184 {
185 if (m_outstr == "")
186 {
187 m_outstr = instr.Clone() as string;
188 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
189 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
190 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
191 if (!withLink) m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
192 Regex objReg = new System.Text.RegularExpressions.Regex("(]+?>)| ", RegexOptions.Multiline | RegexOptions.IgnoreCase);
193 m_outstr = objReg.Replace(m_outstr, "");
194 Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
195 m_outstr = objReg2.Replace(m_outstr, " ");
196
197 }
198 return m_outstr.Length > firstN ? m_outstr.Substring(0, firstN) : m_outstr;
199 }
200
201
202 #region 公有文法
203 ///
204 /// 此公有方法提取网页中一定字数的纯文本,包括链接文字
205 ///
206 /// 字数
207 ///
208 public string getContext(int firstN)
209 {
210 return getFirstNchar(m_html, firstN, true);
211 }
212
213 ///
214 /// 此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式
215 ///
216 /// 正则式
217 /// 返回的链接的个数
218 /// List
219 public List getSpecialLinksByUrl(string pattern, int count)
220 {
221 if (m_links.Count == 0) getLinks();
222 List SpecialLinks = new List();
223 List.Enumerator i;
224 i = m_links.GetEnumerator();
225 int cnt = 0;
226 while (i.MoveNext() && cnt 1

c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)

网站优化优采云 发表了文章 • 0 个评论 • 106 次浏览 • 2021-11-24 10:05 • 来自相关话题

  c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)
  网上有很多内容采集工具,今天尝试自己写一个,发现C#可以很方便的抓取网页的内容,然后通过正则化分离出感兴趣的数据。这是抓取网页内容的代码:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace Web
{
///
/// 公共方法类
///
public class WebHandler
{
///
/// 获取网页的HTML码
///
/// 链接地址
/// 编码类型
///
public static string GetHtmlStr(string url, string encoding)
{
string htmlStr = "";
try
{
if (!String.IsNullOrEmpty(url))
{
WebRequest request = WebRequest.Create(url); //实例化WebRequest对象
WebResponse response = request.GetResponse(); //创建WebResponse对象
Stream datastream = response.GetResponseStream(); //创建流对象
Encoding ec = Encoding.Default;
if (encoding == "UTF8")
{
ec = Encoding.UTF8;
}
else if (encoding == "Default")
{
ec = Encoding.Default;
}
StreamReader reader = new StreamReader(datastream, ec);
htmlStr = reader.ReadToEnd(); //读取网页内容
reader.Close();
datastream.Close();
response.Close();
}
}
catch { }
return htmlStr;
}
}

}
  该方法可以获取网页的HTML内容。使用 HTML,我们可以使用正则化来抓取我们想要的内容。. . 查看全部

  c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)
  网上有很多内容采集工具,今天尝试自己写一个,发现C#可以很方便的抓取网页的内容,然后通过正则化分离出感兴趣的数据。这是抓取网页内容的代码:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace Web
{
///
/// 公共方法类
///
public class WebHandler
{
///
/// 获取网页的HTML码
///
/// 链接地址
/// 编码类型
///
public static string GetHtmlStr(string url, string encoding)
{
string htmlStr = "";
try
{
if (!String.IsNullOrEmpty(url))
{
WebRequest request = WebRequest.Create(url); //实例化WebRequest对象
WebResponse response = request.GetResponse(); //创建WebResponse对象
Stream datastream = response.GetResponseStream(); //创建流对象
Encoding ec = Encoding.Default;
if (encoding == "UTF8")
{
ec = Encoding.UTF8;
}
else if (encoding == "Default")
{
ec = Encoding.Default;
}
StreamReader reader = new StreamReader(datastream, ec);
htmlStr = reader.ReadToEnd(); //读取网页内容
reader.Close();
datastream.Close();
response.Close();
}
}
catch { }
return htmlStr;
}
}

}
  该方法可以获取网页的HTML内容。使用 HTML,我们可以使用正则化来抓取我们想要的内容。. .

c#抓取网页数据( 常见的提高抓取效率的策略有:抓取最多的网页)

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2021-12-22 02:24 • 来自相关话题

  c#抓取网页数据(
常见的提高抓取效率的策略有:抓取最多的网页)
  
  Spider是整个搜索引擎系统中非常重要的一部分,可以说是搜索引擎的基础。它不仅为搜索引擎提供了海量数据的搜索对象,更重要的是,它使搜索引擎从一个检索工具上升为一个信息集成平台。
  爬行效率
  爬行的效率与计算机硬件的性能、硬件的数量、网络的带宽有关。但是,为了提高爬取效率,不能一味地增加硬件,而是利用有限的硬件资源,在一定时间内抓取最多。网页。
  提高爬取效率的常用策略有:
  (1) 多线程并发爬取
  (2) 单线程、非阻塞 i/o 获取
  (3)分布式爬取,爬取工作分布到多台服务器来完成。对于google等搜索引擎,还包括地域分布,将爬取服务器集群分布到全球各个国家的骨干网。挑选。
  爬行质量
  蜘蛛设计的目标不是捕获互联网上的所有网页,而是捕获最重要和最新的网页。
  如何抓取高质量的网页?哪些网页质量更高?这里要求设计师对互联网和用户的使用习惯和常识有一定的了解。
  从整个互联网的角度来看,网站中各个网页之间的链接关系是一个非常重要的资源。因此,在抓取网页时应记录网页之间的链接关系进行链接分析,从而通过链接关系来评价网页的质量。
  爬行的礼貌问题
  礼貌爬取具体表现在:网站不爬取未爬取的网页,控制访问网站的频率。蜘蛛的爬行行为不应影响正常用户的访问。因此,蜘蛛必须:
  (1)限制单位时间内爬取的网页数量为一个网站。
  (2)限制可以同时爬取到同一个网站的线程/进程数。
  (3)控制捕获相同网站的时间间隔。
  (4)遵循robots、meta tag、sitemap.htm协议,不允许的目录不要访问。
  (5)在抓取网页时发送的请求中,user-agent和form字段用于识别蜘蛛的身份,联系邮箱,以及spdier防范页面的url。
  避免重复爬行
  重复爬取的原因是:
  (1)网上有很多网络
  该页面被其他网页引用,使得同一个网页的URL出现在多个不同的网页中,这就需要蜘蛛具备URL去重功能。
  (2)网页被其他网页转载,导致同一篇文章文章出现在不同url的页面中,这就需要蜘蛛具备内容去重功能,目前实现难度较大,目前有很多搜索引擎公司并没有很好地解决这个问题。
  (3)网页的URL有多种表示,是dns和ip的对应关系造成的。
  爬取数据的更新
  更新爬取数据的问题是一个非常重要的问题。它决定了用户是否可以立即搜索到最新的新闻和最新的内容。但是由于互联网上的网页数量众多,一次爬取的周期很长。每次都重新爬一次更新,更新周期势必很长。
  蜘蛛抓取的网页可能会被修改或删除。Spider会定期检查这些网页的更新状态,同时更新原创网页数据库、提取数据库和索引数据库。
  6.内容提取
  蜘蛛需要抓取的文件有很多种,比如html、xml网页、doc、ppt、xls、pdf等格式文档,以及图片、音频、视频等多媒体数据。对于这些不同类型的文件,蜘蛛必须提取文件中的纯文本内容。
  对于doc、pdf等文件,专业厂商提供的软件生成的此类文件,厂商会提供相应的文本提取接口。
  对于html和xml页面,除了title和body之外,还会有很多版权信息、广告链接、公众频道链接。这些链接与正文无关。在提取页面内容时,还需要过滤掉这些无用的链接。
  以上就是代理IP服务器如何提高c#爬虫爬虫效率的相关介绍。Sun HTTP代理是专业的企业级优质代理IP供应平台,为大数据提供优质HTTP代理IP和Socks5代理IP采集提供服务。也可以联系客服免费试用! 查看全部

  c#抓取网页数据(
常见的提高抓取效率的策略有:抓取最多的网页)
  
  Spider是整个搜索引擎系统中非常重要的一部分,可以说是搜索引擎的基础。它不仅为搜索引擎提供了海量数据的搜索对象,更重要的是,它使搜索引擎从一个检索工具上升为一个信息集成平台。
  爬行效率
  爬行的效率与计算机硬件的性能、硬件的数量、网络的带宽有关。但是,为了提高爬取效率,不能一味地增加硬件,而是利用有限的硬件资源,在一定时间内抓取最多。网页。
  提高爬取效率的常用策略有:
  (1) 多线程并发爬取
  (2) 单线程、非阻塞 i/o 获取
  (3)分布式爬取,爬取工作分布到多台服务器来完成。对于google等搜索引擎,还包括地域分布,将爬取服务器集群分布到全球各个国家的骨干网。挑选。
  爬行质量
  蜘蛛设计的目标不是捕获互联网上的所有网页,而是捕获最重要和最新的网页。
  如何抓取高质量的网页?哪些网页质量更高?这里要求设计师对互联网和用户的使用习惯和常识有一定的了解。
  从整个互联网的角度来看,网站中各个网页之间的链接关系是一个非常重要的资源。因此,在抓取网页时应记录网页之间的链接关系进行链接分析,从而通过链接关系来评价网页的质量。
  爬行的礼貌问题
  礼貌爬取具体表现在:网站不爬取未爬取的网页,控制访问网站的频率。蜘蛛的爬行行为不应影响正常用户的访问。因此,蜘蛛必须:
  (1)限制单位时间内爬取的网页数量为一个网站。
  (2)限制可以同时爬取到同一个网站的线程/进程数。
  (3)控制捕获相同网站的时间间隔。
  (4)遵循robots、meta tag、sitemap.htm协议,不允许的目录不要访问。
  (5)在抓取网页时发送的请求中,user-agent和form字段用于识别蜘蛛的身份,联系邮箱,以及spdier防范页面的url。
  避免重复爬行
  重复爬取的原因是:
  (1)网上有很多网络
  该页面被其他网页引用,使得同一个网页的URL出现在多个不同的网页中,这就需要蜘蛛具备URL去重功能。
  (2)网页被其他网页转载,导致同一篇文章文章出现在不同url的页面中,这就需要蜘蛛具备内容去重功能,目前实现难度较大,目前有很多搜索引擎公司并没有很好地解决这个问题。
  (3)网页的URL有多种表示,是dns和ip的对应关系造成的。
  爬取数据的更新
  更新爬取数据的问题是一个非常重要的问题。它决定了用户是否可以立即搜索到最新的新闻和最新的内容。但是由于互联网上的网页数量众多,一次爬取的周期很长。每次都重新爬一次更新,更新周期势必很长。
  蜘蛛抓取的网页可能会被修改或删除。Spider会定期检查这些网页的更新状态,同时更新原创网页数据库、提取数据库和索引数据库。
  6.内容提取
  蜘蛛需要抓取的文件有很多种,比如html、xml网页、doc、ppt、xls、pdf等格式文档,以及图片、音频、视频等多媒体数据。对于这些不同类型的文件,蜘蛛必须提取文件中的纯文本内容。
  对于doc、pdf等文件,专业厂商提供的软件生成的此类文件,厂商会提供相应的文本提取接口。
  对于html和xml页面,除了title和body之外,还会有很多版权信息、广告链接、公众频道链接。这些链接与正文无关。在提取页面内容时,还需要过滤掉这些无用的链接。
  以上就是代理IP服务器如何提高c#爬虫爬虫效率的相关介绍。Sun HTTP代理是专业的企业级优质代理IP供应平台,为大数据提供优质HTTP代理IP和Socks5代理IP采集提供服务。也可以联系客服免费试用!

c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-21 14:04 • 来自相关话题

  c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))
  当前网页中有相当一部分使用了 AJAX 技术。无论是WebClient还是C#中的HttpRequest,都无法得到正确的结果,因为这些脚本都是在服务端发送后执行的!
  但是我们用IE浏览页面是正常的,所以只有一种解决方法就是使用WebBrowser控件
  但是使用Webbrowser,你会发现在DownloadComplete事件中,你无法知道页面什么时候真正加载了!
  当然,个别带有 Frame 的网页可能会多次触发 Complete。即使你使用counter的方法,也就是在Navigated event++中,在DownloadComplete中进行,JS执行完成后依然无法得到结果。一开始也觉得很奇怪,直到后来GG相关AJAX文章才明白了原委。
  最终的解决方案是使用WebBrowser+Timer解决页面爬行问题
  关键还是页面状态,我们可以使用webBrowser1.StatusText,如果返回“Done”,则表示页面已加载!
  示例代码如下:
  private void timer1_Tick(object sender, EventArgs e)
{

textBox1.Text += webBrowser1.StatusText;
if (webBrowser1.StatusText == "完成")
{

timer1.Enabled = false;
//页面加载完成,做一些其它的事
textBox1.Text += webBrowser1.Document.Body.OuterHtml;
//webBrowser1.DocumentText 注意不要用这个,这个和查看源文件一样的
}
}
private void Form1_Load(object sender, EventArgs e)
{
string Url = "http://cd.mei8.cn/face/work/wi ... 3B%3B
webBrowser1.Navigate(Url);
}
  放置三个控件,webBrowser、timer、textBox定时器设置为可用 查看全部

  c#抓取网页数据(IE浏览页面何时才算是真正的加载完毕?(图))
  当前网页中有相当一部分使用了 AJAX 技术。无论是WebClient还是C#中的HttpRequest,都无法得到正确的结果,因为这些脚本都是在服务端发送后执行的!
  但是我们用IE浏览页面是正常的,所以只有一种解决方法就是使用WebBrowser控件
  但是使用Webbrowser,你会发现在DownloadComplete事件中,你无法知道页面什么时候真正加载了!
  当然,个别带有 Frame 的网页可能会多次触发 Complete。即使你使用counter的方法,也就是在Navigated event++中,在DownloadComplete中进行,JS执行完成后依然无法得到结果。一开始也觉得很奇怪,直到后来GG相关AJAX文章才明白了原委。
  最终的解决方案是使用WebBrowser+Timer解决页面爬行问题
  关键还是页面状态,我们可以使用webBrowser1.StatusText,如果返回“Done”,则表示页面已加载!
  示例代码如下:
  private void timer1_Tick(object sender, EventArgs e)
{

textBox1.Text += webBrowser1.StatusText;
if (webBrowser1.StatusText == "完成")
{

timer1.Enabled = false;
//页面加载完成,做一些其它的事
textBox1.Text += webBrowser1.Document.Body.OuterHtml;
//webBrowser1.DocumentText 注意不要用这个,这个和查看源文件一样的
}
}
private void Form1_Load(object sender, EventArgs e)
{
string Url = "http://cd.mei8.cn/face/work/wi ... 3B%3B
webBrowser1.Navigate(Url);
}
  放置三个控件,webBrowser、timer、textBox定时器设置为可用

c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析 )

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-20 16:03 • 来自相关话题

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天学习了爬虫的基础知识,这里简单总结一下。
  获取的网页商品数据保存在Excel表格中,效果如下:
  
  使用Jumony Core引擎,是一个非常强大且几乎完美的HTML解析引擎,支持css3选择器,直接抓取网页文档进行分析,并根据HTTP头自动识别。
  博客园站点导航top信息抓取示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/").Find("#site_nav_top").FirstOrDefault();
  太强大了。如果您熟悉 CSS,则不必手动编写大量可读性差的正则表达式来匹配和获取数据。
  封装一个简单的操作库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
} 查看全部

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天学习了爬虫的基础知识,这里简单总结一下。
  获取的网页商品数据保存在Excel表格中,效果如下:
  
  使用Jumony Core引擎,是一个非常强大且几乎完美的HTML解析引擎,支持css3选择器,直接抓取网页文档进行分析,并根据HTTP头自动识别。
  博客园站点导航top信息抓取示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/";).Find("#site_nav_top").FirstOrDefault();
  太强大了。如果您熟悉 CSS,则不必手动编写大量可读性差的正则表达式来匹配和获取数据。
  封装一个简单的操作库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
}

c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-19 09:08 • 来自相关话题

  c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)
  达到效果
  抢行政区划代码
  地址:
  解决方案
  分析页面数据规则,模拟请求获取页面内容,定时过滤,数据存储,递归
  代码示例创建表、添加、删除
   public void CreateDB(string tableName)
{
string strSql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo." + tableName
+ "') AND type in (N'U')) DROP TABLE dbo." + tableName;
string strC = " CREATE TABLE dbo." + tableName + "([id] [varchar](50) NULL,[type] [varchar](50) NULL,[name] [nvarchar](50) NULL,[pid] [varchar](50) NULL,[url] [varchar](100) NULL) ON [PRIMARY]";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
sqlh.ExecuteSQLNonQuery(strC);
}
public void InsertDB(Region r, string tableName)
{
string strSql = "INSERT INTO " + tableName + " ([id],[type],[name],[pid],[url]) VALUES('" + r.id
+ "','" + r.type + "','" + r.name + "','" + r.pid + "','" + r.url + "')";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
public void DeleteDB()
{
string strSql = "delete from [GetRegion] ";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
  数据抓取
   ///
/// 模拟请求返回数据
///
/// 网页地址
/// POST、GET
/// UTF-8、gb2312
/// 网页内容
public string Send(string strUrl, string strType, string strEncoding)
{
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); ////创建request请求
if (httpReq == null)
{
throw new ApplicationException(string.Format("Invalid url string: {0}", strUrl));
}
httpReq.Method = strType;
httpReq.Timeout = 1000 * 30;
//设置请求方式
HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse(); ////返回response数据
Stream myRequestStream = httpRes.GetResponseStream(); ////取得内容
StreamReader myStreamRead = new StreamReader(myRequestStream, Encoding.GetEncoding(strEncoding)); ////读取流
string strdata = string.Empty;
strdata = myStreamRead.ReadToEnd();
myStreamRead.Close();
myRequestStream.Close();
return strdata;
}
  递归
<p> public void GetRegion(string strUrl, string strPid, string tableName)
{
string strHtml = Send(strUrl, "GET", "gb2312");
string strTable = AnalyzeHtml(strHtml);
//街道
if (strHtml.Contains("villagetable"))
{
Regex reg = new Regex(@"(?.*?)");
MatchCollection mc = reg.Matches(strTable);
for (int i = 0; i < (mc.Count - 1) / 3; i++)
{
Region r = new Region();
r.id = mc[i * 3 + 1].ToString().Replace("", "").Replace("", "");
r.type = mc[i * 3 + 2].ToString().Replace("", "").Replace("", "");
r.pid = strPid;
r.name = mc[i * 3 + 3].ToString().Replace("", "").Replace("", "");
//listR.Add(r);
InsertDB(r, tableName);
}
}
else
{
Regex reg = new Regex(@"(?is)]*?href=(['""]?)(?[^'""\s>]+)\1[^>]*>(?(?:(?! 查看全部

  c#抓取网页数据(实现效果抓取行政区划代码地址:解决思路分析页面数据规则)
  达到效果
  抢行政区划代码
  地址:
  解决方案
  分析页面数据规则,模拟请求获取页面内容,定时过滤,数据存储,递归
  代码示例创建表、添加、删除
   public void CreateDB(string tableName)
{
string strSql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo." + tableName
+ "') AND type in (N'U')) DROP TABLE dbo." + tableName;
string strC = " CREATE TABLE dbo." + tableName + "([id] [varchar](50) NULL,[type] [varchar](50) NULL,[name] [nvarchar](50) NULL,[pid] [varchar](50) NULL,[url] [varchar](100) NULL) ON [PRIMARY]";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
sqlh.ExecuteSQLNonQuery(strC);
}
public void InsertDB(Region r, string tableName)
{
string strSql = "INSERT INTO " + tableName + " ([id],[type],[name],[pid],[url]) VALUES('" + r.id
+ "','" + r.type + "','" + r.name + "','" + r.pid + "','" + r.url + "')";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
public void DeleteDB()
{
string strSql = "delete from [GetRegion] ";
SQLHelper sqlh = new SQLHelper();
sqlh.ExecuteSQLNonQuery(strSql);
}
  数据抓取
   ///
/// 模拟请求返回数据
///
/// 网页地址
/// POST、GET
/// UTF-8、gb2312
/// 网页内容
public string Send(string strUrl, string strType, string strEncoding)
{
HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(strUrl); ////创建request请求
if (httpReq == null)
{
throw new ApplicationException(string.Format("Invalid url string: {0}", strUrl));
}
httpReq.Method = strType;
httpReq.Timeout = 1000 * 30;
//设置请求方式
HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse(); ////返回response数据
Stream myRequestStream = httpRes.GetResponseStream(); ////取得内容
StreamReader myStreamRead = new StreamReader(myRequestStream, Encoding.GetEncoding(strEncoding)); ////读取流
string strdata = string.Empty;
strdata = myStreamRead.ReadToEnd();
myStreamRead.Close();
myRequestStream.Close();
return strdata;
}
  递归
<p> public void GetRegion(string strUrl, string strPid, string tableName)
{
string strHtml = Send(strUrl, "GET", "gb2312");
string strTable = AnalyzeHtml(strHtml);
//街道
if (strHtml.Contains("villagetable"))
{
Regex reg = new Regex(@"(?.*?)");
MatchCollection mc = reg.Matches(strTable);
for (int i = 0; i < (mc.Count - 1) / 3; i++)
{
Region r = new Region();
r.id = mc[i * 3 + 1].ToString().Replace("", "").Replace("", "");
r.type = mc[i * 3 + 2].ToString().Replace("", "").Replace("", "");
r.pid = strPid;
r.name = mc[i * 3 + 3].ToString().Replace("", "").Replace("", "");
//listR.Add(r);
InsertDB(r, tableName);
}
}
else
{
Regex reg = new Regex(@"(?is)]*?href=(['""]?)(?[^'""\s>]+)\1[^>]*>(?(?:(?!

c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析 )

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-12-16 22:40 • 来自相关话题

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天我已经学会了爬行动物的基本知识。这里有一个简短的总结
  捕获的web产品数据存储在Excel表格中,效果如下:
  
  使用jumony core引擎。它是一个非常强大且近乎完美的HTML解析引擎。它支持CSS3选择器,直接抓取web文档进行分析,并根据HTTP头自动识别它们
  捕获博客公园站点顶部导航信息的示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/").Find("#site_nav_top").FirstOrDefault();
  它太强大了。如果您熟悉CSS,就不必手动编写大量可读性差的正则表达式来匹配和获取数据
  封装一个简单的操作类库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
} 查看全部

  c#抓取网页数据(封装一个简单总结(一):抓取网页文档分析
)
  这两天我已经学会了爬行动物的基本知识。这里有一个简短的总结
  捕获的web产品数据存储在Excel表格中,效果如下:
  
  使用jumony core引擎。它是一个非常强大且近乎完美的HTML解析引擎。它支持CSS3选择器,直接抓取web文档进行分析,并根据HTTP头自动识别它们
  捕获博客公园站点顶部导航信息的示例:
  var documents = new JumonyParser().LoadDocument("http://www.cnblogs.com/";).Find("#site_nav_top").FirstOrDefault();
  它太强大了。如果您熟悉CSS,就不必手动编写大量可读性差的正则表达式来匹配和获取数据
  封装一个简单的操作类库:
   public class BaseAnalyzer
{
///
/// 根据Url加载html文档对象
///
///
///
protected virtual IHtmlDocument LoadDocument(string url)
{
return new JumonyParser().LoadDocument(url);
}
///
/// 查询指定url中指定选择器的元素集
///
///
///
///
protected virtual List QueryHtmlElements(string url, string selector, Func predicate = null)
{
var elementsCollection = new List();
IEnumerable elements = LoadDocument(url).Find(selector);
if (predicate != null)
{
elements = elements.Where(predicate);
}
if (elements != null)
elementsCollection.AddRange(elements);
return elementsCollection;
}
///
/// 分析Html文档,获取指定元素集第一个元素的文本内容
///
/// html文档对象
/// 选择器
/// 文本内容
protected virtual string GetFirstElementText(IHtmlContainer html, string selector)
{
var findList = html.Find(selector);
var result = findList.FirstOrDefault();
return result == null ? string.Empty : result.InnerText();
}
///
/// 分析Html文档,获取指定元素集的文本内容
///
/// html文档对象
/// 选择器
/// 自定义处理获取到的元素集,若没有,就返回第一个元素的文本内容
///
protected virtual string GetElementsText(IHtmlContainer html, string selector, Func func)
{
var findList = html.Find(selector);
if (func != null)
return func(findList);
return GetFirstElementText(html, selector);
}
}
  获取产品名称的示例:
   private ProductInfo AnalyzeProductInfo(string detailUrl)
{
var product = new ProductInfo();
//详情页html文档对象
var html = LoadDocument(detailUrl);
product.ProductName = GetFirstElementText(html, ".goods_particulars h1");
}

c#抓取网页数据( 这篇就是分享:各种数组赋值转换的方法和结果对比)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-12-16 01:19 • 来自相关话题

  c#抓取网页数据(
这篇就是分享:各种数组赋值转换的方法和结果对比)
  浅谈C#中各种数组的直接数据拷贝/转换
  更新时间:2016-08-23 09:48:40 投稿:景贤
  下面小编就为大家带来一篇关于C#中各种数组的直接数据复制/转换的文章。我觉得还不错,现在分享给大家,给大家参考。跟着小编一起来看看吧
  之前我用C#的SharpGL库做Opengl程序,里面有各种奇怪的绑定函数,比如原型是:
  
void glInterleavedArrays(uint format, int stride, void * pointer);
  该函数绑定到:
  
private static extern void glInterleavedArrays(uint format, int stride, int[] pointer);
  然后就迫不及待的学习了各种float[]转int[]的方法,对比一下它们的效率(其实我还是觉得C++更快,一个指针类型的转换,哦啦)
  下面是我写的各种数组赋值转换的方法和结果的对比。
  1.Marshal.Copy,有2个数组拷贝到IntPtr和IntPtr到数组【当T2不是Copy支持的类型时,会报错。引入动态dTo的原因是因为使用T2[] dTo无法编译],处理2000000*100字节1120.0018ms
  
public static T2[] Arr2Arr(T1[] from)
where T1: struct
where T2 :struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dFrom = from;
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = Marshal.AllocHGlobal(byteNum);
Marshal.Copy(dFrom, 0, ptr, from.Length);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  2.unsafe 方法使用指针获取IntPtr,减少一个副本,变得更快。【当T2不是Copy支持的类型时,会报错。引入 pFrom 的原因是泛型类型 T1[] 无法修复。它处理 2000000 *100 字节 695.9993ms
  
public unsafe static T2[] Arr2Arr(T1[] from, void * pFrom)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = new IntPtr(pFrom);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  3.通过GCHandle获取IntPtr,然后复制【T2不是Copy支持的类型时出错】,处理2000000*100字节930.0481ms
  
public static T2[] Arr2Arr2(T1[] from)
where T1 : struct
where T2 : struct
{
var gch = GCHandle.Alloc(from,GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
Marshal.Copy(ptr, dTo, 0, dTo.Length);
gch.Free();
return dTo;
}
  4.Array.Copy方法,原生数组复制方法【无Copy,可以处理任何值类型】,处理2000000*100字节620.042ms
  
public static T2[] Arr2Arr3(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Array.Copy(from, dTo, dTo.Length);
return dTo;
}
  5. 通过Buffer.BlockCopy复制数组,最快,感觉和c++的memcpy类似【不用Copy,可以处理任何值类型】,处理2000000*100字节300.0329ms
  
public static T2[] Arr2Arr4(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Buffer.BlockCopy(from, 0, dTo, 0, byteNum);
return dTo;
}
  测试部分代码:
  
byte[] from = new byte[100];
from[0] = 1;
from[1] = 1;
var last = DateTime.Now;
for (int i = 0; i < 2000000; i++)
{
。。。
}
Console.WriteLine((DateTime.Now- last).TotalMilliseconds);
  
//sizeof扩展方法internal static class ExFunc
{
public static int Sizeof(this ValueType t)
{
return Marshal.SizeOf(t);
}
}
  综上所述,Buffer.BlockCopy 是适用范围最广、效率最高的。
  以上文章讲到C#中各种数组的直接数据拷贝/转换都是小编分享的内容,希望能给大家一个参考,也希望大家多多支持脚本之家。 查看全部

  c#抓取网页数据(
这篇就是分享:各种数组赋值转换的方法和结果对比)
  浅谈C#中各种数组的直接数据拷贝/转换
  更新时间:2016-08-23 09:48:40 投稿:景贤
  下面小编就为大家带来一篇关于C#中各种数组的直接数据复制/转换的文章。我觉得还不错,现在分享给大家,给大家参考。跟着小编一起来看看吧
  之前我用C#的SharpGL库做Opengl程序,里面有各种奇怪的绑定函数,比如原型是:
  
void glInterleavedArrays(uint format, int stride, void * pointer);
  该函数绑定到:
  
private static extern void glInterleavedArrays(uint format, int stride, int[] pointer);
  然后就迫不及待的学习了各种float[]转int[]的方法,对比一下它们的效率(其实我还是觉得C++更快,一个指针类型的转换,哦啦)
  下面是我写的各种数组赋值转换的方法和结果的对比。
  1.Marshal.Copy,有2个数组拷贝到IntPtr和IntPtr到数组【当T2不是Copy支持的类型时,会报错。引入动态dTo的原因是因为使用T2[] dTo无法编译],处理2000000*100字节1120.0018ms
  
public static T2[] Arr2Arr(T1[] from)
where T1: struct
where T2 :struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dFrom = from;
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = Marshal.AllocHGlobal(byteNum);
Marshal.Copy(dFrom, 0, ptr, from.Length);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  2.unsafe 方法使用指针获取IntPtr,减少一个副本,变得更快。【当T2不是Copy支持的类型时,会报错。引入 pFrom 的原因是泛型类型 T1[] 无法修复。它处理 2000000 *100 字节 695.9993ms
  
public unsafe static T2[] Arr2Arr(T1[] from, void * pFrom)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
IntPtr ptr = new IntPtr(pFrom);
Marshal.Copy(ptr, dTo, 0, dTo.Length);
return dTo;
}
  3.通过GCHandle获取IntPtr,然后复制【T2不是Copy支持的类型时出错】,处理2000000*100字节930.0481ms
  
public static T2[] Arr2Arr2(T1[] from)
where T1 : struct
where T2 : struct
{
var gch = GCHandle.Alloc(from,GCHandleType.Pinned);
IntPtr ptr = gch.AddrOfPinnedObject();
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
dynamic dTo = new T2[byteNum / testByte.Sizeof()];
Marshal.Copy(ptr, dTo, 0, dTo.Length);
gch.Free();
return dTo;
}
  4.Array.Copy方法,原生数组复制方法【无Copy,可以处理任何值类型】,处理2000000*100字节620.042ms
  
public static T2[] Arr2Arr3(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Array.Copy(from, dTo, dTo.Length);
return dTo;
}
  5. 通过Buffer.BlockCopy复制数组,最快,感觉和c++的memcpy类似【不用Copy,可以处理任何值类型】,处理2000000*100字节300.0329ms
  
public static T2[] Arr2Arr4(T1[] from)
where T1 : struct
where T2 : struct
{
int byteNum = from.Length * from[0].Sizeof();
T2 testByte = new T2();
T2[] dTo = new T2[byteNum / testByte.Sizeof()];
Buffer.BlockCopy(from, 0, dTo, 0, byteNum);
return dTo;
}
  测试部分代码:
  
byte[] from = new byte[100];
from[0] = 1;
from[1] = 1;
var last = DateTime.Now;
for (int i = 0; i < 2000000; i++)
{
。。。
}
Console.WriteLine((DateTime.Now- last).TotalMilliseconds);
  
//sizeof扩展方法internal static class ExFunc
{
public static int Sizeof(this ValueType t)
{
return Marshal.SizeOf(t);
}
}
  综上所述,Buffer.BlockCopy 是适用范围最广、效率最高的。
  以上文章讲到C#中各种数组的直接数据拷贝/转换都是小编分享的内容,希望能给大家一个参考,也希望大家多多支持脚本之家。

c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-12-16 00:29 • 来自相关话题

  c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)
  本文描述了c#使用正则表达式获取网站信息的方法。与您分享,供您参考,如下所示:
  这里,以京东商城的商品细节为例
  1、创建jdrobber CS程序类
<p>
public class JdRobber
{
///
/// 判断是否京东链接
///
///
///
public bool ValidationUrl(string url)
{
bool result = false;
if (!String.IsNullOrEmpty(url))
{
Regex regex = new Regex(@"^http://item.jd.com/\d+.html$");
Match match = regex.Match(url);
if (match.Success)
{
result = true;
}
}
return result;
}
///
/// 抓取京东信息
///
///
///
public void GetInfo(string url)
{
if (ValidationUrl(url))
{
string htmlStr = WebHandler.GetHtmlStr(url, "Default");
if (!String.IsNullOrEmpty(htmlStr))
{
string pattern = ""; //正则表达式
string sourceWebID = ""; //商品关键ID
string title = ""; //标题
decimal price = 0; //价格
string picName = ""; //图片
//提取商品关键ID
pattern = @"http://item.jd.com/(?\d+).html";
sourceWebID = WebHandler.GetRegexText(url, pattern);
//提取标题
pattern = @"[\s\S]*(?.*?)";
title = WebHandler.GetRegexText(htmlStr, pattern);
//提取图片
int begin = htmlStr.IndexOf(" 查看全部

  c#抓取网页数据(本文正则表达式实例讲述C#使用正则表达式抓取网站信息的方法。)
  本文描述了c#使用正则表达式获取网站信息的方法。与您分享,供您参考,如下所示:
  这里,以京东商城的商品细节为例
  1、创建jdrobber CS程序类
<p>
public class JdRobber
{
///
/// 判断是否京东链接
///
///
///
public bool ValidationUrl(string url)
{
bool result = false;
if (!String.IsNullOrEmpty(url))
{
Regex regex = new Regex(@"^http://item.jd.com/\d+.html$");
Match match = regex.Match(url);
if (match.Success)
{
result = true;
}
}
return result;
}
///
/// 抓取京东信息
///
///
///
public void GetInfo(string url)
{
if (ValidationUrl(url))
{
string htmlStr = WebHandler.GetHtmlStr(url, "Default");
if (!String.IsNullOrEmpty(htmlStr))
{
string pattern = ""; //正则表达式
string sourceWebID = ""; //商品关键ID
string title = ""; //标题
decimal price = 0; //价格
string picName = ""; //图片
//提取商品关键ID
pattern = @"http://item.jd.com/(?\d+).html";
sourceWebID = WebHandler.GetRegexText(url, pattern);
//提取标题
pattern = @"[\s\S]*(?.*?)";
title = WebHandler.GetRegexText(htmlStr, pattern);
//提取图片
int begin = htmlStr.IndexOf("

c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2021-12-16 00:05 • 来自相关话题

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集器
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength 查看全部

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength

c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-12-15 12:15 • 来自相关话题

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集器
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength 查看全部

  c#抓取网页数据(一个抓取网页数据软件(网页源码中的图片价格描述))
  网页数据捕获软件的高分
  用于捕获网页数据(网页源代码中产品的图片、价格、重量和其他信息)的软件
  ------解决方案--------------------
  去下载一个小偷程序。看完后,你基本上知道怎么写了
  ------解决方案--------------------
  优采云采集
  ------解决方案--------------------
  获取HTML源代码,定期分析源代码并提取所需的
  编写规则很容易
  ------解决方案--------------------
  顶,顺便也学
  ------解决方案--------------------
  网页抓取类:
  使用制度
  使用系统。采集。通用的
  使用系统。林克
  使用系统。网络
  使用系统。文本
  使用系统。净额
  使用系统。IO
  使用系统。文本规则表达
  使用系统。采集
  使用系统。木卫一。压缩
  公共类网络绘图
  {
  公共webCrawl(){}
  //获取网页字符URL
  公共静态字符串getHtml(字符串url)
  {
  试一试
  {
  字符串str=“”
  编码en=编码。GetEncoding(GetEncoding(url))
  HttpWebRequest请求=(HttpWebRequest)WebRequest。创建(url)
  请求。标题。设置(“Pragma”、“无缓存”)
  请求。超时=30000
  HttpWebResponse=(HttpWebResponse)请求。GetResponse()
<p>如果(response.StatusCode==HttpStatusCode.OK&&response.ContentLength

c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2021-12-13 14:12 • 来自相关话题

  c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)
  在redis集群中,当存在大量数据时,直接搜索特定键将导致页面变白
  在C++11中,通常如何定义参数中带有回调函数的异步函数
  根据你的经验。bug管理如何才能取得更好的效果
  Django中的视图py中函数的第一个参数是request。此请求的生命周期有多长
  如何在IE下设置AD的渐变
  什么网站可以检测到JavaScript浏览器的支持
  如何制作php://input从另一个PHP接收数据
  当前流行的面向对象编程方式是什么
  HTML乱码
  硬盘中的文件名使用大写字母,但在VS2010中打开时,会以小写字母显示
  Nagios:ndoutils乱码问题(Nagios中文状态信息显示乱码问题)
  切片列表后的反向顺序
  web后端应该具备什么样的知识结构
  缺少“使用严格”语句
  会话存储是如何顺序存储的
  使用阿里巴巴百川上传头像时会有一个闪回。错误报告如下
  Selenium无法操作浏览器选项卡。还有什么替代方案
  拍摄图片时发生错误,但ValueError除外 查看全部

  c#抓取网页数据(rediscluster集群下的页面变白回调函数在C++11中如何定义)
  在redis集群中,当存在大量数据时,直接搜索特定键将导致页面变白
  在C++11中,通常如何定义参数中带有回调函数的异步函数
  根据你的经验。bug管理如何才能取得更好的效果
  Django中的视图py中函数的第一个参数是request。此请求的生命周期有多长
  如何在IE下设置AD的渐变
  什么网站可以检测到JavaScript浏览器的支持
  如何制作php://input从另一个PHP接收数据
  当前流行的面向对象编程方式是什么
  HTML乱码
  硬盘中的文件名使用大写字母,但在VS2010中打开时,会以小写字母显示
  Nagios:ndoutils乱码问题(Nagios中文状态信息显示乱码问题)
  切片列表后的反向顺序
  web后端应该具备什么样的知识结构
  缺少“使用严格”语句
  会话存储是如何顺序存储的
  使用阿里巴巴百川上传头像时会有一个闪回。错误报告如下
  Selenium无法操作浏览器选项卡。还有什么替代方案
  拍摄图片时发生错误,但ValueError除外

c#抓取网页数据(保险起见输入账号密码)

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2021-12-11 08:32 • 来自相关话题

  c#抓取网页数据(保险起见输入账号密码)
  4.输入账号密码,确认登录,得到如下数据:
  
  关注POST请求中的Url和postdata,以及服务器返回的cookies
  
  cookie 收录登录信息。为安全起见,我们可以将所有 4 个 cookie 值都传递给服务器。
  首先给出C#发送POST请求的代码:(目的是获取服务器返回的cookie)
   string Url = "URL";
string postDataStr = "POST Data";//因为上面都是离散的键值对,我们可以从Stream中直接找到postDataStr
//登录并获取cookie
HttpPost(Url, postDataStr, ref cookie);
private string HttpPost(string Url, string postDataStr, ref CookieContainer cookie)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = postData.Length;
request.CookieContainer = cookie;
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(postData, 0, postData.Length);
myRequestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
  有了cookie之后,就可以从网站中抓取自己需要的数据,下一步就是发送GET请求
  因为服务器返回的是html,如何从大量的html中快速获取到需要的信息?在这里,我们可以引用一个高效强大的第三方库NSoup(网上也有人推荐htmlparser,但是通过我个人的对比,我发现htmlparser在效率和简单性上都远不如NSoup)
  由于网上的NSoup教程比较好,也可以参考JSoup的教程:
  最后,给我一些我从 网站 抓取的数据:
  
  纸上谈兵,我从来不知道我必须亲自去做。 查看全部

  c#抓取网页数据(保险起见输入账号密码)
  4.输入账号密码,确认登录,得到如下数据:
  
  关注POST请求中的Url和postdata,以及服务器返回的cookies
  
  cookie 收录登录信息。为安全起见,我们可以将所有 4 个 cookie 值都传递给服务器。
  首先给出C#发送POST请求的代码:(目的是获取服务器返回的cookie)
   string Url = "URL";
string postDataStr = "POST Data";//因为上面都是离散的键值对,我们可以从Stream中直接找到postDataStr
//登录并获取cookie
HttpPost(Url, postDataStr, ref cookie);
private string HttpPost(string Url, string postDataStr, ref CookieContainer cookie)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
byte[] postData = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = postData.Length;
request.CookieContainer = cookie;
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(postData, 0, postData.Length);
myRequestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
  有了cookie之后,就可以从网站中抓取自己需要的数据,下一步就是发送GET请求
  因为服务器返回的是html,如何从大量的html中快速获取到需要的信息?在这里,我们可以引用一个高效强大的第三方库NSoup(网上也有人推荐htmlparser,但是通过我个人的对比,我发现htmlparser在效率和简单性上都远不如NSoup)
  由于网上的NSoup教程比较好,也可以参考JSoup的教程:
  最后,给我一些我从 网站 抓取的数据:
  
  纸上谈兵,我从来不知道我必须亲自去做。

c#抓取网页数据(1.讲故事民生资讯号民生民生)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-10 02:10 • 来自相关话题

  c#抓取网页数据(1.讲故事民生资讯号民生民生)
  一:背景1.讲故事
  前段时间,我创建了一个当地民生信息账号。我复制了你的信息。你复制了官方媒体。市民喜欢奇怪的东西,所以就需要如何瞄准和捕捉奇怪的东西。账号上的消息其实做起来很简单,用logistic回归就可以了。本文主要讨论如何爬取。在C#中,大家都知道抓取的通用库是HtmlAgilityPack,但是这个库的主流方法是使用xpath来提取网页的内容,让我很不爽。毕竟,我不熟悉莫名的抵抗。我这个年纪的码农至少学了 5-6 年的 Jquery,所以我必须使用类似 Jquery 的方法。python中有pyquery。在 C# 中是否有类似的方法可以做到这一点?哎,真的有全能的github。. .
  二:CSQuery1.安装
  github地址:然后直接在vs中点击nuget:
  
  2. 举几个例子
  万事俱备,那么如何使用呢?别着急,我举两个博客园里的例子。
  1) 从主页提取友情链接到
  
  如上图所示,这里如果要获取友情链接的几个大字,直接用text()肯定是不行的。默认情况下,它还会捕获所有子节点的文本,如下图所示:
  
  如何处理?可以使用jquery提供的contents方法,然后判断获取到的所有子节点中是否存在文本节点,最后获取文本节点的内容,如下代码所示:
  
  是用js做的,但是用CSQuery代码怎么做呢?模仿一下,如下代码:
  
static void Main(string[] args)
{
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));
var content = jquery["#friend_link"].Contents().Filter((dom) =>
{
return dom.NodeType == NodeType.TEXT_NODE;
}).Text();
Console.WriteLine(content);
}
  
  不知道用xpath提取这样的内容是不是很麻烦,但是用jquery也不是很方便,但是熟悉。
  2) 如何给html中的一些元素着色
  有时需要为业务更改一些html标签的颜色,例如将首页tabmenu中的博客和区域更改为红色,如下图所示:
  
  如何处理CSQuery?如果你玩过jquery,一般来说步骤如下:
  有了步骤,C#代码如下:
  
static void Main(string[] args)
{
Config.HtmlEncoder = HtmlEncoders.None;
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com"));
var html = jquery["#nav_left li"].Each(dom =>
{
var self = jquery[dom];
var text = self.Text();
if (text == "博问" || text == "专区")
{
self.Find("a").CssSet(new { color = "red" });
}
}).Render();
}

  
  3) 其他操作方法
  除了以上两种操作方法,还可以使用after、before、replaceAll、IS等百种实用方法,本文当然不能一一介绍,有兴趣的可以下载到看看和玩把戏。小提琴。
  三:其他用途
  除了抓取html中的元素,我觉得这个东西还可以用来在发邮件的时候操作邮件模板。毕竟很久以前大家都是用jquery来画html的,所以CSQuery也是可以的。与xslt相比,有优点也有缺点。, 举个例子:
  1. 生成html模板
  2. 使用 CSQuery 将 li 附加到 ul
  您可以使用 Append 将内容附加到 查看全部

  c#抓取网页数据(1.讲故事民生资讯号民生民生)
  一:背景1.讲故事
  前段时间,我创建了一个当地民生信息账号。我复制了你的信息。你复制了官方媒体。市民喜欢奇怪的东西,所以就需要如何瞄准和捕捉奇怪的东西。账号上的消息其实做起来很简单,用logistic回归就可以了。本文主要讨论如何爬取。在C#中,大家都知道抓取的通用库是HtmlAgilityPack,但是这个库的主流方法是使用xpath来提取网页的内容,让我很不爽。毕竟,我不熟悉莫名的抵抗。我这个年纪的码农至少学了 5-6 年的 Jquery,所以我必须使用类似 Jquery 的方法。python中有pyquery。在 C# 中是否有类似的方法可以做到这一点?哎,真的有全能的github。. .
  二:CSQuery1.安装
  github地址:然后直接在vs中点击nuget:
  
  2. 举几个例子
  万事俱备,那么如何使用呢?别着急,我举两个博客园里的例子。
  1) 从主页提取友情链接到
  
  如上图所示,这里如果要获取友情链接的几个大字,直接用text()肯定是不行的。默认情况下,它还会捕获所有子节点的文本,如下图所示:
  
  如何处理?可以使用jquery提供的contents方法,然后判断获取到的所有子节点中是否存在文本节点,最后获取文本节点的内容,如下代码所示:
  
  是用js做的,但是用CSQuery代码怎么做呢?模仿一下,如下代码:
  
static void Main(string[] args)
{
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com";));
var content = jquery["#friend_link"].Contents().Filter((dom) =>
{
return dom.NodeType == NodeType.TEXT_NODE;
}).Text();
Console.WriteLine(content);
}
  
  不知道用xpath提取这样的内容是不是很麻烦,但是用jquery也不是很方便,但是熟悉。
  2) 如何给html中的一些元素着色
  有时需要为业务更改一些html标签的颜色,例如将首页tabmenu中的博客和区域更改为红色,如下图所示:
  
  如何处理CSQuery?如果你玩过jquery,一般来说步骤如下:
  有了步骤,C#代码如下:
  
static void Main(string[] args)
{
Config.HtmlEncoder = HtmlEncoders.None;
var jquery = CQ.CreateDocument(new WebClient().DownloadString("http://cnblogs.com";));
var html = jquery["#nav_left li"].Each(dom =>
{
var self = jquery[dom];
var text = self.Text();
if (text == "博问" || text == "专区")
{
self.Find("a").CssSet(new { color = "red" });
}
}).Render();
}

  
  3) 其他操作方法
  除了以上两种操作方法,还可以使用after、before、replaceAll、IS等百种实用方法,本文当然不能一一介绍,有兴趣的可以下载到看看和玩把戏。小提琴。
  三:其他用途
  除了抓取html中的元素,我觉得这个东西还可以用来在发邮件的时候操作邮件模板。毕竟很久以前大家都是用jquery来画html的,所以CSQuery也是可以的。与xslt相比,有优点也有缺点。, 举个例子:
  1. 生成html模板
  2. 使用 CSQuery 将 li 附加到 ul
  您可以使用 Append 将内容附加到

c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图) )

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2021-12-09 07:11 • 来自相关话题

  c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图)
)
  求一个C#网页数据抓取源码 谁能抓取C#网页数据源码,最好是完整的,可以直接运行抓取,VS2008开发
  最近想做这个,很烦恼。希望好心人能给我一些现成的参考!
  邮件:
  先感谢您。求一个C#网页数据捕获源码--------------------编程问答--------------- ---
<p><br />
#region 范例<br />
//抓取的就是这个地址http://www.baidu.com/s%3Fie%3D ... D3873 这个百度搜索结果页面的如【imis.tmall.com/ 20小时前】中的URL的集合。 <br />
public static IList GetUrls()<br />
{<br />
   WebClient MyWebClient = new WebClient();<br />
   MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据<br />
   Byte[] pageData = MyWebClient.DownloadData("http://www.baidu.com/s%3Fie%3D ... 6quot;); //从指定网站下载数据<br />
    //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句            <br />
    string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句<br />
   string test = @"(?isx)]*class=""g"">(?>(?)|(?)|(?:(?! 查看全部

  c#抓取网页数据(谁能给个C#的网页数据(抓取源代码)(组图)
)
  求一个C#网页数据抓取源码 谁能抓取C#网页数据源码,最好是完整的,可以直接运行抓取,VS2008开发
  最近想做这个,很烦恼。希望好心人能给我一些现成的参考!
  邮件:
  先感谢您。求一个C#网页数据捕获源码--------------------编程问答--------------- ---
<p><br />
#region 范例<br />
//抓取的就是这个地址http://www.baidu.com/s%3Fie%3D ... D3873 这个百度搜索结果页面的如【imis.tmall.com/ 20小时前】中的URL的集合。 <br />
public static IList GetUrls()<br />
{<br />
   WebClient MyWebClient = new WebClient();<br />
   MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据<br />
   Byte[] pageData = MyWebClient.DownloadData("http://www.baidu.com/s%3Fie%3D ... 6quot;); //从指定网站下载数据<br />
    //string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句            <br />
    string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句<br />
   string test = @"(?isx)]*class=""g"">(?>(?)|(?)|(?:(?!

c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-12-08 10:07 • 来自相关话题

  c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)
  c#抓取网页数据,根据给的链接,找到相应的googleapi。只需要几分钟。1.一个工作日吧。我记得我4月18号做这个完整版,花了50分钟。
  从你的问题来看你并不喜欢google你只是想恶心恶心百度那看我另一个问题的回答吧
  如果仅仅是想恶心恶心百度的话,本地安装/卸载火狐/360就可以了.如果你觉得其他大公司也恶心,觉得只是百度太渣了才有这些渣...买断制嘛,几块钱一个g,然后你就懂了.
  知乎开live也有这方面的内容。
  几分钟
  投放任何广告的前提是必须有用户访问,
  可以把域名注册到一个百度网站上面,然后在你要抓取的网站的关键词页面输入你的域名就可以开始抓取了。
  通过支付宝,你可以每天花几分钟进行这个过程。几毛钱就搞定了。
  请百度腾讯阿里搜狗
  5分钟,
  1分钟足矣。
  嗯很容易,百度搜一下几分钟google就可以把这个东西搜出来。
  有专门做这个的,如果你需要他们可以邮件你,价格不超过50块。
  匿名用户:谷歌搞,最好别用百度,
  xxx网是一个什么网站?现在开始抓取你的页面,找哪些关键词最适合做大词。保证不丢失域名。 查看全部

  c#抓取网页数据(c#抓取网页数据根据给的链接,找到相应的googleapi)
  c#抓取网页数据,根据给的链接,找到相应的googleapi。只需要几分钟。1.一个工作日吧。我记得我4月18号做这个完整版,花了50分钟。
  从你的问题来看你并不喜欢google你只是想恶心恶心百度那看我另一个问题的回答吧
  如果仅仅是想恶心恶心百度的话,本地安装/卸载火狐/360就可以了.如果你觉得其他大公司也恶心,觉得只是百度太渣了才有这些渣...买断制嘛,几块钱一个g,然后你就懂了.
  知乎开live也有这方面的内容。
  几分钟
  投放任何广告的前提是必须有用户访问,
  可以把域名注册到一个百度网站上面,然后在你要抓取的网站的关键词页面输入你的域名就可以开始抓取了。
  通过支付宝,你可以每天花几分钟进行这个过程。几毛钱就搞定了。
  请百度腾讯阿里搜狗
  5分钟,
  1分钟足矣。
  嗯很容易,百度搜一下几分钟google就可以把这个东西搜出来。
  有专门做这个的,如果你需要他们可以邮件你,价格不超过50块。
  匿名用户:谷歌搞,最好别用百度,
  xxx网是一个什么网站?现在开始抓取你的页面,找哪些关键词最适合做大词。保证不丢失域名。

c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2021-12-07 23:30 • 来自相关话题

  c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
  【转】基于C#.NET 2的高端智能网络爬虫
  这个故事的原因是携程网的一名技术经理。他说他会用自己超高的智商完美碾压爬虫开发者。作为一个业余爬虫开发爱好者,我当然不能发表这样的言论。忽略它。于是,最后一个基础爬虫和这个进阶爬虫开发教程就诞生了。
  
  有人在我上一篇文章中评论了简单爬虫:代码太简单了,太弱了。真是被这群有教养的孩子给震撼到了!我得猜你是不是携程的托儿。为什么在我写完之前就知道你很弱?好像不期待一点点的凶猛,是不会满足的!
  
  今天我们将学习高级爬虫的开发。同时,我们将使用简单的爬虫程序来实现分布式爬虫的Links Master部分,以提高分布式爬虫的效率。
  下面我们要讲的内容涉及到很多开源软件。不要太紧张,通常封装的越高级的东西就越好,只要你放轻松,综合使用,我首先假设你对以下工具有一定的了解:
  一、什么是高级爬虫?
  我们讲了很久的高级爬虫,通常是指它具有浏览器的运行特性,需要第三方库或工具的支持,比如以下常见的东西:
  很多人认为分布式爬虫可以算是高级爬虫。这绝对是错误的理解。分布式只是我们实现爬虫架构的一种手段,而不是定义它的高级因素。
  
  我们称它们为高级爬虫组件主要是因为它们不仅可以直接爬取网页源代码,还可以渲染网站页面的HTML、CSS、Javascript等内容。
  这样的功能对于爬虫的开发有什么好处呢?说到这个好处,就有点谦虚了,毫不夸张的说:这东西可以称得上是“攀登无敌”!!!
  
  我猜你还有这个表达式,因为它强大的机制,它可以让我们执行Javascript代码,触发各种鼠标和键盘事件,操纵页面的Dom结构,使用XPath语法抓取数据,几乎直接在网站 页面。做你可以在浏览器上做的一切。
  
  很多网站使用Ajax动态加载和翻页,比如携程的评论数据。如果之前使用简单的爬虫,很难直接抓取所有的评论数据。我们需要分析满天的Javascript代码才能找到API数据接口,时刻提防对方添加数据陷阱或者修改API接口。
  如果使用高级爬虫,完全可以忽略这些问题。无论他们如何加密Javascript代码隐藏API接口,最终的数据都必须呈现在网站页面的Dom结构中,否则普通用户是看不到的。到达。所以我们可以直接从Dom中提取数据,完全不用分析API数据接口,甚至不用写复杂的正则表达式。
  
  二、高级爬虫如何开发?
  现在我们要一步一步地实现这个高级爬虫。接下来,我们将利用目前正在蓬勃发展的两个组件来完成一个具有基本功能的高级爬虫。首先,我们将下载开源组件:
  
  PhantomJS:可以算是一个没有UI界面的浏览器。主要用于实现页面自动测试。我们使用它的页面解析功能进行网站内容爬取。下载解压后,将bin文件夹下的phantomjs.exe文件复制到你的爬虫项目下的任意文件夹中,我们只需要这个。
  下载链接:
  
  Selenium:是一个自动化的测试工具,封装了很多WebDriver与浏览器内核进行通信。我用开发语言调用它来实现PhantomJS的自动化操作。它的下载页面有很多东西,我们只需要Selenium Client,它支持多种语言(C#、JAVA、Ruby、Python、NodeJS),用你学习的语言下载即可。
  下载链接:
  这里我下载了C#语言客户端,将这4个DLL文件添加到项目引用中。其他语言的开发者请自行寻找方法,然后开始我们的编码之旅。
  
  老规矩,打开Visual Studio 2015新建一个控制台应用,添加一个简单的StrongCrawler类,因为这两个爬虫类有一个共同的部分,符合DRY的原则,需要重构部分代码,我们先提取一个 ICrawler 接口:
  
  然后我们使用StrongCrawler类来实现这个接口:
  
  然后我们编写它的异步爬虫方法:
  
  好了,这个高级爬虫的基本功能就定义好了。我们以携程的酒店数据为例进行爬取。让我们测试一下爬取(酒店名称、地址、评级、价格、评论数量、当前评论页数和评论旁边)。尝试使用详细数据,例如一个页码、评论页总数、每页评论数)。我们现在使用控制台程序来调用它:
  
  从上图可以看出,等待酒店页面加载后,我们通过XPath语法搜索页面元素,首先点击页面上的“酒店评论”按钮,然后等待页面的Dom结构更改,即等待Ajax加载成功,然后抓取需要的数据。看一下代码的执行结果:
  
  我们轻松地在酒店的第一页上抓取了酒店信息和所有评论数据。由于携程网的评论数据是通过ajax进行分页的,为了抓取所有评论,还抓取了评论页码等数据。我们来看看执行性能:
  
  不错,484 毫秒。可以说,在所有高级爬虫组件中,PhantomJS 的效率应该是最高的,几乎没有其他组件可以直接与之抗衡。有了页码数据,我们就可以对评论进行翻页抓取操作。在这个速度下,爬取数百页的评论数据不需要分发。
  三、如何实现分布式?
  分布式爬虫通常使用消息队列来实现。目前,网上有很多开源的消息队列。今天我们将介绍一个非常流行的分布式消息队列开源组件:
  
  RabbitMQ 是一个开源的 AMQP 实现。服务器采用Erlang语言编写,支持.NET、Python、Ruby、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等多种客户端,并支持AJAX。它用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现非常出色。
  下载链接:
  分布式爬虫通常需要两端:
  控制端主要负责控制爬虫运行、监控爬虫状态、配置爬虫抓取方式等,爬虫主机的作用是抓取数据,并将数据提交给数据清洗服务。
  爬虫端也需要分离Master爬虫和Worker爬虫。Master爬虫主要采用简单的爬虫操作方式来实现高性能的超链接。Worker 爬虫使用高级爬虫特性来采集 细化数据,例如 Ajax 加载的内容。给最合适的爬虫做你最擅长的事。
  聪明的你应该已经想到了它们之间的通信方式是消息队列。Master爬虫只需要把抓到的Links扔进数据抓包队列。Worker爬虫通过周期性的拉取队列中的Links来实现数据抓取,抓取完成后将数据提交到数据清洗队列。
  原理应该很清楚了吧?然后自己实现代码。RabbitMQ官网上有示例代码,这里不再赘述。
  四、如何实现一个稳定的加密代理?
  在这个互联网时代,免费的东西基本都在消失,即使存在也绝对是垃圾。所以今天要讲的Shadowsocks也是需要小费的东西。这东西的厉害之处在于,它的流量特征并不明显,而且可以提供非常稳定的上网代理。
  
  下载链接:
  Shadowsocks客户端会在本地启动一个socks5代理,通过这个代理的网络访问请求从客户端发送到服务器,服务器发送请求,然后将响应数据发送回客户端。中间使用AES-256加密传输数据,所以普通代理服务器肯定安全很多。我们来看看它的运行模式:
  
  如图所示,需要在本地运行客户端程序,并连接到远程代理服务器的服务端程序,实现加密通信。然后在本地模拟代理端口,让本地流量由本地客户端加密,然后传输到远程服务器,完成代理转发服务。
  因此,我们只需要购买一台基于Linux的VPS服务器,费用大约15元/月,安装服务器后,可以实现非常稳定的加密代理服务。网上有很多相关的教材,这里就不啰嗦了。
  五、结论
  由于一些压力,我不会在这里发布详细的爬虫源代码。看上面的例子,我绝对可以自己完成一个更强大的高级爬虫。完整源代码下载: 查看全部

  c#抓取网页数据(基于C#.NET的高端智能化网络爬虫2本篇故事的起因)
  【转】基于C#.NET 2的高端智能网络爬虫
  这个故事的原因是携程网的一名技术经理。他说他会用自己超高的智商完美碾压爬虫开发者。作为一个业余爬虫开发爱好者,我当然不能发表这样的言论。忽略它。于是,最后一个基础爬虫和这个进阶爬虫开发教程就诞生了。
  
  有人在我上一篇文章中评论了简单爬虫:代码太简单了,太弱了。真是被这群有教养的孩子给震撼到了!我得猜你是不是携程的托儿。为什么在我写完之前就知道你很弱?好像不期待一点点的凶猛,是不会满足的!
  
  今天我们将学习高级爬虫的开发。同时,我们将使用简单的爬虫程序来实现分布式爬虫的Links Master部分,以提高分布式爬虫的效率。
  下面我们要讲的内容涉及到很多开源软件。不要太紧张,通常封装的越高级的东西就越好,只要你放轻松,综合使用,我首先假设你对以下工具有一定的了解:
  一、什么是高级爬虫?
  我们讲了很久的高级爬虫,通常是指它具有浏览器的运行特性,需要第三方库或工具的支持,比如以下常见的东西:
  很多人认为分布式爬虫可以算是高级爬虫。这绝对是错误的理解。分布式只是我们实现爬虫架构的一种手段,而不是定义它的高级因素。
  
  我们称它们为高级爬虫组件主要是因为它们不仅可以直接爬取网页源代码,还可以渲染网站页面的HTML、CSS、Javascript等内容。
  这样的功能对于爬虫的开发有什么好处呢?说到这个好处,就有点谦虚了,毫不夸张的说:这东西可以称得上是“攀登无敌”!!!
  
  我猜你还有这个表达式,因为它强大的机制,它可以让我们执行Javascript代码,触发各种鼠标和键盘事件,操纵页面的Dom结构,使用XPath语法抓取数据,几乎直接在网站 页面。做你可以在浏览器上做的一切。
  
  很多网站使用Ajax动态加载和翻页,比如携程的评论数据。如果之前使用简单的爬虫,很难直接抓取所有的评论数据。我们需要分析满天的Javascript代码才能找到API数据接口,时刻提防对方添加数据陷阱或者修改API接口。
  如果使用高级爬虫,完全可以忽略这些问题。无论他们如何加密Javascript代码隐藏API接口,最终的数据都必须呈现在网站页面的Dom结构中,否则普通用户是看不到的。到达。所以我们可以直接从Dom中提取数据,完全不用分析API数据接口,甚至不用写复杂的正则表达式。
  
  二、高级爬虫如何开发?
  现在我们要一步一步地实现这个高级爬虫。接下来,我们将利用目前正在蓬勃发展的两个组件来完成一个具有基本功能的高级爬虫。首先,我们将下载开源组件:
  
  PhantomJS:可以算是一个没有UI界面的浏览器。主要用于实现页面自动测试。我们使用它的页面解析功能进行网站内容爬取。下载解压后,将bin文件夹下的phantomjs.exe文件复制到你的爬虫项目下的任意文件夹中,我们只需要这个。
  下载链接:
  
  Selenium:是一个自动化的测试工具,封装了很多WebDriver与浏览器内核进行通信。我用开发语言调用它来实现PhantomJS的自动化操作。它的下载页面有很多东西,我们只需要Selenium Client,它支持多种语言(C#、JAVA、Ruby、Python、NodeJS),用你学习的语言下载即可。
  下载链接:
  这里我下载了C#语言客户端,将这4个DLL文件添加到项目引用中。其他语言的开发者请自行寻找方法,然后开始我们的编码之旅。
  
  老规矩,打开Visual Studio 2015新建一个控制台应用,添加一个简单的StrongCrawler类,因为这两个爬虫类有一个共同的部分,符合DRY的原则,需要重构部分代码,我们先提取一个 ICrawler 接口:
  
  然后我们使用StrongCrawler类来实现这个接口:
  
  然后我们编写它的异步爬虫方法:
  
  好了,这个高级爬虫的基本功能就定义好了。我们以携程的酒店数据为例进行爬取。让我们测试一下爬取(酒店名称、地址、评级、价格、评论数量、当前评论页数和评论旁边)。尝试使用详细数据,例如一个页码、评论页总数、每页评论数)。我们现在使用控制台程序来调用它:
  
  从上图可以看出,等待酒店页面加载后,我们通过XPath语法搜索页面元素,首先点击页面上的“酒店评论”按钮,然后等待页面的Dom结构更改,即等待Ajax加载成功,然后抓取需要的数据。看一下代码的执行结果:
  
  我们轻松地在酒店的第一页上抓取了酒店信息和所有评论数据。由于携程网的评论数据是通过ajax进行分页的,为了抓取所有评论,还抓取了评论页码等数据。我们来看看执行性能:
  
  不错,484 毫秒。可以说,在所有高级爬虫组件中,PhantomJS 的效率应该是最高的,几乎没有其他组件可以直接与之抗衡。有了页码数据,我们就可以对评论进行翻页抓取操作。在这个速度下,爬取数百页的评论数据不需要分发。
  三、如何实现分布式?
  分布式爬虫通常使用消息队列来实现。目前,网上有很多开源的消息队列。今天我们将介绍一个非常流行的分布式消息队列开源组件:
  
  RabbitMQ 是一个开源的 AMQP 实现。服务器采用Erlang语言编写,支持.NET、Python、Ruby、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等多种客户端,并支持AJAX。它用于在分布式系统中存储和转发消息,在易用性、可扩展性和高可用性方面表现非常出色。
  下载链接:
  分布式爬虫通常需要两端:
  控制端主要负责控制爬虫运行、监控爬虫状态、配置爬虫抓取方式等,爬虫主机的作用是抓取数据,并将数据提交给数据清洗服务。
  爬虫端也需要分离Master爬虫和Worker爬虫。Master爬虫主要采用简单的爬虫操作方式来实现高性能的超链接。Worker 爬虫使用高级爬虫特性来采集 细化数据,例如 Ajax 加载的内容。给最合适的爬虫做你最擅长的事。
  聪明的你应该已经想到了它们之间的通信方式是消息队列。Master爬虫只需要把抓到的Links扔进数据抓包队列。Worker爬虫通过周期性的拉取队列中的Links来实现数据抓取,抓取完成后将数据提交到数据清洗队列。
  原理应该很清楚了吧?然后自己实现代码。RabbitMQ官网上有示例代码,这里不再赘述。
  四、如何实现一个稳定的加密代理?
  在这个互联网时代,免费的东西基本都在消失,即使存在也绝对是垃圾。所以今天要讲的Shadowsocks也是需要小费的东西。这东西的厉害之处在于,它的流量特征并不明显,而且可以提供非常稳定的上网代理。
  
  下载链接:
  Shadowsocks客户端会在本地启动一个socks5代理,通过这个代理的网络访问请求从客户端发送到服务器,服务器发送请求,然后将响应数据发送回客户端。中间使用AES-256加密传输数据,所以普通代理服务器肯定安全很多。我们来看看它的运行模式:
  
  如图所示,需要在本地运行客户端程序,并连接到远程代理服务器的服务端程序,实现加密通信。然后在本地模拟代理端口,让本地流量由本地客户端加密,然后传输到远程服务器,完成代理转发服务。
  因此,我们只需要购买一台基于Linux的VPS服务器,费用大约15元/月,安装服务器后,可以实现非常稳定的加密代理服务。网上有很多相关的教材,这里就不啰嗦了。
  五、结论
  由于一些压力,我不会在这里发布详细的爬虫源代码。看上面的例子,我绝对可以自己完成一个更强大的高级爬虫。完整源代码下载:

c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)

网站优化优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2021-12-07 23:28 • 来自相关话题

  c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)
  【DotnetSpider系列目录】我们为什么要造轮子
  同学们可以去各大招聘网站查看爬虫工程师的要求,大部分招聘JAVA、PYTHON,甚至NODEJS、C++;或者去开源中国查询C#爬虫项目,只有几个非常Simple或者几年没更新的项目。
  与JAVA相比,纯性能方面,PYTHON并不处于劣势,而是在开发上具有优势(得益于世界上最强大的IDE)。爬虫性能瓶颈多在并发下载(网速)和IP池,为什么.NET没有强大的爬虫框架?老实说,我不知道。可能爬虫框架的核心比较简单,或者.NET的开发者没有其他语言的开发者勤奋,或者.NET的开源氛围没有其他语言的高。直到.NET即将发布开源版本的消息传出,我觉得是时候开发一个跨平台、跨语言的爬虫框架了。但一开始,我还挺紧张的。我觉得我还不够好,无法完全重新设计一个新框架。于是参考了JAVA的轻量级爬虫框架webmagic,加上自己的理解和改进。设计或文笔不好请指正海涵
  框架设计
  由于我指的是webmagic,所以整体架构没有大的变化。设计图如下(图片直接来自webmagic)
  
  基本使用
  基本使用只需要引用DotnetSpider2.Core(Nuget中获取)
  DotnetSpider 需要 4 个模块来实现一个完整的爬虫:Scheduler、Downloader、PageProcessor 和 Pipeline。由于Downloader和Scheduler都有基本的实现,所以只需要实现PageProcessor和Pipeline就可以实现一个基本的爬虫。这种方式也是最自由的方式。
  完整定制示例如下:
  
   public static void Main(string[] args)
{
// Custmize processor and pipeline 完全自定义页面解析和数据管道
CustmizeProcessorAndPipeline();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
  
  
   public static void CustmizeProcessorAndPipeline()
{
// Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
for (int i = 1; i < 5; ++i)
{
// Add start/feed urls. 添加初始采集链接
site.AddStartUrl($"http://list.youku.com/category ... _1_p_{i}.html");
}
Spider spider = Spider.Create(site,
// use memoery queue scheduler. 使用内存调度
new QueueDuplicateRemovedScheduler(),
// use custmize processor for youku 为优酷自定义的 Processor
new YoukuPageProcessor())
// use custmize pipeline for youku 为优酷自定义的 Pipeline
.AddPipeline(new YoukuPipeline());
spider.Downloader = new HttpClientDownloader();
spider.ThreadNum = 1;
spider.EmptySleepTime = 3000;
// Start crawler 启动爬虫
spider.Run();
}
public class YoukuPipeline : BasePipeline
{
private static long count = 0;
public override void Process(params ResultItems[] resultItems)
{
foreach (var resultItem in resultItems)
{
StringBuilder builder = new StringBuilder();
foreach (YoukuVideo entry in resultItem.Results["VideoResult"])
{
count++;
builder.Append($" [YoukuVideo {count}] {entry.Name}");
}
Console.WriteLine(builder);
}
// Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
}
}
public class YoukuPageProcessor : BasePageProcessor
{
protected override void Handle(Page page)
{
// 利用 Selectable 查询并构造自己想要的数据对象
var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
List results = new List();
foreach (var videoElement in totalVideoElements)
{
var video = new YoukuVideo();
video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
results.Add(video);
}
// Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
page.AddResultItem("VideoResult", results);
// Add target requests to scheduler. 解析需要采集的URL
//foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes())
//{
// page.AddTargetRequest(new Request(url.GetValue(), null));
//}
}
}
public class YoukuVideo
{
public string Name { get; set; }
}
  
  个人资料爬虫
  配置爬虫需要额外参考DotnetSpider2.Extension(Nuget中获取)
  在大多数情况下,只需要一个配置文件来实现一个 采集 任务。配置爬虫与基本用法相比,只需要几行代码就可以实现一个爬虫。但凡事有利有弊,配置爬取的自由度比较低。
  使用配置文件爬虫的步骤如下:
  定义数据实体类,通过添加Attribute来定义数据存储规则,通过页面数据的解析规则定义爬虫任务的定义,继承EntitySpider在Main方法中实例化定义的爬虫任务,并调用运行方法
  完整代码如下,自己感受一下,后面的章节会详细介绍如何实现:
  
   public class JdSkuSampleSpider : EntitySpider
{
public JdSkuSampleSpider() : base("JdSkuSample", new Site
{
//HttpProxyPool = new HttpProxyPool(new KuaidailiProxySupplier("快代理API"))
})
{
}
protected override void MyInit(params string[] arguments)
{
Identity = Identity ?? "JD SKU SAMPLE";
ThreadNum = 1;
// dowload html by http client
Downloader = new HttpClientDownloader();
// storage data to mysql, default is mysql entity pipeline, so you can comment this line. Don't miss sslmode.
AddPipeline(new MySqlEntityPipeline("Database='mysql';Data Source=localhost;User ID=root;Password=;Port=3306;SslMode=None;"));
AddStartUrl("http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main", new Dictionary { { "name", "手机" }, { "cat3", "655" } });
AddEntityType();
}
[EntityTable("test", "jd_sku", EntityTable.Monday, Indexs = new[] { "Category" }, Uniques = new[] { "Category,Sku", "Sku" })]
[EntitySelector(Expression = "//li[@class='gl-item']/div[contains(@class,'j-sku-item')]")]
[TargetUrlsSelector(XPaths = new[] { "//span[@class=\"p-num\"]" }, Patterns = new[] { @"&page=[0-9]+&" })]
public class Product : SpiderEntity
{
[PropertyDefine(Expression = "./@data-sku", Length = 100)]
public string Sku { get; set; }
[PropertyDefine(Expression = "name", Type = SelectorType.Enviroment, Length = 100)]
public string Category { get; set; }
[PropertyDefine(Expression = "cat3", Type = SelectorType.Enviroment)]
public int CategoryId { get; set; }
[PropertyDefine(Expression = "./div[1]/a/@href")]
public string Url { get; set; }
[PropertyDefine(Expression = "./div[5]/strong/a")]
public long CommentsCount { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-shop']/@data-shop_name", Length = 100)]
public string ShopName { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-name']/a/em", Length = 100)]
public string Name { get; set; }
[PropertyDefine(Expression = "./@venderid", Length = 100)]
public string VenderId { get; set; }
[PropertyDefine(Expression = "./@jdzy_shop_id", Length = 100)]
public string JdzyShopId { get; set; }
[PropertyDefine(Expression = "Monday", Type = SelectorType.Enviroment)]
public DateTime RunId { get; set; }
}
}
  
  
  public class Program
{
public static void Main(string[] args)
{
JdSkuSampleSpider spider = new JdSkuSampleSpider();
spider.Run();
}
}
  
  代码地址
  希望大家加星:) 查看全部

  c#抓取网页数据([DotnetSpider系列目录]为什么要造轮子同学们可以去各大招聘)
  【DotnetSpider系列目录】我们为什么要造轮子
  同学们可以去各大招聘网站查看爬虫工程师的要求,大部分招聘JAVA、PYTHON,甚至NODEJS、C++;或者去开源中国查询C#爬虫项目,只有几个非常Simple或者几年没更新的项目。
  与JAVA相比,纯性能方面,PYTHON并不处于劣势,而是在开发上具有优势(得益于世界上最强大的IDE)。爬虫性能瓶颈多在并发下载(网速)和IP池,为什么.NET没有强大的爬虫框架?老实说,我不知道。可能爬虫框架的核心比较简单,或者.NET的开发者没有其他语言的开发者勤奋,或者.NET的开源氛围没有其他语言的高。直到.NET即将发布开源版本的消息传出,我觉得是时候开发一个跨平台、跨语言的爬虫框架了。但一开始,我还挺紧张的。我觉得我还不够好,无法完全重新设计一个新框架。于是参考了JAVA的轻量级爬虫框架webmagic,加上自己的理解和改进。设计或文笔不好请指正海涵
  框架设计
  由于我指的是webmagic,所以整体架构没有大的变化。设计图如下(图片直接来自webmagic)
  
  基本使用
  基本使用只需要引用DotnetSpider2.Core(Nuget中获取)
  DotnetSpider 需要 4 个模块来实现一个完整的爬虫:Scheduler、Downloader、PageProcessor 和 Pipeline。由于Downloader和Scheduler都有基本的实现,所以只需要实现PageProcessor和Pipeline就可以实现一个基本的爬虫。这种方式也是最自由的方式。
  完整定制示例如下:
  
   public static void Main(string[] args)
{
// Custmize processor and pipeline 完全自定义页面解析和数据管道
CustmizeProcessorAndPipeline();
Console.WriteLine("Press any key to continue...");
Console.Read();
}
  
  
   public static void CustmizeProcessorAndPipeline()
{
// Config encoding, header, cookie, proxy etc... 定义采集的 Site 对象, 设置 Header、Cookie、代理等
var site = new Site { EncodingName = "UTF-8", RemoveOutboundLinks = true };
for (int i = 1; i < 5; ++i)
{
// Add start/feed urls. 添加初始采集链接
site.AddStartUrl($"http://list.youku.com/category ... _1_p_{i}.html");
}
Spider spider = Spider.Create(site,
// use memoery queue scheduler. 使用内存调度
new QueueDuplicateRemovedScheduler(),
// use custmize processor for youku 为优酷自定义的 Processor
new YoukuPageProcessor())
// use custmize pipeline for youku 为优酷自定义的 Pipeline
.AddPipeline(new YoukuPipeline());
spider.Downloader = new HttpClientDownloader();
spider.ThreadNum = 1;
spider.EmptySleepTime = 3000;
// Start crawler 启动爬虫
spider.Run();
}
public class YoukuPipeline : BasePipeline
{
private static long count = 0;
public override void Process(params ResultItems[] resultItems)
{
foreach (var resultItem in resultItems)
{
StringBuilder builder = new StringBuilder();
foreach (YoukuVideo entry in resultItem.Results["VideoResult"])
{
count++;
builder.Append($" [YoukuVideo {count}] {entry.Name}");
}
Console.WriteLine(builder);
}
// Other actions like save data to DB. 可以自由实现插入数据库或保存到文件
}
}
public class YoukuPageProcessor : BasePageProcessor
{
protected override void Handle(Page page)
{
// 利用 Selectable 查询并构造自己想要的数据对象
var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-pack pack-film']")).Nodes();
List results = new List();
foreach (var videoElement in totalVideoElements)
{
var video = new YoukuVideo();
video.Name = videoElement.Select(Selectors.XPath(".//img[@class='quic']/@alt")).GetValue();
results.Add(video);
}
// Save data object by key. 以自定义KEY存入page对象中供Pipeline调用
page.AddResultItem("VideoResult", results);
// Add target requests to scheduler. 解析需要采集的URL
//foreach (var url in page.Selectable.SelectList(Selectors.XPath("//ul[@class='yk-pages']")).Links().Nodes())
//{
// page.AddTargetRequest(new Request(url.GetValue(), null));
//}
}
}
public class YoukuVideo
{
public string Name { get; set; }
}
  
  个人资料爬虫
  配置爬虫需要额外参考DotnetSpider2.Extension(Nuget中获取)
  在大多数情况下,只需要一个配置文件来实现一个 采集 任务。配置爬虫与基本用法相比,只需要几行代码就可以实现一个爬虫。但凡事有利有弊,配置爬取的自由度比较低。
  使用配置文件爬虫的步骤如下:
  定义数据实体类,通过添加Attribute来定义数据存储规则,通过页面数据的解析规则定义爬虫任务的定义,继承EntitySpider在Main方法中实例化定义的爬虫任务,并调用运行方法
  完整代码如下,自己感受一下,后面的章节会详细介绍如何实现:
  
   public class JdSkuSampleSpider : EntitySpider
{
public JdSkuSampleSpider() : base("JdSkuSample", new Site
{
//HttpProxyPool = new HttpProxyPool(new KuaidailiProxySupplier("快代理API"))
})
{
}
protected override void MyInit(params string[] arguments)
{
Identity = Identity ?? "JD SKU SAMPLE";
ThreadNum = 1;
// dowload html by http client
Downloader = new HttpClientDownloader();
// storage data to mysql, default is mysql entity pipeline, so you can comment this line. Don't miss sslmode.
AddPipeline(new MySqlEntityPipeline("Database='mysql';Data Source=localhost;User ID=root;Password=;Port=3306;SslMode=None;"));
AddStartUrl("http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main", new Dictionary { { "name", "手机" }, { "cat3", "655" } });
AddEntityType();
}
[EntityTable("test", "jd_sku", EntityTable.Monday, Indexs = new[] { "Category" }, Uniques = new[] { "Category,Sku", "Sku" })]
[EntitySelector(Expression = "//li[@class='gl-item']/div[contains(@class,'j-sku-item')]")]
[TargetUrlsSelector(XPaths = new[] { "//span[@class=\"p-num\"]" }, Patterns = new[] { @"&page=[0-9]+&" })]
public class Product : SpiderEntity
{
[PropertyDefine(Expression = "./@data-sku", Length = 100)]
public string Sku { get; set; }
[PropertyDefine(Expression = "name", Type = SelectorType.Enviroment, Length = 100)]
public string Category { get; set; }
[PropertyDefine(Expression = "cat3", Type = SelectorType.Enviroment)]
public int CategoryId { get; set; }
[PropertyDefine(Expression = "./div[1]/a/@href")]
public string Url { get; set; }
[PropertyDefine(Expression = "./div[5]/strong/a")]
public long CommentsCount { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-shop']/@data-shop_name", Length = 100)]
public string ShopName { get; set; }
[PropertyDefine(Expression = ".//div[@class='p-name']/a/em", Length = 100)]
public string Name { get; set; }
[PropertyDefine(Expression = "./@venderid", Length = 100)]
public string VenderId { get; set; }
[PropertyDefine(Expression = "./@jdzy_shop_id", Length = 100)]
public string JdzyShopId { get; set; }
[PropertyDefine(Expression = "Monday", Type = SelectorType.Enviroment)]
public DateTime RunId { get; set; }
}
}
  
  
  public class Program
{
public static void Main(string[] args)
{
JdSkuSampleSpider spider = new JdSkuSampleSpider();
spider.Run();
}
}
  
  代码地址
  希望大家加星:)

c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-12-02 08:03 • 来自相关话题

  c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)
  c#抓取网页数据,可以通过这个post请求来实现,通过zxing可以统计所有项目的打开时间,某些项目的进入时间等信息。
  按是否压缩进行分类,可以分为以下几种:1,压缩。只保留源代码中的c++部分。2,解压缩。不保留源代码中的c++部分,但只保留关键字。3,二进制。包含所有的c++文件。4,blob。不包含关键字。ps:if的update是对于普通读写取的情况下的,对于单例读写在writeaccess时会执行,sendinterval中读取或postinterval时不会执行。
  blob,binary,二进制。
  除了blob和二进制外,还有blazing,
  file。
  内网/可以直接做成web页面,也可以转成bson做成数据库存储。可以是分布式的,也可以是集中化的。现在在用go,
  如果可以的话,数据库的分页,或者类似于redis里面的list,按照条件排序都可以实现,
  blob格式的内存数据比对方便,有些项目很久没有运行了,估计上层应用是运行中的。
  说下我的情况。上线时间长的项目,更多是对代码实现的修改,推荐使用blob数据,这样可以提供更多的数据保留时间,或者达到二进制的读取速度。大多数项目还是推荐notability的getoutput.buffers这个包。不是特别变态的需求可以不用使用blob。 查看全部

  c#抓取网页数据(c#抓取网页数据,可以统计所有项目的进入时间等信息)
  c#抓取网页数据,可以通过这个post请求来实现,通过zxing可以统计所有项目的打开时间,某些项目的进入时间等信息。
  按是否压缩进行分类,可以分为以下几种:1,压缩。只保留源代码中的c++部分。2,解压缩。不保留源代码中的c++部分,但只保留关键字。3,二进制。包含所有的c++文件。4,blob。不包含关键字。ps:if的update是对于普通读写取的情况下的,对于单例读写在writeaccess时会执行,sendinterval中读取或postinterval时不会执行。
  blob,binary,二进制。
  除了blob和二进制外,还有blazing,
  file。
  内网/可以直接做成web页面,也可以转成bson做成数据库存储。可以是分布式的,也可以是集中化的。现在在用go,
  如果可以的话,数据库的分页,或者类似于redis里面的list,按照条件排序都可以实现,
  blob格式的内存数据比对方便,有些项目很久没有运行了,估计上层应用是运行中的。
  说下我的情况。上线时间长的项目,更多是对代码实现的修改,推荐使用blob数据,这样可以提供更多的数据保留时间,或者达到二进制的读取速度。大多数项目还是推荐notability的getoutput.buffers这个包。不是特别变态的需求可以不用使用blob。

c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2021-11-30 03:19 • 来自相关话题

  c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)
  描述:C#编写的多线程异步网络爬虫控制台程序。功能:目前只能提取网络链接,使用的两个记录文件不需要很大。暂时无法抓取网页文字、图片、视频和html代码,敬请谅解。但是需要注意的是,网页的数量非常多。下面的代码理论上可以捕获整个Internet网页链接。但实际上,由于处理器功能和网络条件(主要是网速)的限制,一般家用电脑最多可以处理12个线程的爬虫任务,爬虫速度是有限的。它可以爬行,但需要时间和耐心。当然,这个程序可以捕获所有链接,因为链接不占用太多系统空间,并且借助日志文件,可以将爬取的网页数量堆积起来,甚至可以访问所有互联网网络链接,当然最好是分批进行。建议将maxNum设置为500-1000左右,慢慢积累。另外,由于是控制台程序,有时显示的字符过多,系统会暂停显示。这时候,只需点击控制台并按回车键即可。当程序暂停时,您可以按 Enter 尝试。/// 要使用这个程序,请确保已经创建了相应的记录文件。为简化代码,本程序不够健壮,请见谅。/// 默认文件创建在E盘根目录下的两个文本文件,“待抓取的网址.txt”和“待抓取的网址.txt”。这两个文件需要用户自己创建,注意不要带后缀。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。 查看全部

  c#抓取网页数据(C#编写的多线程异步抓取网页的网络爬虫控制台程序功能)
  描述:C#编写的多线程异步网络爬虫控制台程序。功能:目前只能提取网络链接,使用的两个记录文件不需要很大。暂时无法抓取网页文字、图片、视频和html代码,敬请谅解。但是需要注意的是,网页的数量非常多。下面的代码理论上可以捕获整个Internet网页链接。但实际上,由于处理器功能和网络条件(主要是网速)的限制,一般家用电脑最多可以处理12个线程的爬虫任务,爬虫速度是有限的。它可以爬行,但需要时间和耐心。当然,这个程序可以捕获所有链接,因为链接不占用太多系统空间,并且借助日志文件,可以将爬取的网页数量堆积起来,甚至可以访问所有互联网网络链接,当然最好是分批进行。建议将maxNum设置为500-1000左右,慢慢积累。另外,由于是控制台程序,有时显示的字符过多,系统会暂停显示。这时候,只需点击控制台并按回车键即可。当程序暂停时,您可以按 Enter 尝试。/// 要使用这个程序,请确保已经创建了相应的记录文件。为简化代码,本程序不够健壮,请见谅。/// 默认文件创建在E盘根目录下的两个文本文件,“待抓取的网址.txt”和“待抓取的网址.txt”。这两个文件需要用户自己创建,注意不要带后缀。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。犯了一个错误。这两个文件中的链接基本上都是有效链接,可以分开处理。这个爬虫程序的速度如下:10个线程最快,大约每分钟500个链接,6-8个线程最快,每分钟大约400-500个链接,2-4个线程最快,大约200-400个每分钟链接数,最快的单线程大概是每分钟70-100个链接被多线程异步爬取,完全是出于效率的考虑。本程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。每分钟约500个链接,6-8个线程最快,约400-500个链接/分钟,2-4个线程最快,约200-400个链接/分钟,最快单线程约70-100的原因用多线程异步每分钟爬取链接完全是出于效率考虑。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。这个程序的多线程同步并没有带来速度的提升,只要爬取的网页不是太重复和冗余即可。异步并不意味着错误。

c#抓取网页数据( 类的代码:2016年10月26日(周四) )

网站优化优采云 发表了文章 • 0 个评论 • 47 次浏览 • 2021-11-28 19:16 • 来自相关话题

  c#抓取网页数据(
类的代码:2016年10月26日(周四)
)
  正则表达式相关:C#抓取网页类(获取网页中的所有信息)
  课程代码:
<p> 1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Net;
5 using System.IO;
6 using System.Text;
7 using System.Collections.Generic;
8 using System.Text.RegularExpressions;
9 using System.Threading;
10 using System.Web;
11 using System.Web.UI.MobileControls;
12 ///
13 /// 网页类
14 ///
15 public class WebPage
16 {
17 #region 私有成员
18 private Uri m_uri; //url
19 private List m_links; //此网页上的链接
20 private string m_title; //标题
21 private string m_html; //HTML代码
22 private string m_outstr; //网页可输出的纯文本
23 private bool m_good; //网页是否可用
24 private int m_pagesize; //网页的大小
25 private static Dictionary webcookies = new Dictionary();//存放所有网页的Cookie
26
27 #endregion
28
29 #region 属性
30
31 ///
32 /// 通过此属性可获得本网页的网址,只读
33 ///
34 public string URL
35 {
36 get
37 {
38 return m_uri.AbsoluteUri;
39 }
40 }
41
42 ///
43 /// 通过此属性可获得本网页的标题,只读
44 ///
45 public string Title
46 {
47 get
48 {
49 if (m_title == "")
50 {
51 Regex reg = new Regex(@"(?m)]*>(?(?:\w|\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
52 Match mc = reg.Match(m_html);
53 if (mc.Success)
54 m_title = mc.Groups["title"].Value.Trim();
55 }
56 return m_title;
57 }
58 }
59 public string M_html
60 {
61 get
62 {
63 if (m_html == null)
64 {
65 m_html = "";
66 }
67 return m_html;
68 }
69 }
70 ///
71 /// 此属性获得本网页的所有链接信息,只读
72 ///
73 public List Links
74 {
75 get
76 {
77 if (m_links.Count == 0) getLinks();
78 return m_links;
79 }
80 }
81
82
83 ///
84 /// 此属性返回本网页的全部纯文本信息,只读
85 ///
86 public string Context
87 {
88 get
89 {
90 if (m_outstr == "") getContext(Int16.MaxValue);
91 return m_outstr;
92 }
93 }
94
95 ///
96 /// 此属性获得本网页的大小
97 ///
98 public int PageSize
99 {
100 get
101 {
102 return m_pagesize;
103 }
104 }
105 ///
106 /// 此属性获得本网页的所有站内链接
107 ///
108 public List InsiteLinks
109 {
110 get
111 {
112 return getSpecialLinksByUrl("^http://" + m_uri.Host, Int16.MaxValue);
113 }
114 }
115
116 ///
117 /// 此属性表示本网页是否可用
118 ///
119 public bool IsGood
120 {
121 get
122 {
123 return m_good;
124 }
125 }
126 ///
127 /// 此属性表示网页的所在的网站
128 ///
129 public string Host
130 {
131 get
132 {
133 return m_uri.Host;
134 }
135 }
136 #endregion
137
138
139 ///
140 /// 从HTML代码中分析出链接信息
141 ///
142 /// List
143 private List getLinks()
144 {
145 if (m_links.Count == 0)
146 {
147 Regex[] regex = new Regex[2];
148 regex[0] = new Regex(@"(?[^]*>", RegexOptions.IgnoreCase);
150
151 for (int i = 0; i < 2; i++)
152 {
153 Match match = regex[i].Match(m_html);
154 while (match.Success)
155 {
156 try
157 {
158 string url = HttpUtility.UrlDecode(new Uri(m_uri, match.Groups["URL"].Value).AbsoluteUri);
159
160 string text = "";
161 if (i == 0) text = new Regex("(]+>)|(\\s)|( )|&|\"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");
162
163 Link link = new Link();
164 link.Text = text;
165 link.NavigateUrl = url;
166
167 m_links.Add(link);
168 }
169 catch (Exception ex) { Console.WriteLine(ex.Message); };
170 match = match.NextMatch();
171 }
172 }
173 }
174 return m_links;
175 }
176 ///
177 /// 此私有方法从一段HTML文本中提取出一定字数的纯文本
178 ///
179 /// HTML代码
180 /// 提取从头数多少个字
181 /// 是否要链接里面的字
182 /// 纯文本
183 private string getFirstNchar(string instr, int firstN, bool withLink)
184 {
185 if (m_outstr == "")
186 {
187 m_outstr = instr.Clone() as string;
188 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
189 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
190 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
191 if (!withLink) m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
192 Regex objReg = new System.Text.RegularExpressions.Regex("(]+?>)| ", RegexOptions.Multiline | RegexOptions.IgnoreCase);
193 m_outstr = objReg.Replace(m_outstr, "");
194 Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
195 m_outstr = objReg2.Replace(m_outstr, " ");
196
197 }
198 return m_outstr.Length > firstN ? m_outstr.Substring(0, firstN) : m_outstr;
199 }
200
201
202 #region 公有文法
203 ///
204 /// 此公有方法提取网页中一定字数的纯文本,包括链接文字
205 ///
206 /// 字数
207 ///
208 public string getContext(int firstN)
209 {
210 return getFirstNchar(m_html, firstN, true);
211 }
212
213 ///
214 /// 此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式
215 ///
216 /// 正则式
217 /// 返回的链接的个数
218 /// List
219 public List getSpecialLinksByUrl(string pattern, int count)
220 {
221 if (m_links.Count == 0) getLinks();
222 List SpecialLinks = new List();
223 List.Enumerator i;
224 i = m_links.GetEnumerator();
225 int cnt = 0;
226 while (i.MoveNext() && cnt 1 查看全部

  c#抓取网页数据(
类的代码:2016年10月26日(周四)
)
  正则表达式相关:C#抓取网页类(获取网页中的所有信息)
  课程代码:
<p> 1 using System;
2 using System.Data;
3 using System.Configuration;
4 using System.Net;
5 using System.IO;
6 using System.Text;
7 using System.Collections.Generic;
8 using System.Text.RegularExpressions;
9 using System.Threading;
10 using System.Web;
11 using System.Web.UI.MobileControls;
12 ///
13 /// 网页类
14 ///
15 public class WebPage
16 {
17 #region 私有成员
18 private Uri m_uri; //url
19 private List m_links; //此网页上的链接
20 private string m_title; //标题
21 private string m_html; //HTML代码
22 private string m_outstr; //网页可输出的纯文本
23 private bool m_good; //网页是否可用
24 private int m_pagesize; //网页的大小
25 private static Dictionary webcookies = new Dictionary();//存放所有网页的Cookie
26
27 #endregion
28
29 #region 属性
30
31 ///
32 /// 通过此属性可获得本网页的网址,只读
33 ///
34 public string URL
35 {
36 get
37 {
38 return m_uri.AbsoluteUri;
39 }
40 }
41
42 ///
43 /// 通过此属性可获得本网页的标题,只读
44 ///
45 public string Title
46 {
47 get
48 {
49 if (m_title == "")
50 {
51 Regex reg = new Regex(@"(?m)]*>(?(?:\w|\W)*?)]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
52 Match mc = reg.Match(m_html);
53 if (mc.Success)
54 m_title = mc.Groups["title"].Value.Trim();
55 }
56 return m_title;
57 }
58 }
59 public string M_html
60 {
61 get
62 {
63 if (m_html == null)
64 {
65 m_html = "";
66 }
67 return m_html;
68 }
69 }
70 ///
71 /// 此属性获得本网页的所有链接信息,只读
72 ///
73 public List Links
74 {
75 get
76 {
77 if (m_links.Count == 0) getLinks();
78 return m_links;
79 }
80 }
81
82
83 ///
84 /// 此属性返回本网页的全部纯文本信息,只读
85 ///
86 public string Context
87 {
88 get
89 {
90 if (m_outstr == "") getContext(Int16.MaxValue);
91 return m_outstr;
92 }
93 }
94
95 ///
96 /// 此属性获得本网页的大小
97 ///
98 public int PageSize
99 {
100 get
101 {
102 return m_pagesize;
103 }
104 }
105 ///
106 /// 此属性获得本网页的所有站内链接
107 ///
108 public List InsiteLinks
109 {
110 get
111 {
112 return getSpecialLinksByUrl("^http://" + m_uri.Host, Int16.MaxValue);
113 }
114 }
115
116 ///
117 /// 此属性表示本网页是否可用
118 ///
119 public bool IsGood
120 {
121 get
122 {
123 return m_good;
124 }
125 }
126 ///
127 /// 此属性表示网页的所在的网站
128 ///
129 public string Host
130 {
131 get
132 {
133 return m_uri.Host;
134 }
135 }
136 #endregion
137
138
139 ///
140 /// 从HTML代码中分析出链接信息
141 ///
142 /// List
143 private List getLinks()
144 {
145 if (m_links.Count == 0)
146 {
147 Regex[] regex = new Regex[2];
148 regex[0] = new Regex(@"(?[^]*>", RegexOptions.IgnoreCase);
150
151 for (int i = 0; i < 2; i++)
152 {
153 Match match = regex[i].Match(m_html);
154 while (match.Success)
155 {
156 try
157 {
158 string url = HttpUtility.UrlDecode(new Uri(m_uri, match.Groups["URL"].Value).AbsoluteUri);
159
160 string text = "";
161 if (i == 0) text = new Regex("(]+>)|(\\s)|( )|&|\"", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value, "");
162
163 Link link = new Link();
164 link.Text = text;
165 link.NavigateUrl = url;
166
167 m_links.Add(link);
168 }
169 catch (Exception ex) { Console.WriteLine(ex.Message); };
170 match = match.NextMatch();
171 }
172 }
173 }
174 return m_links;
175 }
176 ///
177 /// 此私有方法从一段HTML文本中提取出一定字数的纯文本
178 ///
179 /// HTML代码
180 /// 提取从头数多少个字
181 /// 是否要链接里面的字
182 /// 纯文本
183 private string getFirstNchar(string instr, int firstN, bool withLink)
184 {
185 if (m_outstr == "")
186 {
187 m_outstr = instr.Clone() as string;
188 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
189 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
190 m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
191 if (!withLink) m_outstr = new Regex(@"(?m)]*>(\w|\W)*?]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
192 Regex objReg = new System.Text.RegularExpressions.Regex("(]+?>)| ", RegexOptions.Multiline | RegexOptions.IgnoreCase);
193 m_outstr = objReg.Replace(m_outstr, "");
194 Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
195 m_outstr = objReg2.Replace(m_outstr, " ");
196
197 }
198 return m_outstr.Length > firstN ? m_outstr.Substring(0, firstN) : m_outstr;
199 }
200
201
202 #region 公有文法
203 ///
204 /// 此公有方法提取网页中一定字数的纯文本,包括链接文字
205 ///
206 /// 字数
207 ///
208 public string getContext(int firstN)
209 {
210 return getFirstNchar(m_html, firstN, true);
211 }
212
213 ///
214 /// 此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式
215 ///
216 /// 正则式
217 /// 返回的链接的个数
218 /// List
219 public List getSpecialLinksByUrl(string pattern, int count)
220 {
221 if (m_links.Count == 0) getLinks();
222 List SpecialLinks = new List();
223 List.Enumerator i;
224 i = m_links.GetEnumerator();
225 int cnt = 0;
226 while (i.MoveNext() && cnt 1

c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)

网站优化优采云 发表了文章 • 0 个评论 • 106 次浏览 • 2021-11-24 10:05 • 来自相关话题

  c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)
  网上有很多内容采集工具,今天尝试自己写一个,发现C#可以很方便的抓取网页的内容,然后通过正则化分离出感兴趣的数据。这是抓取网页内容的代码:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace Web
{
///
/// 公共方法类
///
public class WebHandler
{
///
/// 获取网页的HTML码
///
/// 链接地址
/// 编码类型
///
public static string GetHtmlStr(string url, string encoding)
{
string htmlStr = "";
try
{
if (!String.IsNullOrEmpty(url))
{
WebRequest request = WebRequest.Create(url); //实例化WebRequest对象
WebResponse response = request.GetResponse(); //创建WebResponse对象
Stream datastream = response.GetResponseStream(); //创建流对象
Encoding ec = Encoding.Default;
if (encoding == "UTF8")
{
ec = Encoding.UTF8;
}
else if (encoding == "Default")
{
ec = Encoding.Default;
}
StreamReader reader = new StreamReader(datastream, ec);
htmlStr = reader.ReadToEnd(); //读取网页内容
reader.Close();
datastream.Close();
response.Close();
}
}
catch { }
return htmlStr;
}
}

}
  该方法可以获取网页的HTML内容。使用 HTML,我们可以使用正则化来抓取我们想要的内容。. . 查看全部

  c#抓取网页数据(网上很多内容采集工具,发现C#可以轻松的抓去网页)
  网上有很多内容采集工具,今天尝试自己写一个,发现C#可以很方便的抓取网页的内容,然后通过正则化分离出感兴趣的数据。这是抓取网页内容的代码:
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace Web
{
///
/// 公共方法类
///
public class WebHandler
{
///
/// 获取网页的HTML码
///
/// 链接地址
/// 编码类型
///
public static string GetHtmlStr(string url, string encoding)
{
string htmlStr = "";
try
{
if (!String.IsNullOrEmpty(url))
{
WebRequest request = WebRequest.Create(url); //实例化WebRequest对象
WebResponse response = request.GetResponse(); //创建WebResponse对象
Stream datastream = response.GetResponseStream(); //创建流对象
Encoding ec = Encoding.Default;
if (encoding == "UTF8")
{
ec = Encoding.UTF8;
}
else if (encoding == "Default")
{
ec = Encoding.Default;
}
StreamReader reader = new StreamReader(datastream, ec);
htmlStr = reader.ReadToEnd(); //读取网页内容
reader.Close();
datastream.Close();
response.Close();
}
}
catch { }
return htmlStr;
}
}

}
  该方法可以获取网页的HTML内容。使用 HTML,我们可以使用正则化来抓取我们想要的内容。. .

官方客服QQ群

微信人工客服

QQ人工客服


线