最近在掌阅上看到推荐了一部小说,但是是付费的。而且手机看小说确实伤眼,然后百度搜了下,发现网上有。但是网上也伤眼,关键是广告贼多。so~正好在学python,打算试一下万一就成功了呢。
于是,百度是个好东西。我发现整个过程中只用到了一个库
BeautifulSoup
然后BeautifulSoup里面呢有两个方法,用来分析HTML里面的标签
1. find 找到第一个指定的标签
2. find_all 找到所有的指定的标签,返回一个列表
说下这次的思路:
首先给个网址,关于这本小说的目录的地址。然后把所有目录抓下来,根据目录来抓取每一章的内容,依次写到文本文档里面。
然后目录也是很有规律的。找到格式抓下来放在一个列表里面就好啦。
然后重点来了,其实小说什么的,文字内容其实都是一片一片的,非常有规律。所以只用查看源码观察一下就很容易找到规律啦。举个例子,我这次的是抓的重生八万年。其中有很多网站都有免费的这个小说。所以我选了几个。其中一个是utf-8编码的,也有gbk编码格式的。
比如说这个:’http://www.3qzone.com/26_26978/’ 这个网站是gbk编码的。然后小说内容放在div模块里面的。id= content。所以就盯着这个家伙干吧~
import requests
from bs4 import BeautifulSoup
url = 'http://www.3qzone.com/26_26978/'
response = requests.get(url)
response.encoding = 'gbk'
node = BeautifulSoup(response.text,'html.parser')
'''找到章节目录'''
list_url = node.find_all('dd')
for l in list_url:
link = l.find('a')
if link:
herf = link['href']
'''抓取每一章的内容'''
if herf:
response = requests.get(url + herf)
response.encoding = 'gbk'
content = BeautifulSoup(response.text, 'html.parser')
detail = content.find('div', id='content')
format_detail = detail.get_text()
if format_detail:
with open('重生八万年.txt', 'a+', encoding='utf-8')as book:
book.write(link.get_text())
book.write(format_detail)
print('over')
说下这次遇到的坑。在处理每章内容的时候,之前是用的format_detail = detail.find_all(‘br’)
然后后来发现这样每一章的内容都会重复,意思就是第一章 第一章 第二章 第二章。。。然后本宝宝就表示一脸懵逼啊。而且这样每行去处理好像也很慢,非常慢,虽然现在这个玩法也还是很慢。但是相对而言还是好了很多。百思不得其解,到现在也没搞清楚为什么会这样。后来发现可以直接使用detail.get_text(),而且并不会把br这种标签打印出来,爽翻,然后就悄悄绕开这个巨坑了。希望以后慢慢学习能够找到重复的原因。反正我总觉得应该是find_all()的锅。因为做过调试,发现找到detail的时候还很正常,find_all()一次就重复了。如果有大兄弟知道为啥请留言啊。
再来一个别的网站的。不过巨坑的是,前几十章都是乱码,后面的才正常
import requests
from bs4 import BeautifulSoup
response = requests.get('https://www.xs74.com/novel/zhongshengbawannian/')
soup = BeautifulSoup(response.text,'html.parser')
node = soup.find_all('dd')
with open('八万年1.txt', 'a+')as book:
for i in node:
book.write(i.get_text()+'\n')
t = i.find('a')
if t:
url = t['href']
response = requests.get(url)
soup2 = BeautifulSoup(response.text,'html.parser')
content = soup2.find('div',id = 'content')
book.write(content.get_text()+'\n')
book.flush()
嗯~希望以后还可以优化下速度,这龟速确实等得伤心