import urllib.request
import re
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")
html = urllib.request.urlopen(req)
html = html.read()
return html
def txt_name(url):
html = urlopen(url)
html = html.decode('utf-8')
htm = BeautifulSoup(html,'lxml')
htm = htm.strong.string
#第一个页面 小说名字获取
return htm
def url_index(url):
html = urlopen(url)
html = html.decode('utf-8')
htm = re.search(r'<a href="https://.*?/index.html"><img src="/images/dian.gif" border="0">',html)
#这个 /images/dian.gif 有唯一性 所以我用正则表达式
htm = htm.group()
htm = BeautifulSoup(htm,'lxml')
url = htm.a.attrs
# 这一代html 代码拿到后就可以用 bs4 链接是a 然后a.attrs 这个方法会把链接变成一个字典
url = url['href']
# href 这个字典的键就取得了小说列表链接
return url
#已经获取得小说index链接的列表地址
def url_one(url):
con = urlopen(url)
con = con.decode('utf-8')
html = re.search(r'<dd><a href="\d*?.html">...*?</a></dd>',con)
#这个内容的链接并没有按序排,但小说是一定需要按顺序排的 我找到第一个链接 然后按下一页的链接去获取
#这样会很慢,但是我暂时没有其它办法
html = html.group()
html = BeautifulSoup(html,'lxml')
url2 = html.a.attrs
url2 = url2['href']
url2 = url[:-10]+url2
#这里获取到第一个链接的地址要加上页面地址才是一个完整的
url = url2
#获取第一章链接
return url
def cont_list(url):
html = urlopen(url)
html = html.decode('utf-8')
content = re.search(r'<a href=".*?\.html">下一页</a>',html)
#这里就是开始访问第一个链接 然后找到里面的下一页链接
content = content.group()
htm = BeautifulSoup(content,'lxml')
htm = htm.a.attrs
htm = htm['href']
url_2 = re.search (r'(https://www.bxwx9.org/.*?/.*?/.*?/)(.*?\.htm)',url)
url_2 = url_2.group(1)
url_2 = url_2+htm
url = url_2
#这里就是获取到的下一个链接
#获取下一章链接
return url
def contentlist(url):
index = url_index(url)
#这里获取小说列表的首页
urlone = url_one(index)
#这里是小说的第一章链接
urllist = []
#这里建个列表用来存小说链接 按先后顺序
urllist.append(urlone)
#这里先把第一个链接存进去
while urlone != index:
#这个循环的条件是如果下一页变成了小说列表页就退出因为最后一个页面是这样的
urlone = cont_list(urlone)
#这里每次循环就把urlone 改变成为下一个链接
urllist.append(urlone)
#这样就把获取到的链接存起来,这样就把所有的链接按顺序都存好了
print(urlone)
return urllist
def xia(url):
name = txt_name(url)
name = name+'.txt'
list1 = contentlist(url)
#现在找到所有的链接了就可以下载内容了
for i in list1[:-1]:
#这里写的是list1[:-1]就是不要最后一个链接 因为最后一个链接是小说列表页
html = urlopen(i)
#这里获取到小说内容页
html = html.decode('utf-8')
title = html
title = BeautifulSoup(title,'lxml')
#然后找到说小的标题
title = title.find_all(id="title")
#这返回的是一个列表所以要取出来
title = title[0]
title = title.string
#title.string 这就只取字符串 这是内容标题
htm = re.search(r'(<div id="adright"></div>)(.*?)(</div>)',html)
htm = htm.group(2)
#然后找内容 用正则吧 bs4 没有那么熟悉
htm = BeautifulSoup(htm,'lxml')
htm = htm.text
#text 就是里面的内容
aa = re.compile('\xa0')
#然后取掉不能解码的内容
content_htm = re.sub(aa,'',htm)
#这就是小说的正文了
with open(name,'a')as f:
#然后打开方式用a是追加模式 可以写了一次再写一次
f.write(title)
#先写标题
f.write(content_htm)
#再写内容
print(i)
#输入写入的链接 为了方便看哈
#cotnent_htm这是内容
url = 'https://www.bxwx9.org/binfo/5/5740.htm'
xia(url)
笔下文学 python3 小说爬虫代码
猜你喜欢
转载自blog.csdn.net/AnYeZhiYin/article/details/83029291
今日推荐
周排行