zoukankan      html  css  js  c++  java
  • 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, 0, 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/

  • 相关阅读:
    Django
    索引
    idea启动tomcat后控制台日志显示中文乱码问题
    Elasticsearch
    Hive 开窗函数
    hadoop-3.1.1集群搭建
    hadoop-2.6.5集群搭建
    spark集群搭建(spark版本2.3.2)
    Zookeeper
    spark-submit(spark版本2.3.2)
  • 原文地址:https://www.cnblogs.com/xinjian/p/6340514.html
Copyright © 2011-2022 走看看