小编最近在练习正则表达式和requests,所以一直用这两个库爬小说。
分析如何迭代
爬取小说前我总是先看它章节之间是怎么迭代的。
一般完结的小说章节与章节之间是有规律的,如图:
第一章:
某道祖师第二章:
第三章:
...
可以看出,可以直接通过改变有规律的url来迭代。
然而有些小说因为并非完结,作者发布之后存在删改,所以他的url有可能没有规律,并不能采用前一种的方法处理。如图:
第一章:
某来第二章:
(你们可能会问:挺正常的呀,怎么就没规律了? 表急,看官请接着看)
我把www.shuquge.com/txt/8659/之后的内容抓取下来了:
'2324847.html', '14771440.html', '14829888.html', '14834638.html', '14843202.html', '14854067.html', '14862724.html', '14881380.html', '15113611.html', '15175803.html', '15185704.html', '15200926.html', '15212292.html', '15215434.html', '15223608.html', '15230348.html', '15253911.html', '15259139.html', '15267536.html', '15275167.html', '15275417.html'
只展示一部分(毕竟四百多张的小说,都贴上我怕是会被唾沫淹死的)
可以看出,后续的都是没有规律的,我们只能把它的目录页的所有xxxxxx.html抓取出来,挨个遍历添加到url的后边就OK啦!
调用requests、re库发起请求获取html
先看网页是什么类型的编码(这个是utf-8的)
为了防止反爬,伪装了个谷歌浏览器 - -!!
html获取成功
找到网页源代码,写正则提取
第一种(url有规律)的网页:
部分源码可以看出,我们只需要 <div class="content" id="chaptercontent">下的文本,所以我写了如下正则来提去它们:
提取结果很正常
符合要求OK!完成!
第二种(url没有规律的网页):
同样的查看它的编码类型(这个也是utf-8类型的)
利用re和requests库获取html(与第一个一样)
接下来该获取它的目录中每章的部分url了:
没错!我又请求了一遍,但是我这次的url直接包含在函数里了,这个url是目录页面的,并不是第一章的
结果展示:
部分储存
两者没什么区别,都是with open() as f:风格的。
迭代
重要的来了:
第一种的迭代是这样的:
直接计算章节数,range()直接添加完事儿。
然而第二种就不一样了:
第二种是遍历的获取的目录list。
写到这儿可能大神看到呵呵一笑,像我一样的小白看的应该是满脑袋的问号吧,别急:
主函数对比:
第一种第二种
可以看出,第一个套路基本没有,直接获取遍历的每一个html里的内容并储存,第二个的得跟上边的for循环结合起来看,可以看出它的url是与目录里的部分url拼接的,并不是直接遍历章节数得来的。
充钱看小说?tan90°!!
PS1:第一次写文章,请各位大佬不要喷的太厉害,谢谢各位大佬啦!
PS2:坑踩的比较少,写不聊太多了,望各位看官谅解!
网友评论