查看原文
其他

C#写个小程序爬取漫画

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:旗木卡卡罗特
cnblogs.com/zhouyg2017/p/12756026.html


前言


这是要爬的地址 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++;
}
});
});



大功告成!!



推荐阅读  点击标题可跳转
.NET Core为x86和x64程序集编写AnyCPU包装用了这么多年的泛型,你对它到底有多了解?.NET项目升级:可为空引用


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存