前面我们已经完成了单章小说的爬取,现在我们来爬取整本小说
一:获取小说章节列表
在小说网站里没不 小说都有自己的章节目录,里面记录了所有的小说章节地址。
我们要想获取整本小说就要先得到小说的章节列表
m.50zw.la的章节列表格式为http://m.50zw.la/chapters_加上小说id,即http://m.50zw.la/chapters_1/这个链接指向的是id为1的小说的章节列表。
对网页结构的分析就不多说了,直接上代码:
import requestsimport osfrom bs4 import BeautifulSoupurl = '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 = 1while 1:#获取网页#更改编码#获得BeautifulSoup对象#获取章节列表#url + str(i)第i页的urlr = requests.get(url + str(i),params=re_header)r.encoding = 'gbk'soup = BeautifulSoup(r.text,"html.parser")i+=1print(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):breakchapter_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].textcontent_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 requestsimport osfrom bs4 import BeautifulSoupurl = '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 = 1while 1:#获取网页#更改编码#获得BeautifulSoup对象#获取章节列表#url + str(i)第i页的urlr = requests.get(url + str(i),params=re_header)r.encoding = 'gbk'soup = BeautifulSoup(r.text,"html.parser")i+=1print(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):breakchapter_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].textcontent_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('下载成功')
虽然我们爬取到了整本小说,但速度实在是不能忍,所以我用多线程优化了一下
下一篇:多线程爬取单本小说