想要看免费小说吗?想爬取小说?那就请你和我一起这样做吧

前言

这个学期开始接触的python,我认为简单易用就是python的最大的优点,对代码的格式要求不是很严格,编写代码的使用感极佳,python里我最感兴趣的就是爬虫,学会爬虫可以获得更多的数据,然后更好的进行数据分析,能获得更多的价值

爬取小说思路

先观察小说,辨别它是静态的还是动态的,随意点开一本小说的一个章节,通过F12的Elements选项可以检查到文章内容存于div id=‘content’ 标签中,说明这个网站是静态的,你想使用动态的Selenium爬取,也是可以的,只不过网站是静态的,我们就没必要用动态法去爬取了。

然后选取目标小说之后,点击小说目录页面,通过F12的Elements选项可以观察到小说所有章节的url都是有规则的。

爬取到所有章节的url进行1保存,然后对url进行完善,再进入每一章节对标题和正文内容进行爬取,再保存到txt中中。

功能模块实现

理清楚思路后,就按照步骤一步一步完成功能。

1.使用request请求库和数据清洗匹配的re库

import requestsimport re
re模块是python独有的匹配字符串的模块,这个模块中的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都是通用的。注意:

(1)re模块是python独有的;

(2)正则表达式所有编程语言都可以使用;

(3)re模块、正则表达式是对字符串进行操作。

我这有一个学习交流的圈子,虽然人数不是很多,但是各位学习python的小伙伴一起来学习交流,遇到什么问题
相互讨论,互相交流学术问题。学习交流企鹅群:745895701

2.对目标网站发送url请求

s = requests.Session()url = 'https://www.xsbiquge.com/96_96293/'html = s.get(url)html.encoding = 'utf-8'

3.对网站目录页查找所有章节的url

#获取章节
caption_title_1 = re.findall(r'<a href="(/96_96293/.*?\.html)">.*?</a>',html.text) 

4.为了方便再次方问,对获取所有的章节url进行完善

for i in caption_title_1:   caption_title_1 = '新笔趣阁_书友最值得收藏的网络小说阅读网!'+i 

5.对获取的每一张url进行访问寻找标题和正文内容

s1 = requests.Session()r1 = s1.get(caption_title_1)r1.encoding = 'utf-8' # 获取章节名
#meta是head头文件中的内容,用这个获取章节名
name = re.findall(r'<meta name="keywords" content="(.*?)" />',r1.text)[0]print(name)
#这里print出章节名,方便程序运行后检查文本保存有无遗漏
chapters = re.findall(r'<div id="content">(.*?)</div>',r1.text,re.S)[0] 

6.对获取的正文内容进行清洗

chapters = chapters.replace(' ', '')  
chapters = chapters.replace('readx();', '')  
chapters = chapters.replace('& lt;!--go - - & gt;', '')  
chapters = chapters.replace('&lt;!--go--&gt;', '')  
chapters = chapters.replace('()', '')  # 转换字符串  
s = str(chapters)  #将内容中的<br>替换  
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],"")  
pattern = re.compile(r'&nbsp;',re.I)#使匹配对大小写不敏感  
fiction = pattern.sub(' ',s_replace)

7.将数据保存到预先设定的txt中

path = r'F:\title.txt'     # 这是我存放的位置,你可以进行更改#a是追加
file_name = open(path,'a',encoding='utf-8')
file_name.write(name)
file_name.write('\n')
file_name.write(fiction)
file_name.write('\n')#保存完之后关闭
file_name.close() 

运行结果


程序源码

import requestsimport res = requests.Session()url = 'https://www.xsbiquge.com/96_96293/'
html = s.get(url)html.encoding = 'utf-8'# 获取章节
caption_title_1 = re.findall(r'<a href="(/96_96293/.*?\.html)">.*?</a>',html.text)
# 写文件+path = r'F:\title.txt'     
# 这是我存放的位置,你可以进行更改
#a是追加
file_name = open(path,'a',encoding='utf-8')
# 循环下载每一张
for i in caption_title_1:   caption_title_1 = '新笔趣阁_书友最值得收藏的网络小说阅读网!'+i   
# 网页源代码   
s1 = requests.Session()   
r1 = s1.get(caption_title_1)   
r1.encoding = 'utf-8'  
# 获取章节名   
#meta是head头文件中的内容,用这个获取章节名   name = re.findall(r'<meta name="keywords" content="(.*?)" />',r1.text)[0]   
print(name)   
file_name.write(name)   
file_name.write('\n')   
# 获取章节内容   
#re.S在字符串a中,包含换行符\n,在这种情况下:   
#如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。   
chapters = re.findall(r'<div id="content">(.*?)</div>',r1.text,re.S)[0]   
#换行   
chapters = chapters.replace(' ', '')   
chapters = chapters.replace('readx();', '')   
chapters = chapters.replace('& lt;!--go - - & gt;', '')   
chapters = chapters.replace('&lt;!--go--&gt;', '')   
chapters = chapters.replace('()', '')   # 转换字符串   
s = str(chapters)   #将内容中的<br>替换   
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],"")  
pattern = re.compile(r'&nbsp;',re.I)#使匹配对大小写不敏感   
fiction = pattern.sub(' ',s_replace)   
file_name.write(fiction)   
file_name.write('\n')file_name.close()

总结

通过该项目,进行设计并实现系统整体的功能模块,使我受益颇深,提升了我自学的能力,尤其是在数据挖掘和数据分析方面有了更深入的认识。

程序代码实现了爬取小说的功能,对数据进行了清洗。但这只是对一本小说进行爬取,如果在功能模块上添加一个大的循环就可以获得网站所有小说的url了。这是我的想法以及思路,如果你有其他的思路,可以评论交流一下。

猜你喜欢

转载自blog.csdn.net/Python_xiaobang/article/details/112919146
今日推荐