现在已经能够爬取单章内容,如果要爬取整部小说,利用现在的代码就是:手动输入每一章的网址,然后运行代码……考虑到网络 小说动辄几百上千甚至上万的章节数,手动下载是一个十分艰苦漫长的任务!!
如果 能得到小说所有章节的链接,通过遍历所有链接就能下载整部小说了。、
从哪里找所有章节的链接?
打开卡徒的目录页(https://www.52bqg.com/book_12525/)
在目录页点右键“查看网页源代码”,从源代码页中可以看到,小说所有章节的名称和链接都在这里。
现在要做的就是从目录页中提取出所有章节的名称和链接!
查看源代码,发现所有的章节名称和链接都在标签<div,id='list'>下的<a></a>里,比如:
<a href="6122965.html">第一节 以卡为生</a>
还是原来的配方,还是熟悉的味道,还是像内容页一样的操作有没有!
在Pycharm中新建'爬目录.py',代码如下:
import requests
from bs4 import BeautifulSoup
target = 'https://www.52bqg.com/book_12525/' # 目录页地址
req = requests.get(url = target)
req.encoding = req.apparent_encoding # 编码转换
# 使用beautifulsoup 筛选出id=list的div标签
bf = BeautifulSoup(req.text,"html.parser")
lists = bf.find_all('div',id='list')
lists = lists[0]
print(lists)
输出结果
现在需要从当前的结果中将所有的标签<a>筛选出来,再次使用bs。
import requests
from bs4 import BeautifulSoup
target = 'https://www.52bqg.com/book_12525/' # 目录页地址
req = requests.get(url = target)
req.encoding = req.apparent_encoding # 编码转换
# 使用beautifulsoup 筛选出id=list的div标签
bf = BeautifulSoup(req.text,"html.parser")
lists = bf.find_all('div',id='list')
lists = lists[0]
# 再次使用bs筛选出所有的标签a
bf_a = BeautifulSoup(str(lists), 'html.parser') # 不加str()会报错
a = bf_a.find_all('a')
print(a)
输出结果
现在得到的是包含所有章节名称和链接的标签<a>列表,接下来使用for循环遍历a,使用a.string和a.get()得到章节名称和链接,并将章节名称存放在列表titles[]中,链接存放在列表urls[]中。
import requests
from bs4 import BeautifulSoup
target = 'https://www.52bqg.com/book_12525/' # 目录页地址
req = requests.get(url = target)
req.encoding = req.apparent_encoding # 编码转换
# 使用beautifulsoup 筛选出id=list的div标签
bf = BeautifulSoup(req.text,"html.parser")
lists = bf.find_all('div',id='list')
lists = lists[0]
# 再次使用bs,从lists中筛选出所有的标签a
bf_a = BeautifulSoup(str(lists), 'html.parser') # 不加str()会报错
a = bf_a.find_all('a')
titles = [] # 存放章节名称
urls = [] # 存放章节链接
for s in a:
titles.append(s.string)
urls.append(s.get('href'))
print(titles)
print(urls)
得到的结果
发现一个问题,得到的链接不是完整链接。以第一节为例,完整链接为:
https://www.52bqg.com/book_12525/6122965.html
分析得出,每一章节的完整链接由小说的章节目录地址https://www.52bqg.com/book_12525/和列表中的链接地址6122965.html组合而成。
修改后的代码
import requests
from bs4 import BeautifulSoup
target = 'https://www.52bqg.com/book_12525/' # 目录页地址
req = requests.get(url = target)
req.encoding = req.apparent_encoding # 编码转换
# 使用beautifulsoup 筛选出id=list的div标签
bf = BeautifulSoup(req.text,"html.parser")
lists = bf.find_all('div',id='list')
lists = lists[0]
# 再次使用bs,从lists中筛选出所有的标签a
bf_a = BeautifulSoup(str(lists), 'html.parser') # 不加str()会报错
a = bf_a.find_all('a')
titles = [] # 存放章节名称
urls = [] # 存放章节链接
for s in a:
titles.append(s.string)
urls.append(target + s.get('href')) # 完整链接
print(titles)
print(urls)
修改后的输出结果