第一步

我们先找到拿数据的网站网站,然后打开F12,找到对应的json数据。

第二步

观察json的格式,然后在程序里设对应的模型(属性名得一模一样的,类型的话自己判断吧)

public class SichuangJsonModel{public string msg { get; set; }public Int32 total { get; set; }public string code { get; set; }public List<SichuanData> data { get; set; }}public class SichuanData{/// <summary>/// 发布时间/// </summary>public string noticeTime { get; set; }/// <summary>/// 标题/// </summary>public string title { get; set; }/// <summary>/// 公告URL  /// </summary>public string pageurl { get; set; }/// <summary>/// 内容/// </summary>public string content { get; set; }/// <summary>/// 采购人名称/// </summary>public string purchaser { get; set; }/// <summary>/// 预算金额/// </summary>public string budget { get; set; }/// <summary>/// 采购人地址/// </summary>public string purchaserAddr { get; set; }/// <summary>/// 采购人联系方式/// </summary>public string purchaserLinkPhone { get; set; }/// <summary>/// 项目编号/// </summary>public string openTenderCode { get; set; }/// <summary>/// 采购代理机构名称/// </summary>public string agency { get; set; }/// <summary>/// 采购方式/// </summary>public string noticeType{ get; set; }}

或者你不想自己写这种东西话,直接自动生成吧!

把json放到类中

就自动生成了

第三步

开始编写代码了,建议你先建个测试类,这样调试方便,当然你自己不嫌麻烦能一下子调试成功的当我没说!

我这边用测试类做的,测试完了,直接搬过去用就行,话不多说,上代码

3.1  json,get方式

注:这个request里面的参数是在网站上找的

是不是分块编码的看这里

json,get方式

using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using LitJson;
using System;[TestMethod]public void TestSichuanService(){var pageNum = 1;//页码var noticeType = "001004,001006";//数据的类型var url = @"http://www.ccgp-sichuan.gov.cn/freecms/rest/v1/notice/selectInfoMoreChannel.do?=&siteId=94c965cc-c55d-4f92-8469-d5875c68bd04&channel=c5bff13f-21ca-4dac-b158-cb40accd3035&currPage=" + pageNum + "&pageSize=10&noticeType=" + noticeType + "&regionCode=&purchaseManner=&title=&openTenderCode=&purchaser=&agency=&purchaseNature=&operationStartTime=&operationEndTime=&selectTimeName=noticeTime&cityOrArea=";//为指定的 URI 方案初始化新的 WebRequest 实例,网站上请求的网络协议var request = (HttpWebRequest)WebRequest.Create(url);request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";request.KeepAlive = true;request.ContentType = "application/json;charset=utf-8";request.Host = "www.ccgp-sichuan.gov.cn";request.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000";request.Headers.Add("Accept-Encoding", "gzip, deflate");request.Headers.Add("Accept-Language", "zh-CN");request.Headers.Add("DNT", "1");request.Headers.Add("Cache-Control", "max-age=0");request.Headers.Add("Upgrade-Insecure-Requests", "1");request.Method = "Get";//因为这个网站是get请求的//分块编码的解码方式request.AutomaticDecompression = DecompressionMethods.GZip;//因为这个网站json数据是分块编码的,得加上这个,如果要爬取的网站不是分块编码的可以省略//来自 Internet 资源的响应var response = request.GetResponse();byte[] responseBytes = GetContentBytes(response);//数据流转字符串var jsonString = Encoding.UTF8.GetString(responseBytes);var listJson = JsonMapper.ToObject<SichuangJsonModel>(jsonString);//把数据存模型里面去if (listJson.data == null || listJson.data.Count < 1)Console.WriteLine("no json");else{foreach (var noteListModel in listJson.data){Console.WriteLine(noteListModel.title);}}}/// <summary>/// 数据流转字符串/// </summary>/// <param name="response"></param>/// <returns></returns>private byte[] GetContentBytes(WebResponse response){byte[] data;using (var buffer = new MemoryStream()){using (var responseStream = response.GetResponseStream()){if (responseStream != null) responseStream.CopyTo(buffer);}data = buffer.ToArray();}return data;}

3.2  json post方式

我用另一个post方式的网站做的,跟上面那个网站不一样

不过,还是分析json,建模型,建模型的步骤我就省略了,跟上面差不多

注:datas的参数在这里找

注:request参数在这里找

using System.Net;
using System.Text;
using BaseHelper;
using LitJson;
using System;
using System.Collections.Generic;
using System.IO;[TestMethod]public void TestGjdlService(){//获取和设置cookiesvar cookies = new Dictionary<string, string>();//主要是用这个链接拿cookievar firstUrl = @"https://ecp.sgcc.com.cn/ecp2.0/portal/#/list/list-com/2018032600289606_1_2018060501171111";var result = HttpHelper.Send(firstUrl, new Dictionary<string, string>(), new Dictionary<string, string>(),"Get");//从网页上拿到Set-Cookie的内容var cid = result.Headers.GetValues("Set-Cookie");if (cid == null || cid.Length < 1) return;//从网页上拿到Set-Cookie的内容var cids = cid[0].Split(new[] { ";", "proxy_server=" }, StringSplitOptions.RemoveEmptyEntries);if (cids.Length < 1) return;var cookiesStrs = cids[0];cookies.Add("proxy_server", cookiesStrs); //这个代码直接用就行,大部分网站都能用//主界面的数据,跟get不一样,get直接放网址里就行,post得这样写var datas = new Dictionary<string, string>();var pageNum = 1;datas.Add("firstPageMenuId", "2018060501171111");datas.Add("index", pageNum.ToString());datas.Add("key", "");datas.Add("orgId", "");datas.Add("orgName", "");datas.Add("purOrgCode", "");datas.Add("purOrgStatus", "");datas.Add("purType", "");datas.Add("size", "20");//主要是用这个链接拿列表的数据var url = @"https://ecp.sgcc.com.cn/ecp2.0/ecpwcmcore//index/noteList";//为指定的 URI 方案初始化新的 WebRequest 实例var request = (HttpWebRequest)WebRequest.Create(url);request.Accept = "application/json, text/plain, */*";request.KeepAlive = true;request.ContentLength = 138;request.ContentType = "application/json";request.Host = "ecp.sgcc.com.cn";request.Referer = @"https://ecp.sgcc.com.cn/ecp2.0/portal/";request.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36";request.Headers.Add("Accept-Encoding", "gzip, deflate, br");request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");request.Headers.Add("DNT", "1");request.Headers.Add("sec-ch-ua-mobile", "?0");request.Headers.Add("sec-ch-ua-platform", "Windows");request.Headers.Add("Sec-Fetch-Dest", "empty");request.Headers.Add("Sec-Fetch-Mode", "cors");request.Headers.Add("Sec-Fetch-Site", "same-origin");request.Headers.Add("Origin", @"https://ecp.sgcc.com.cn");request.Method = "Post";_InjectCookies(request, cookies);//封装请求cookies//纯字符串转字符数据流var data = _ConvertKeyValuePayLoadToBytes(datas);if (data.Length > 0){request.ContentLength = data.Length;//GetRequestStream()将数据写入 Internet 资源的 Streamusing (var requestStream = request.GetRequestStream()){requestStream.Write(data, 0, data.Length);requestStream.Flush();}}//来自 Internet 资源的响应var response = request.GetResponse();byte[] responseBytes = GetContentBytes(response);//数据流转字符串var jsonString = Encoding.UTF8.GetString(responseBytes);var listJson = JsonMapper.ToObject<GjdlJsonModel>(jsonString);//将数据存模型里if (listJson == null || listJson.resultValue == null || listJson.resultValue.noteList == null || listJson.resultValue.noteList.Count < 1)Console.WriteLine("no json");else{{foreach (var noteListModel in listJson.resultValue.noteList){Console.WriteLine(noteListModel.title);}}}}-----------------------后面这三个方法直接用就行,不用改啥/// <summary>/// 封装请求cookies/// </summary>/// <param name="request"></param>/// <param name="cookies"></param>private static void _InjectCookies(HttpWebRequest request, IDictionary<string, string> cookies){if (cookies != null && cookies.Count > 0){request.CookieContainer = new CookieContainer();foreach (var key in cookies.Keys){var value = cookies[key];var hostItems = request.Host.Split(new[] { ':' });var cookie = new Cookie(key, value, "/", hostItems[0]) { Expires = DateTime.Now.AddDays(60) };request.CookieContainer.Add(cookie);}}}private byte[] _ConvertKeyValuePayLoadToBytes(IDictionary<string, string> dataDictionary){var dataString = "{";var wz = 0;foreach (var key in dataDictionary.Keys){var itemString = wz == 0 ? $"\"{key}\":\"{dataDictionary[key]}\"" : $", \"{key}\":\"{dataDictionary[key]}\"";dataString += itemString;wz++;}dataString += "}";var data = Encoding.UTF8.GetBytes(dataString);return data;}/// <summary>/// 数据流转字符串/// </summary>/// <param name="response"></param>/// <returns></returns>private byte[] GetContentBytes(WebResponse response){byte[] data;using (var buffer = new MemoryStream()){using (var responseStream = response.GetResponseStream()){if (responseStream != null) responseStream.CopyTo(buffer);}data = buffer.ToArray();}return data;}

3.3 HTML方式

有些网站不是用json方式给数据的,直接纯HtML的方式给的,这个时候就得分析网站HTML的格式了

例子

 public void TestSichuanghtml(){//废标var url = @"http://www.ccgp-sichuan.gov.cn/freecms/site/sichuan/ggxx/info/2022/8a69ce41836122f801837c83882606b3.html?noticeType=001004,001006";var htmlDoc = GetHtmlDocument(url);//get方式获取到页面数据var div = htmlDoc.FindFirstOrDefault(@"div[id=content]");//定位到数据所在的div区域//采购代理地址var tmAdd = div.FindFirstOrDefault(@"span[id=_notice_content_noticeAgency-agentAddress]");var CGAdd = GetTitle(tmAdd);//获取元素的Title//采购代理联系方式var tmTel = div.FindFirstOrDefault(@"span[id=_notice_content_noticeAgency-agentLinkTel]");var CGTel = GetTitle(tmTel);//项目联系人var tmTel_2 = div.FindFirstOrDefault(@"span[id=_notice_content_projectContact-managerName]");var CGTel_2 = GetTitle(tmTel_2);//项目联系人电话var tmTel_3 = div.FindFirstOrDefault(@"span[id=_notice_content_projectContact-managerLinkPhone]");var CGTel_3 = GetTitle(tmTel_3);//附件var tmTel_4 = div.Find(@"a").ToList();var aaa = "";for (int i = 0; i < tmTel_4.Count; i++){var CGTel_4 = tmTel_4[i]?.InnerText().Trim();//附件名称foreach (var aa in tmTel_4[i]?.Attributes()){if (aa.Name == "href"){if (i == 0)aaa = aa.AttributeValue.Trim();//附件URLelseaaa += ";;;" + aa.AttributeValue.Trim();break;}}}}/// <summary>/// GET方式获取页面/// </summary>/// <param name="url"></param>/// <returns></returns>public IHtmlDocument GetHtmlDocument(string url){try{var cookies = new Dictionary<string, string>();var datas = new Dictionary<string, string>();var pageContent = HttpHelper.DownloadString(url, cookies, datas, Encoding.UTF8, HttpHelper.GetMethod, BaseAppConfig.DefaultWebRequestTimeout);var parser = new JumonyParser();return parser.Parse(pageContent);}catch (Exception e){throw new Exception("服务器访问出错:" + e.InnerMessage());}}/// <summary>/// 获取元素的Title/// </summary>/// <param name="aElement"></param>/// <returns></returns>public string GetTitle(IHtmlElement aElement){var attrs = aElement.Attributes();string addr;foreach (var attribute in attrs){if (attribute.Name.ToLower() == "title"){addr = attribute.AttributeValue.Trim();return addr;}}addr = aElement.InnerText().Trim();return addr;}/// <summary>/// 获取超级链接地址/// </summary>/// <param name="attrs"></param>/// <returns></returns>public string GetHref(IEnumerable<IHtmlAttribute> attrs){var addr = string.Empty;foreach (var attribute in attrs){if (attribute.Name == "href"){addr = attribute.AttributeValue.Trim();break;}}return addr;}/// <summary>/// 获取点击事件值/// </summary>/// <param name="attrs"></param>/// <returns></returns>public string GetOnclick(IEnumerable<IHtmlAttribute> attrs){var addr = string.Empty;foreach (var attribute in attrs){if (attribute.Name.ToLower() == "onclick"){addr = attribute.AttributeValue.Trim();break;}}return addr;}/// <summary>/// 获取包含关键字的元素的值/// </summary>/// <param name="list"></param>/// <param name="keyWord"></param>/// <returns></returns>public string GetElementValue(List<IHtmlElement> list, string keyWord){if (list == null || list.Count < 1 || string.IsNullOrWhiteSpace(keyWord)) return null;foreach (var htmlElement in list)if (htmlElement.InnerText().Trim().Contains(keyWord.Trim()))return htmlElement.InnerText().Trim().Replace(keyWord, "");return null;}/// <summary>/// 获取包含文本内容的元素的序列/// </summary>/// <param name="list"></param>/// <param name="texts"></param>/// <returns></returns>public int GetElementIndex(List<IHtmlElement> list, List<string> texts){if (list == null || list.Count < 1 || texts == null || texts.Count < 1) return -1;for (var index = 0; index < list.Count; index++){var htmlElement = list[index];foreach (var text in texts){if (htmlElement.InnerText().Trim().Contains(text.Trim()))return index;}}return -1;}

C#爬取数据的方法这三个能应付大部分了,没看懂的可以加我QQ一起交流

作者QQ:3093955853

C#爬取数据_详细篇相关推荐

  1. 如何用python爬取数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...

    作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...

  2. 入门爬虫,爬取数据这一篇就够了!!!

    有小伙伴问,新手该怎么开始学习爬虫.其实说实在的入门爬虫真的非常容易.于是我就针对如何入门爬虫进行了总结 如果你 不会用爬虫爬数据 ,但是你又经常需要把某些网站上的数据导入到Excel等软件,那么请阅 ...

  3. python登录网站后爬取数据_需要登陆网站后才能获取数据的页面爬取

    本文转载自以下链接:https://www.makcyun.top/web_scraping_withpython8.html 目的是万一博主网站无法访问到的话自己需要学习的东西可就不存在了. 本文需 ...

  4. python登录网站后爬取数据_用 Python 登录主流网站,我们的数据爬取少不了它

    不论是自然语言处理还是计算机视觉,做机器学习算法总会存在数据不足的情况,而这个时候就需要我们用爬虫获取一些额外数据.这个项目介绍了如何用 Python 登录各大网站,并用简单的爬虫获取一些有用数据,目 ...

  5. python登录网站后爬取数据_如何用 Python 登录主流网站,爬取一些需要的数据

    最近收集了一些网站的登陆方式和爬虫程序,有的通过 selenium 登录,有的则通过抓包直接模拟登录.作者希望该项目能帮助初学者学习各大网站的模拟登陆方式,并爬取一些需要的数据. 作者表示模拟登陆基本 ...

  6. 如何用python爬取数据_如何使用python爬取知乎数据并做简单分析

    原标题:如何使用python爬取知乎数据并做简单分析 一.使用的技术栈: 爬虫:python27 +requests+json+bs4+time 分析工具: ELK套件 开发工具:pycharm 数据 ...

  7. python登录网站后爬取数据_快速爬取登录网站数据

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 部分网站需要登录才能允许访问,因此爬虫需要获取登录cookie,然后通过爬虫代理使用该cookie进行数据采集.本示例按照以上流程进行实现如下: 1 模拟 ...

  8. python爬取网站数据步骤_python怎么爬取数据

    在学习python的过程中,学会获取网站的内容是我们必须要掌握的知识和技能,今天就分享一下爬虫的基本流程,只有了解了过程,我们再慢慢一步步的去掌握它所包含的知识 Python网络爬虫大概需要以下几个步 ...

  9. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  10. 简单爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页

    爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页 1.什么是ajax异步数据交换网页 2.用到的工具模块和简单解释 3.网页内容解析 4.代码实现及解释 1.什么是ajax异步数据交换网页 ...

最新文章

  1. 半导体理论(第2部分)半导体掺杂
  2. 产品推广系统推荐乐云seo_优化推广公司红利产品推荐“爱采购cpc竞价版”
  3. 甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...
  4. oracle sql 输出,将数据从Oracle SQL Developer导出到Excel .xlsx
  5. AtCoder Regular Contest 105 部分 NIM游戏
  6. 条件概率分布_条件概率
  7. Python~win32com~Excel
  8. java按照io流向基类_Java IO详解
  9. 蚂蚁式管理(Style of Ant Management)
  10. leetcode刷题:1.无重复字符的最长字串
  11. 计算机初试占比高的学校,复试压力小,初试占比70%及以上的院校汇总!
  12. 丁香园 (http://www.dxy.cn)这个名字听着
  13. c语言所有的数学函数,C语言函数—数学函数,全在这里!
  14. 电商平台退货管理教程
  15. link library 、target library、symbol library、synthetic library对照分析-基础小知识(九)
  16. 个是云计算,一个大数据,一个人工智能,
  17. NLPCC论文LaTeX封面生成代码
  18. Exiv2 With XMP for Android
  19. Linux系统如何安装Python?新手教程
  20. linux学习——linux中文件属主、属组是什么意思

热门文章

  1. error: [debug/qrc_resource.cpp] Error 1
  2. Python3的Counter类
  3. 注塑机摆放间距多少合适_注塑模具加工须知(1):必须注意注塑机注塑参数“拉杆间距”...
  4. 【力扣题解】分式化简
  5. jquery动画顺序执行_深入理解jquery自定义动画animate()
  6. 谷歌阅读器将于2013年7月1日停止服务,博客订阅转移到邮箱
  7. 数字化住宅小区对计算机网络有需求,浅谈智能小区宽带接入及其技术发展趋势...
  8. linux u盘 驱动怎么安装步骤,怎样利用U盘加载控制器驱动安装Linux系统?
  9. notepad python 单步调试_用Notepad++ 调试 Python 及缩进问题 – 槑烎
  10. 可以多项目协同的项目管理软件