• 用C#写个小程序爬取漫画


     这是要爬的地址 https://www.iqiyi.com/manhua/detail_18yzlq8jc5.html,F12 查看网络发现他是通过 https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/ 这个接口获取目录信息的。

     

     这是第一话的地址 https://www.iqiyi.com/manhua/reader/18yzlq8jc5_18yzebufq1.html ,跟接口返回的数据对比发现前面的部分是固定的,后面的就是 comicId+"_"+episodeId+".html"。

    下面通过C#代码获取漫画第一话的地址。

    首先准备一个类方便解析json

    class ResponseData
    {
        public Data data { get; set; }
    }
    class Data
    {
        public List<Episode> episodes { get; set; }
    }
    class Episode
    {
        public string comicId { get; set; }
        public string episodeId { get; set; }
    }
    HttpClient client = new HttpClient();
    
    var json = client.GetStringAsync("https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/").Result;
    var responseData = JsonConvert.DeserializeObject<ResponseData>(json);
    responseData.data.episodes.ForEach(x =>
    {
        Console.WriteLine($"https://www.iqiyi.com/manhua/reader/{x.comicId}_{x.episodeId}.html");
    });

     这样每一话的地址就显示出来了,最后把每话里的图片保存起来就行了。打开第一话,发现图片地址不是从接口返回的,而是直接写在html里的

     在浏览器开发者工具中选中一个图片标签,选择复制 XPath,会得到 /html/body/div[3]/ul/li[1]/img

    再把后面的 li[1] 改成 li,然后搜索,就把html中所有的img标签都找到了

     下面用C#完成上面的操作,首先需要装一个第三方库。

    long i = 1;
    responseData.data.episodes.ForEach(x =>
    {
        var url = $"https://www.iqiyi.com/manhua/reader/{x.comicId}_{x.episodeId}.html";
        var html = client.GetStringAsync(url).Result;
        var document = new HtmlDocument();
        document.LoadHtml(html);
        //XPath的含义是html下的body下的第二(三)个div下的ul下的。。。
        //注意这里如果用/html/body/div[3]/ul/li/img会返回null,使用/html/body/div[2]/ul/li/img才能正常返回,是因为从浏览器开发者工具看的html代码是经过浏览器渲染后的,有时候页面结构跟源码会不一样,遇到这种就要直接去源码中去查看
        var nodes = document.DocumentNode.SelectNodes("/html/body/div[2]/ul/li/img");
        nodes.ToList().ForEach(n =>
        {
            //查看源码发现只有前三个图片的地址在src属性里,后面的都是在data-original属性里,所以要分两种情况去获取图片地址
            string imgUrl = "";
            if (n.Attributes["src"] != null)
            {
                imgUrl = n.Attributes["src"].Value;
            }
            else
            {
                imgUrl = n.Attributes["data-original"].Value;
            }
            if (imgUrl != null)
            {
                var stream = client.GetStreamAsync(imgUrl).Result;
                //这里要添加System.Drawing引用
                var image = System.Drawing.Image.FromStream(stream);
                if (!Directory.Exists("D:\海贼王\"))
                {
                    Directory.CreateDirectory("D:\海贼王\");
                }
                image.Save("D:\海贼王\" + i + ".jpg");
                i++;
    
            }
        });
    });

    大功告成!!

  • 相关阅读:
    PostgreSQL锁级别及什么操作获取什么锁
    python类和实例
    使用@property
    python3基础笔记(六)模块与包
    【转载】Python装饰器-专题笔记
    python3基础笔记(五)迭代器与生成器
    python3基础笔记(四)文件处理
    python3基础笔记(三)函数与全局、局部变量
    python3基础笔记(二)python的基本数据类型与运算符
    python3基础笔记(一)
  • 原文地址:https://www.cnblogs.com/zhouyg2017/p/12756026.html
Copyright © 2020-2023  润新知