用C#写个小程序爬取漫画
程序员文章站
2022-07-01 15:45:12
这是要爬的地址 https://www.iqiyi.com/manhua/detail_18yzlq8jc5.html,F12 查看网络发现他是通过 https://www.iqiyi.com/manhua/catalog/18yzlq8jc5/ 这个接口获取目录信息的。 这是第一话的地址 http ......
这是要爬的地址 ,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++; } }); });
大功告成!!
上一篇: Java 复制Word文档
下一篇: 这样设计 Java 异常更优雅,赶紧学!
推荐阅读