python学习(二)爬虫——爬取网站小说并保存为txt文件(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40695895/article/details/79617634

前面我们已经完成了单章小说的爬取,现在我们来爬取整本小说

一:获取小说章节列表

在小说网站里没不 小说都有自己的章节目录,里面记录了所有的小说章节地址。
我们要想获取整本小说就要先得到小说的章节列表
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('下载成功')

虽然我们爬取到了整本小说,但速度实在是不能忍,所以我用多线程优化了一下

下一篇:多线程爬取单本小说

展开阅读全文

没有更多推荐了,返回首页