前面我们已经完成了单章小说的爬取,现在我们来爬取整本小说
在小说网站里没不 小说都有自己的章节目录,里面记录了所有的小说章节地址。
我们要想获取整本小说就要先得到小说的章节列表
m.50zw.la的章节列表格式为http://m.50zw.la/chapters_加上小说id,即http://m.50zw.la/chapters_1/这个链接指向的是id为1的小说的章节列表。
对网页结构的分析就不多说了,直接上代码:
import requests
import os
from bs4 import BeautifulSoup
url = 'http://m.50zw.la/chapters_4598/'
web_url = 'http://m.50zw.la'
re_header = {
'Referer':'http://m.50zw.la/',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36'
}
chapter_list = []
i = 1
while 1:
#获取网页
#更改编码
#获得BeautifulSoup对象
#获取章节列表
#url + str(i)第i页的url
r = requests.get(url + str(i),params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
i+=1
print(url + str(i))
temp_list = soup.select('.last9 a')
for t in range(len(temp_list)):
temp_list[t] = temp_list[t]['href']
del temp_list[0]
if(len(temp_list)==0):
break
chapter_list.extend(temp_list)
for t in chapter_list:
print(t)
将章节列表打印出来,我们发现之前获取到的章节链接全部是相对地址,我们还需要在前面加上主站地址
#将上面的for循环修改如下
for i in range(len(chapter_list)):
chapter_list[i] = 'http://m.50zw.la' + chapter_list[i]
print(chapter_list[i])
获取章节内容的代码如下:
#打开/创建文件
fo = open('1.txt','wb')
for t in chapter_list:
#获取第一页页面
r = requests.get(t,params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
#这个网站把每个章节分为两页,要分两次获取
#获取章节名和第一页的内容
title = soup.select('.nr_title')[0].text
content_1 = soup.select('#nr1')[0].text
#获取第二页页面
r = requests.get(t.replace('.html','_2.html'),params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
#第二部分章节内容
content_2 = soup.select('#nr1')[0].text
#拼接两部分内容 详细请搜索字符串join方法
str1 = ''
chapter_content = str1.join([content_1,content_2])
#写入章节名和内容
fo.write((title).encode('utf-8'))
fo.write((chapter_content).encode('utf-8'))
#打印提示
print(title + '已下载')
#关闭文件
fo.close()
import requests
import os
from bs4 import BeautifulSoup
url = 'http://m.50zw.la/chapters_4598/'
web_url = 'http://m.50zw.la'
re_header = {
'Referer':'http://m.50zw.la/',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36'
}
'''***************************获取章节列表**********************************'''
chapter_list = []
i = 1
while 1:
#获取网页
#更改编码
#获得BeautifulSoup对象
#获取章节列表
#url + str(i)第i页的url
r = requests.get(url + str(i),params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
i+=1
print(url + str(i))
temp_list = soup.select('.last9 a')
for t in range(len(temp_list)):
temp_list[t] = temp_list[t]['href']
del temp_list[0]
if(len(temp_list)==0):
break
chapter_list.extend(temp_list)
for i in range(len(chapter_list)):
chapter_list[i] = 'http://m.50zw.la' + chapter_list[i]
print(chapter_list[i])
'''***********************************获取章节内容*************************'''
#打开/创建文件
fo = open('1.txt','wb')
for t in chapter_list:
#获取第一页页面
r = requests.get(t,params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
#这个网站把每个章节分为两页,要分两次获取
#获取章节名和第一页的内容
title = soup.select('.nr_title')[0].text
content_1 = soup.select('#nr1')[0].text
#获取第二页页面
r = requests.get(t.replace('.html','_2.html'),params=re_header)
r.encoding = 'gbk'
soup = BeautifulSoup(r.text,"html.parser")
#第二部分章节内容
content_2 = soup.select('#nr1')[0].text
#拼接两部分内容 详细请搜索字符串join方法
str1 = ''
chapter_content = str1.join([content_1,content_2])
#写入章节名和内容
fo.write((title).encode('utf-8'))
fo.write((chapter_content).encode('utf-8'))
#打印提示
print(title + '已下载')
#关闭文件
fo.close()
print('下载成功')
虽然我们爬取到了整本小说,但速度实在是不能忍,所以我用多线程优化了一下
下一篇:多线程爬取单本小说