返回顶部
首页 > 资讯 > 精选 >c#怎么实现爬虫程序
  • 831
分享到

c#怎么实现爬虫程序

2023-06-29 20:06:10 831人浏览 八月长安
摘要

这篇文章主要介绍了C#怎么实现爬虫程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#怎么实现爬虫程序文章都会有所收获,下面我们一起来看看吧。图1如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻

这篇文章主要介绍了C#怎么实现爬虫程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#怎么实现爬虫程序文章都会有所收获,下面我们一起来看看吧。

c#怎么实现爬虫程序

图1

如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示。如某天产品经理跟我们说,推广人员想要抓取百度新闻中热点要闻版块提高站点百度排名。要抓取百度的热点要闻版本,首先我们先要了解站点https://news.baidu.com/请求头(Request headers)信息。

为什么要了解请求头(Request headers)信息?

原因是我们可以根据请求头信息某部分报文信息伪装这是一个正常Http请求而不是人为爬虫程序躲过站点封杀,而成功获取响应数据(Response data)。

如何查看百度新闻网址请求头信息?

c#怎么实现爬虫程序

图2

如图2,我们可以打开谷歌浏览器或者其他浏览器开发工具(按F12)查看该站点请求头报文信息。从图中可以了解到该百度新闻站点可以接受text/html等数据类型;语言是中文;浏览器版本是Mozilla/5.0 (windows NT 6.1; Win64; x64) AppleWEBKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36等等报文信息,在我们发起一个HTTP请求的时候直接携带该报文信息过去。当然并不是每个报文信息参数都必须携带过去,携带一部分能够请求成功即可。

那什么是响应数据(Response data)?

c#怎么实现爬虫程序

图3

如图3,响应数据(Response data)是可以从谷歌浏览器或者其他浏览器中开发工具(按F12)查看到的,响应可以是JSON数据,可以是DOM树数据,方便我们后续解析数据。

当然您可以学习任意一门开发语言开发爬虫程序:C#、nodejspython、Java、c++

