准备工作
先导入
具体怎么导入自行百度。
话不多说上代码
import pprint
import requests
from bs4 import BeautifulSoup
# 获取源码
def get_source(url):
r = requests.get(url)
if r.status_code != 200:
print(r.status_code+"错误")
raise Exception("error")
source = r.text
return source
url = "http://m.qushuba.com/shu31332/mulu.html"
html = get_source(url)
# 解析出章节名以及连接(目录)
def parse_title_href(html_source):
soup = BeautifulSoup(html_source, "html.parser")
# 获取class为chapter的ul标签中的所有li标签
lis = soup.find("ul", class_="chapter").find_all("li")
datas = []
for li in lis:
title_node = li.find("a") # 获取章节链接
title = title_node.get_text() # 获取章节名
link = "http://m.qushuba.com/shu31332/"+title_node["href"] # 补全章节连接
datas.append({"title": title, "link": link})
return datas
# 解析正文
def parse_body(link_html):
soup = BeautifulSoup(link_html, "html.parser")
# 从class和id为nr_title的div中获取章节名
title = soup.find("div", class_="nr_title",
id="nr_title").get_text() # get_text()只获取文本内容
# 从id为nr1的div中获取正文
txt = soup.find("div", id="nr1")
# 将正文转为str字符串类型
s = str(txt)
# 将正文字符串中所有<br/>标签替换为\n换行符
# 别问,问就是不知道
s_replace = s.replace('<br/>', "\n")
while True:
index_begin = s_replace.find("<")
index_end = s_replace.find(">", index_begin + 1)
if index_begin == -1:
break
s_replace = s_replace.replace(s_replace[index_begin:index_end+1], "")
# 将str对象s_replace转为object类型,同时将标题(title)和内容(s_replace)组合
sb = bytes(title+'\n'+s_replace+'\n\n', encoding="utf8")
# 以可追加二进制方式写入文件,a:可追加,b:二进制流
with open("E:\Dk\沧元图.txt", "ab") as ob:
ob.write(sb)
txts = parse_title_href(html)
# 遍历章节链接列表
for i in range(len(txts)):
# 倒序读取章节链接列表
link_html = txts[len(txts)-i-1]
# 获取章节地址
https = get_source(link_html['link'])
# 爬取正文
parse_body(https)
pprint.pprint("第"+str(i+1)+"章爬取结束")