利用python来爬取网页上的小说(笔下文学的)
这是爬取并保存的元尊小说的txt文件
代码如下:
import urllib.request
import re
import gzip
from io import BytesIO
from bs4 import BeautifulSoup
// //打开链接
def urlopen(url):
req = urllib.request.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
req.add_header("Accept-Encoding","gzip")
html = urllib.request.urlopen(req)
html = html.read()
buff = BytesIO(html)
f = gzip.GzipFile(fileobj=buff)
html = f.read().decode('utf-8')
return html
// 获取小说名称
def txt_name(url):
html = urlopen(url)
htm = BeautifulSoup(html, 'html.parser')
htm = htm.strong.string
// 第一个页面 小说名字获取
return htm
// 获取小说列表页链接
def url_index(url):
html = urlopen(url)
htm = re.search(r'', html)
htm = htm.group()
htm = BeautifulSoup(htm, 'html.parser')
url = htm.a.attrs['href']
return url
// 获取小说第一章链接
def url_one(url):
con = urlopen(url)
html = re.search(r'...*? ', con)
// 这个内容的链接并没有按序排,但小说是一定需要按顺序排的 我找到第一个链接 然后按下一页的链接去获取
// 这样会很慢,但是我暂时没有其它办法
html = html.group()
html = BeautifulSoup(html, 'html.parser')
url2 = url[:-10] + html.a.attrs['href']
// 获取第一章链接
return url2
// 获取小说下一章链接
def cont_list(url):
html = urlopen(url)
content = re.search(r'下一页', html)
// 这里就是开始访问第一个链接 然后找到里面的下一页链接
content = content.group()
htm = BeautifulSoup(content, 'html.parser')
url_2 = re.search(r'(http://www.bxwx8.la/.*?/.*?/.*?/)(.*?\.htm)', url)
url_2 = url_2.group(1) + htm.a.attrs['href']
// 这里就是获取到的下一个链接
return url_2
// 获取小说所有章节链接 保存到数组中
def contentlist(url):
// 这里获取小说列表
index = url_index(url)
// 这里是小说的第一章链接
urlone = url_one(index)
// 这里建个列表用来存小说链接 按先后顺序
urllist = []
// 这里先把第一个链接存进去
urllist.append(urlone)
while urlone != index:
// 这个循环的条件是如果下一页变成了小说列表页就退出因为最后一个页面是这样的
urlone = cont_list(urlone)
// 把每一章的链接都保存到一个数组中
print(urllist)
urllist.append(urlone)
return urllist
//获取小说内容 保存到文件中
def bixiawenxue(url):
// 小说名称
name = txt_name(url)
// 创建文件 并打开
fn = open('%s.txt' % name, 'w', encoding='utf-8')
// 小说所有章节链接数组
list1 = contentlist(url)
// list1 = ['http://www.bxwx8.la/b/5/5740/1492083.html', 'http://www.bxwx8.la/b/5/5740/41209550.html', 'http://www.bxwx8.la/b/5/5740/41211210.html', 'http://www.bxwx8.la/b/5/5740/41212429.html']
// 这里写的是list1[:-1]就是不要最后一个链接 因为最后一个链接是小说列表页
for i in list1[:-1]:
// 获取到小说章节的html
html = urlopen(i)
title = BeautifulSoup(html, 'html.parser')
// 然后找到说小的标题
title = title.find_all(id="title")
// 这返回的是一个列表所以要取出来
title = title[0].string
// title.string 这就只取字符串 这是内容标题
htm = re.search(r'()(.*?)(