但这里主要讲述是C#开发爬虫程序。微软为我们提供两个关于HTTP请求HttpWebRequest,HttpWebResponse对象,方便我们发送请求获取数据。以下展示下C# HTTP请求代码:

        private string RequestAction(RequestOptions options)        {            string result = string.Empty;            IWebProxy proxy = GetProxy();            var request = (HttpWebRequest)WebRequest.Create(options.Uri);            request.Accept = options.Accept;            //在使用curl做POST的时候, 当要POST的数据大于1024字节的时候, curl并不会直接就发起POST请求, 而是会分为俩步,            //发送一个请求, 包含一个Expect: 100 -continue, 询问Server使用愿意接受数据            //接收到Server返回的100 - continue应答以后, 才把数据POST给Server            //并不是所有的Server都会正确应答100 -continue, 比如lighttpd, 就会返回417 “Expectation Failed”, 则会造成逻辑出错.            request.ServicePoint.Expect100Continue = false;            request.ServicePoint.UseNagleAlGorithm = false;//禁止Nagle算法加快载入速度            if (!string.IsNullOrEmpty(options.XHRParams)) { request.AllowWriteStreamBuffering = true; } else { request.AllowWriteStreamBuffering = false; }; //禁止缓冲加快载入速度            request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");//定义gzip压缩页面支持            request.ContentType = options.ContentType;//定义文档类型及编码            request.AllowAutoRedirect = options.AllowAutoRedirect;//禁止自动跳转            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36";//设置User-Agent,伪装成Google Chrome浏览器            request.Timeout = options.Timeout;//定义请求超时时间为5秒            request.KeepAlive = options.KeepAlive;//启用长连接            if (!string.IsNullOrEmpty(options.Referer)) request.Referer = options.Referer;//返回上一级历史链接            request.Method = options.Method;//定义请求方式为GET            if (proxy != null) request.Proxy = proxy;//设置代理服务器IP,伪装请求地址            if (!string.IsNullOrEmpty(options.RequestCookies)) request.Headers[HttpRequestHeader.Cookie] = options.RequestCookies;            request.ServicePoint.ConnectionLimit = options.ConnectionLimit;//定义最大连接数            if (options.WebHeader != null && options.WebHeader.Count > 0) request.Headers.Add(options.WebHeader);//添加头部信息            if (!string.IsNullOrEmpty(options.XHRParams))//如果是POST请求,加入POST数据            {                byte[] buffer = Encoding.UTF8.GetBytes(options.XHRParams);                if (buffer != null)                {                    request.ContentLength = buffer.Length;                    request.GetRequestStream().Write(buffer, 0, buffer.Length);                }            }            using (var response = (HttpWebResponse)request.GetResponse())            {                ////获取请求响应                //foreach (Cookie cookie in response.Cookies)                //    options.CookiesContainer.Add(cookie);//将Cookie加入容器,保存登录状态                if (response.ContentEncoding.ToLower().Contains("gzip"))//解压                {                    using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))                    {                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                        {                            result = reader.ReadToEnd();                        }                    }                }                else if (response.ContentEncoding.ToLower().Contains("deflate"))//解压                {                    using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))                    {                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                        {                            result = reader.ReadToEnd();                        }                    }                }                else                {                    using (Stream stream = response.GetResponseStream())//原始                    {                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))                        {                            result = reader.ReadToEnd();                        }                    }                }            }            request.Abort();            return result;        }

还有一个我自定义传参对象,当然无论传入或者传出的对象都是你们根据自己实际业务需求定义的:

    public class RequestOptions    {        /// <summary>        /// 请求方式,GET或POST        /// </summary>        public string Method { get; set; }        /// <summary>        /// URL        /// </summary>        public Uri Uri { get; set; }        /// <summary>        /// 上一级历史记录链接        /// </summary>        public string Referer { get; set; }        /// <summary>        /// 超时时间(毫秒)        /// </summary>        public int Timeout = 15000;        /// <summary>        /// 启用长连接        /// </summary>        public bool KeepAlive = true;        /// <summary>        /// 禁止自动跳转        /// </summary>        public bool AllowAutoRedirect = false;        /// <summary>        /// 定义最大连接数        /// </summary>        public int ConnectionLimit = int.MaxValue;        /// <summary>        /// 请求次数        /// </summary>        public int RequestNum = 3;        /// <summary>        /// 可通过文件上传提交的文件类型        /// </summary>        public string Accept = "*/*";        /// <summary>        /// 内容类型        /// </summary>        public string ContentType = "application/x-www-fORM-urlencoded";        /// <summary>        /// 实例化头部信息        /// </summary>        private WebHeaderCollection header = new WebHeaderCollection();        /// <summary>        /// 头部信息        /// </summary>        public WebHeaderCollection WebHeader        {            get { return header; }            set { header = value; }        }        /// <summary>        /// 定义请求Cookie字符串        /// </summary>        public string RequestCookies { get; set; }        /// <summary>        /// 异步参数数据        /// </summary>        public string XHRParams { get; set; }    }

根据展示的代码,我们可以发现HttpWebRequest对象里面都封装了很多Request headers报文参数,我们可以根据该网站的Request headers信息在微软提供的HttpWebRequest对象里设置(看代码报文参数注释,都有写相关参数说明,如果理解错误,望告之,谢谢),然后发送请求获取Response data解析数据。

还有补充一点,爬虫程序能够使用代理IP最好使用代理IP,这样降低被封杀机率,提高抓取效率。但是代理IP也分质量等级,对于某一些HTTPS站点,可能对应需要质量等级更加好的代理IP才能穿透,这里暂不跑题,后续我会写一篇关于代理IP质量等级文章详说我的见解。

C#代码如何使用代理IP?

微软NET框架也为了我们提供一个使用代理IP 的System.net.WebProxy对象,关于使用代码如下:

        private System.Net.WebProxy GetProxy()        {            System.Net.WebProxy webProxy = null;            try            {                // 代理链接地址加端口                string proxyHost = "192.168.1.1";                string proxyPort = "9030";                // 代理身份验证的帐号跟密码                //string proxyUser = "xxx";                //string proxyPass = "xxx";                // 设置代理服务器                webProxy = new System.Net.WebProxy();                // 设置代理地址加端口                webProxy.Address = new Uri(string.Format("{0}:{1}", proxyHost, proxyPort));                // 如果只是设置代理IP加端口,例如192.168.1.1:80,这里直接注释该段代码,则不需要设置提交给代理服务器进行身份验证的帐号跟密码。                //webProxy.Credentials = new System.Net.NetworkCredential(proxyUser, proxyPass);            }            catch (Exception ex)            {                Console.WriteLine("获取代理信息异常", DateTime.Now.ToString(), ex.Message);            }            return webProxy;        }

关于 System.Net.WebProxy对象参数说明,我在代码里面也做了解释。

如果获取到Response data数据是json,xml等格式数据,这类型解析数据方法我们这里就不详细说了,请自行百度。这里主要讲的是DOM树 HTML数据解析,对于这类型数据有人会用正则表达式来解析,也有人用组件。当然只要能获取到自己想要数据,怎么解析都是可以。这里主要讲我经常用到解析组件HtmlAgilityPack,引用DLL为(using HtmlAgilityPack)。解析代码如下:

                HtmlDocument htmlDoc = new HtmlDocument();                htmlDoc.LoadHtml(simpleCrawlResult.Contents);                HtmlnodeCollection liNodes = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='pane-news']").SelectSingleNode("div[1]/ul[1]").SelectNodes("li");                if (liNodes != null && liNodes.Count > 0)                {                    for (int i = 0; i < liNodes.Count; i++)                    {                        string title = liNodes[i].SelectSingleNode("strong[1]/a[1]").InnerText.Trim();                        string href = liNodes[i].SelectSingleNode("strong[1]/a[1]").GetAttributeValue("href", "").Trim();                        Console.WriteLine("新闻标题:" + title + ",链接:" + href);                    }                }

下面主要展示抓取结果。

c#怎么实现爬虫程序

图4

如图4,抓取效果,一个简单爬虫程序就这样子完成了。

关于“c#怎么实现爬虫程序”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“c#怎么实现爬虫程序”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: c#怎么实现爬虫程序

本文链接: https://lsjlt.com/news/326386.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c#怎么实现爬虫程序
    这篇文章主要介绍了c#怎么实现爬虫程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#怎么实现爬虫程序文章都会有所收获,下面我们一起来看看吧。图1如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻...
    99+
    2023-06-29
  • c#实现爬虫程序
    图1 如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示。如某天产品经理跟我们说,推广人员想要抓取百度新闻中热点要闻版块提高站点百度排名。要抓取百度的热点要闻版本,...
    99+
    2024-04-02
  • thinkphp5.1怎么实现多线程爬虫
    这篇文章主要介绍了thinkphp5.1怎么实现多线程爬虫,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建一个cli命令php think make:c...
    99+
    2023-06-25
  • C#使用selenium实现爬虫
    目录一、介绍:安装Selenium:二、等待1、隐式等待:ImplicitlyWait2、显示等待:WebDriverWait()三、查找(定位对象)四、获取页面元素和元素内容五、操...
    99+
    2024-04-02
  • Python怎么实现selenium多线程爬虫
    要在Python中实现Selenium多线程爬虫,你可以按照以下步骤进行操作: 导入必要的库: from selenium im...
    99+
    2023-10-24
    Python selenium
  • 怎么用TypeScript开发爬虫程序
    这篇文章主要介绍“怎么用TypeScript开发爬虫程序”,在日常操作中,相信很多人在怎么用TypeScript开发爬虫程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2024-04-02
  • 如何利用C++实现一个简单的网页爬虫程序?
    如何利用C++实现一个简单的网页爬虫程序?简介:互联网是一个信息的宝库,而通过网页爬虫程序可以轻松地从互联网上获取大量有用的数据。本文将介绍如何使用C++编写一个简单的网页爬虫程序,以及一些常用的技巧和注意事项。一、准备工作安装C++编译器...
    99+
    2023-11-04
    C++ 网页爬虫 程序实现
  • Java语言怎么实现爬虫
    这篇文章给大家分享的是有关Java语言怎么实现爬虫的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么我们要爬取数据在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分析、筛选,比如当我们做一个项目的时候,需...
    99+
    2023-06-22
  • C#使用CefSharp控件实现爬虫
    一、CefSharp介绍 CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web ...
    99+
    2024-04-02
  • C#如何使用selenium实现爬虫
    本文小编为大家详细介绍“C#如何使用selenium实现爬虫”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何使用selenium实现爬虫”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、介绍:Seleni...
    99+
    2023-07-02
  • Java实现爬虫
    为什么我们要爬取数据 在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分析、筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,就需要去某些网站进行爬取,有些网站的数据...
    99+
    2024-04-02
  • ​Python爬虫怎么实现url去重
    这篇文章主要介绍“Python爬虫怎么实现url去重”,在日常操作中,相信很多人在Python爬虫怎么实现url去重问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫怎么实现url去重”的疑惑有所...
    99+
    2023-06-02
  • 怎么在java中实现一个多线程爬虫
    怎么在java中实现一个多线程爬虫?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android...
    99+
    2023-06-14
  • 如何实现爬虫
    这篇文章主要为大家展示了“如何实现爬虫”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现爬虫”这篇文章吧。第一步要确定爬取页面的链接由于我们通常爬取的内容不止一页,所以要注意看看翻页、关键字...
    99+
    2023-06-02
  • Python中怎么对爬虫程序进行配置
    这篇文章主要介绍Python中怎么对爬虫程序进行配置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float...
    99+
    2023-06-14
  • 如何构造一个C#语言的爬虫程序
    本篇内容介绍了“如何构造一个C#语言的爬虫程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   转CS...
    99+
    2024-04-02
  • 如何构造C#语言的爬虫蜘蛛程序
    这篇文章主要介绍了如何构造C#语言的爬虫蜘蛛程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何构造C#语言的爬虫蜘蛛程序文章都会有所收获,下面我们一起来看看吧。   C#...
    99+
    2024-04-02
  • 怎么用.net core 实现简单爬虫
    本篇内容主要讲解“怎么用.net core 实现简单爬虫”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用.net core 实现简单爬虫”吧!一.介绍一个Http请求框架HttpCode.C...
    99+
    2023-06-19
  • 如何在Python中实现一个简单的爬虫程序
    如何在Python中实现一个简单的爬虫程序随着互联网的发展,数据已成为当今社会最宝贵的资源之一。而爬虫程序则成为了获取互联网数据的重要工具之一。本文将介绍如何在Python中实现一个简单的爬虫程序,并提供具体的代码示例。确定目标网站在开始编...
    99+
    2023-10-22
    Python 程序 爬虫
  • python实现简单爬虫--爬图片
    首先有两个功能需求:第一:获取到要爬的页面html内容;第二:使用正则表达式进行匹配并进行保存到本地。#!/usr/bin/env python #encoding:utf-8 import urllib import re def get...
    99+
    2023-01-31
    爬虫 简单 图片
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作