c# 爬虫(一) HELLO WORLD
最近在摸索爬虫相关的东西,写点随笔,以便忘记。
目的与用途
现实的项目中,我们需要太多的第三方接口了。而往往这些第三方接口由于条件限制,一时拿不到。
譬如:
1. 淘宝网今天有什么特价商品。
2. 百度今天的热搜榜是什么。
3. 某用户的水电、话费、煤气有没有欠费,欠了多少。
等等问题,怎么办呢?
解决不了就请程序员出马,因为程序员是万能的,程序员是无敌的。
原理
既然我们没有能力(财力)与阿里巴巴、百度等第三方做对接,那么我们可以通过模拟访问他们对于的页面,并抓取对应的数据,来收集相关的信息。
这里,模拟是关键,也有很多细节要处理。后面我会一一讲解。
工具
工欲善其事,兵线利器。 想要模拟访问他人的网页,爬取对应的数据, 那么我们首先要了解对应的网页做了什么动作,如何了解,这里我介绍我用过的三种工具。
1. IE的开发人员工具
IE的开发人员工具,在打开IE的时候,按“F12”能直接呼出,并选择“网络” > "开始捕捉"
对于抓包功能,需要IE的版本达到9或者9以上。 IE8不支持抓包功能。
优点: IE自带,非常方便。
缺点: IE9和IE11的界面风格还有点不一样。 IE11对于数据的拷贝非常不方便。 IE9用着感觉还行。至少数据能拷贝。 但是我有个较复杂的数据爬取,它居然漏了关键的post。
建议: 只支持IE的网站,并且相对较简单的数据爬取,可以直接选择此工具。
2. CHROME的开发人员工具
google的开发人员工具还是不错的。同样的按F12能呼出,或者按 CTRL+Shift+I也能呼出。
同样的选择“网络” 即可捕捉 操作当前页面的数据包。
优点: 浏览器自带
缺点: 暂时没发现。
3. httpwatch
前段时间的一次抓包,一直抓不到,后来想到可能是IE开发人员工具的问题,下了这个试试。 结果挺不错的。比较专业。
优点: 抓包很全面
缺点: 需要自行安装
如果是新手,我建议使用CHOROME的开发工具,或者httpwatch。
相关的类
原则上,只要实现HTTP协议的类,应该都可以, C#与抓包有关的类我用了2个,基本满足需要了。
WebClient 类,
此类使用非常简单, 直接提交页面参数与URL即可获得对应的页面输出内容。 但是如果涉及到客户端与服务端的会话保持(如:需要登录后才能看到的数据)的情况,就无勇武之地了。对于WebClient的用法
HttpWebRequest & HttpWebResponse
这两个类是较底层的类,如果需要与服务器保持会话。就需要靠这兄弟两了。
听说其他语言抓包相对简单, 而C#相对繁琐,也是因为她,谁让他那么底层的呢,而且听说还稍微有BUG,但我没遇到。
HtmlAgilityPack
此类属于第三方类,请自行百度。 当然也不一定需要用。 需要看做出的爬虫需要爬的数据多不多,如果只想获取页面中一两个字段,完全不需要用。
我们知道,使用爬虫爬出来的是一大串字符串, 但其实他就是html标记的字符串, 我们非常希望用js来操作dom元素。 可惜C#中,并没有这样的功能。而这个第三方类,就是实现了将html标记的字符串,直接转换成了类似DOM一样的对象。 这样,我们就能轻松获取查找对应的数据值了。
hello world
由于后面还会说到模拟登录、文件传输等相关信息,这里我用HttpWebRequest 类来说明。
以博客园首页列表的数据为例:
static void Main(string[] args)
{
string html= Hello();
Console.WriteLine(html);
Console.Read();
}
static string Hello()
{
//列表数据,一般通过抓包工具,点击下一页,来发现共同的规则,从而找到对应的URL
string url = "http://www.cnblogs.com/mvc/AggSite/PostList.aspx";
//根据抓包工具,获取需要POST的数据, 并分析对应的数值, 明细这里PageIndex:1 是指第二页。其他的暂不做分析
string postData = "{ \"CategoryType\":\"SiteHome\",\"ParentCategoryId\":0,\"CategoryId\":808,\"PageIndex\":1,\"TotalPostCount\":4000,\"ItemListActionName\":\"PostList\"}"; //1.构建Request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";// POST OR GET, 如果是GET, 则没有第二步传参,直接第三步,获取服务端返回的数据
req.AllowAutoRedirect = false;//服务端重定向。一般设置false
req.ContentType = "application/x-www-form-urlencoded";//数据一般设置这个值,除非是文件上传 //2.同过流的形式,传输参数。
byte[] postBytes = Encoding.UTF8.GetBytes(postData);
req.ContentLength = postBytes.Length;
Stream postDataStream = req.GetRequestStream();
postDataStream.Write(postBytes, , postBytes.Length);
postDataStream.Close(); //3. 获取服务器端的返回数据。
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
string html = new StreamReader(resp.GetResponseStream()).ReadToEnd();
return html;
}
最简单的模拟抓包,主要3步
1. 构建HttpWebRequest。
2. 构建需要传输的参数
3. 获取HttpWebResponse
参考文献:
http://www.cnblogs.com/hambert/p/6118299.html
http://www.crifan.com/emulate_login_website_using_csharp/
https://q.cnblogs.com/q/67303/
c# 爬虫(一) HELLO WORLD的更多相关文章
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- scrapy 知乎用户信息爬虫
zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- Python多线程爬虫爬取电影天堂资源
最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...
- QQ空间动态爬虫
作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...
- 让你从零开始学会写爬虫的5个教程(Python)
写爬虫总是非常吸引IT学习者,毕竟光听起来就很酷炫极客,我也知道很多人学完基础知识之后,第一个项目开发就是自己写一个爬虫玩玩. 其实懂了之后,写个爬虫脚本是很简单的,但是对于新手来说却并不是那么容易. ...
随机推荐
- Python笔记 #11# 统计图定制化
将数据可视化有许多选择: 图的类型 定制化方式 选择什么样的表现方式通常取决于: 数据 你想表达什么 1.Labels # Basic scatter plot, log scale plt.scat ...
- RocEDU.阅读.写作《苏菲的世界》书摘(六)
* 身为一个经验主义者,休姆期许自己要整理前人所提出的一些混淆不清的思想与观念,包括中世纪到十七世纪这段期间,理性主义哲学家留传下来的许多言论和著作.休姆建议,人应回到对世界有自发性感觉的状态.他说, ...
- 20145326《Java程序设计》第一周学习总结
20145326<Java程序设计>第一周学习总结 教材学习内容总结 转眼间新的一学期终于开始了!为什么我这么期待呢?因为这学期可以上娄嘉鹏老师的java程序设计课,我不是什么电脑天才,之 ...
- 子网掩码与ip有实际关系吗?
子网掩码是作为ip地址的标识,还是本身就是ip地址的一部分?例如10.10.10.1/24和10.10.10.1/25是同一个ip地址吗? 作者:知乎用户链接:https://www.zhihu.co ...
- hdu KiKi's K-Number 主席树
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- JVM知识总结-运行时区域划分
区域简介 JVM运行时区域有些随着虚拟机进程的启动而存在,有些依赖于用户线程的启动和结束而建立和销毁,大致分为以下几类:方法区,虚拟机栈,本地方法栈,堆,程序计数器,概念图如下(源于<深入理解J ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No10-No11(知识点:表格操作、代码编写规则)
系列知识点汇总 1.基础篇 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5- ...
- 记录vue中一些有意思的坑
记录vue中一些有意思的坑 'message' handler took 401ms 在出现这个之前,我一直纠结于 是如何使用vue-router或者不使用它,通过类似的v-if来实现.结果却出现这个 ...
- MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门
[引言] 毕竟现在MongoDB还是出于成长阶段,所以现在网上相关的资料很少,而且大部分还都是针对于MongoDB的老版本的.再加上MongoDB的频繁升级.重大更新等等,导致菜鸟学习的难度增大. 好 ...
- 有效二叉查找树判断(java实现)
leetcode 原题 :(即判断二叉树是否为二叉查找树) Given a binary tree, determine if it is a valid binary search tree (BS ...