当前位置: 移动技术网 > IT编程>开发语言>c# > 用C#写个小程序爬取漫画

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

2020年04月24日  | 移动技术网IT编程  | 我要评论

中国战歌网,shoujizhuti,在线营销

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

 

 

 

 

 这是第一话的地址  ,跟接口返回的数据对比发现前面的部分是固定的,后面的就是 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++;

        }
    });
});

 

 

大功告成!!

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • 关于C#反射 你需要知道的

    通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员type 类的 ge... [阅读全文]
  • c# 字符串操作总结

    字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 c# 中关于字符串的一些你可能遗忘或遗漏的知识点。逐字字符串在普通字符串中,反斜杠字符是转义字符... [阅读全文]
  • C#中静态方法和实例化方法的区别、使用

    1、定义方法的格式 访问修饰符 返回类型 方法名 (参数列表) { // 方法的主体… }2、静态方法在大多数时候,我们定义写一个方法,会把方法区分为实例化方法... [阅读全文]
  • 详解C# FileStream类

    c# filestream类在 c# 语言中文件读写流使用 filestream 类来表示,filestream 类主要用于文件的读写,不仅能读写普通的文本文件... [阅读全文]
  • 快速学习c# 枚举

    一、在学习枚举之前,首先来听听枚举的优点。  1、枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。  2、枚举使代码更易于维护,有助于确保给变量指定合... [阅读全文]
  • 浅谈C#六大设计原则

    笔者作为一个菜鸟,会尝试以简单的代码和容易理解的语句去解释这几种原则的特性和应用场景。这六种原则分别为单一职责原则、接口隔离原则、里氏替换原则、迪米特法则、依赖... [阅读全文]
  • 解答“60k”大佬的19道C#面试题(上)

    先略看题目:1 请简述async函数的编译方式2 请简述task状态机的实现和工作机制3 请简述await的作用和原理,并说明和getresult()有什么区别... [阅读全文]
  • 解答“60k”大佬的19道C#面试题(下)

    在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目。姐妹篇:解析“60k”大佬的19道c#面试题(上)这些题目确实不怎么经常使用,因此在后文... [阅读全文]
  • 如何用C#验证IP是否为局域网地址

    前一阵子有【广州.net群】的客户问起这个问题,说他们需要验证客户输入的网站是否为局域网。其实局域网的ip并没有确定的定义,只要是局域网中,即可设置为任何一个i... [阅读全文]
  • Unity实现截屏以及根据相机画面截图

    在游戏开发和软件开发中,经常需要截图的功能,分带ui的截图和不带ui的截图功能。代码如下:using system.collections;using syst... [阅读全文]
验证码:
移动技术网