想爬取小说?!请你和我这样做

前言

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

爬取小说思路

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


在这里插入图片描述

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


在这里插入图片描述

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

功能模块实现

理清楚思路后,就按照步骤一步一步完成功能。
1.使用request请求库和数据清洗匹配的re库

import requests
import re

re模块是python独有的匹配字符串的模块,这个模块中的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都是通用的。注意:(1)re模块是python独有的;(2)正则表达式所有编程语言都可以使用;(3)re模块、正则表达式是对字符串进行操作。

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 = 'https://www.xsbiquge.com'+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 requests
import re

s = 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 = 'https://www.xsbiquge.com'+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()

- 关于 re 使用,参考 这儿

总结

通过该项目,进行设计并实现系统整体的功能模块,使我受益颇深,提升了我自学的能力,尤其是在数据挖掘和数据分析方面有了更深入的认识。
程序代码实现了爬取小说的功能,对数据进行了清洗。但这只是对一本小说进行爬取,如果在功能模块上添加一个大的循环就可以获得网站所有小说的url了。这是我的想法以及思路,如果你有其他的思路,可以评论交流一下,大家互相学习进步想学习python的也可以私信我。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容