苦逼的Python爬虫抓小说实战

人生苦短,我用python。原来以为用Python抓本小说是小case,但做下来却发现不是所想的那样。
故事从某个人喜欢一本小说开始,头条新闻的大热,居然夹杂了许多小说,某人(真的是亲人!)喜欢某本小说,但头条里夹杂了诸多的广告,无法好好的看,或者要进入某个微信号然后交钱,很不爽。
话说Python那么牛,是不是可以抓下来?搜了几篇文章,好像不难,想想也是,小说不就是一堆文本而已(或者夹带HTML格式处理),但操作起来发现还是很多弯弯绕绕,把过程写下来,希望再有人做这件事时引以为鉴。

抓小说的过程,网上很多文章说的很清楚(可参考附件的文章)

现在既然要用了,就准备小试牛刀(这里是 唐峰林梦佳 的小说)。
首先百度了一下,找到文章的出处 https://m.biqiku.com/139/139648/all.html
格式好像也挺简单的,类似格式

第1章 重返地球


苦逼的Python爬虫抓小说实战_第1张图片
苦逼之一:这种格式并不能从网上的其他代码拿来就用,仔细看了几篇爬虫文章,发现各自不同,只能自己写代码处理,好在其他一些代码还是可以用,主要是正则处理部分需要特别处理。
这里需要注意,一是要拿到每个章节的url链接,二是需要处理汉字。还好是一个网页就处理完了,也不算很难。

pattern = “

(第[0-9]+章 [\u4e00-\u9fa5]+)

"
#取得两个参数,章节URL链接 和 每个章节名称,其中[\u4e00-\u9fa5]是汉字区间
result = re.findall(pattern,response.text) # 找出所有的章节

苦逼之二:每个章节还分成几页(还好这个文章统一为3页,而且URL类似,偷懒就写成三段代码)
苦逼之三:以为大功告成,但运行之后,发现取了前几章后,后面跳过了好多章节,仔细看了文章,没发现前后章节格式有什么不同,好在灵机一动,每次读取网页内容后,将其打印出来。才发现是网站限制同一ip频繁访问,只能降低速度,每段章节加上time.sleep(3),基本解决这个问题。

爬小说是爬虫中比较简单的一种,但需要根据每篇进行分析定制,做完一篇感到兴趣索然,不知有无大神能写出通用的?
反正我是不想再写,原来还可以优化一下,每段文章通过下一页来找链接,不要被这种3页固定格式捆住,但意义不是很大,就放弃了。

rom urllib.request import urlopen
from requests.exceptions import RequestException
import re
from requests import get
import time


from lxml import etree
urlfirst ="https://m.biqiku.com/139/139648/all.html" #目录页  格式 

第1章 重返地球

response = get(urlfirst) html = etree.HTML(response.text) k = "" pattern = "

(第[0-9]+章 [\u4e00-\u9fa5]+)

" result = re.findall(pattern,response.text) # for pp in result: time.sleep(3) # 太频繁会被封IP k += "\n"+pp[1]+"\n" # 标题 print(pp[1]) chapter = "https://m.biqiku.com"+pp[0]+".html" print(chapter) try: response = get(chapter) pattern = "    (.*?)

第" result = re.findall(pattern,response.text) # 获得每章数据.第一页 ; for r in result: r = r.replace(" "," ") r = r.replace("
","\n") k += r except RequestException as e: print(e) chapter = "https://m.biqiku.com"+pp[0]+"_2.html" print(chapter) try: response = get(chapter) pattern = "    (.*?)

第" result = re.findall(pattern,response.text) # 获得每章数据.第二页 ; for r in result: r = r.replace(" "," ") r = r.replace("
","\n") k += r except RequestException as e: print(e) chapter = "https://m.biqiku.com"+pp[0]+"_3.html" print(chapter) try: response = get(chapter) pattern = "    (.*?)

第" result = re.findall(pattern,response.text) # 获得每章数据.第三页 ; for r in result: r = r.replace(" "," ") r = r.replace("
","\n") k += r except RequestException as e: print(e) with open("唐峰林梦佳.txt","w+",encoding="utf8")as f: f.write(k)

参考文章:
Python爬虫实战–爬取网络小说并存放至txt文件
https://blog.csdn.net/xjm850552586/article/details/78585286

你可能感兴趣的:(Python)