当前位置:   article > 正文

基础篇 浅试Python爬虫爬取小说_python爬虫 小说

python爬虫 小说

初学者 使用Python爬取小说

学习的原文文档

1.前置

pip install beautifulsoup4
  • 1

2.确定爬取的目标地址

我用的是笔趣看 下载网文标志性的小说斗破苍穹
例如斗破苍穹目录地址 里面有全部章节的目录并且附带文章连接,这个给后续工作提供极大的便利在这里插入图片描述

3.爬取工作正式开始

3.1 尝试爬取整个网页

# -*- coding:UTF-8 -*-

from bs4 import BeautifulSoup
import requests,sys

res = requests.get('https://www.biqukan.cc/article/4138/')
html = res.text
print(html)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

看图可以正确拿到网页数据
在这里插入图片描述有了这些数据之后就需要解析,浏览器开发者模式里面更直观
在这里插入图片描述

3.2拿到div标签下面的ul

可以看到整个目录的文章都包含在div.mu_contain>ul.mulu_list>li>a
也就是说我们只要将爬取的文本解析成html,然后根据标签解析ul中class为mulu_list的文章就可以

#解析UL标签
bf_ul = BeautifulSoup(html,'html.parser')
ul = bf_ul.find_all('ul',class_='mulu_list')
print(ul)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

3.3套娃操作,从获取的ul下拿到a标签内容

然后再解析一次拿到ul标签中的a标签

#解析li中的a
bf_a = BeautifulSoup(str(ul[0]),'html.parser')
a = bf_a.find_all('a')
print(a)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
遍历一下a标签,string拿到a标签文本,通过get a标签的href属性拿到链接

for item in a:
  print(item.string,item.get('href'))
  • 1
  • 2

在这里插入图片描述这样获取目录的内容就完成

4.获取正文内容

原理同上,解析网页中对应文章的标签正文标签为div.chapter-content
在这里插入图片描述
解析正文

res = requests.get('https://www.biqukan.cc/article/4138/2267695.html')
html = res.text
# 解析标签为div.chapter-content
bf = BeautifulSoup(html,'html.parser')
texts = bf.find_all('div',class_='chapter-content')
# 正则表达式剔除多余的空格
texts = texts[0].text.replace('\xa0'*8,'\n\n')
print(texts)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述到这里就能解析小说文章的内容了

5.解析文章并将内容写道记事本上

将上面的两个方法组合一下,遍历目录的时候爬取每一章节的文本

# -*- coding:UTF-8 -*-

from bs4 import BeautifulSoup
import requests,sys

"""
  下载笔趣看小说《斗破苍穹》
"""

class downloader(object):
#定义参数
  def __init__(self) -> None:
    self.server = 'https://www.biqukan.cc/'  # 网站根节点
    self.target = 'https://www.biqukan.cc/article/4138/' # 斗破苍穹章节目录
    self.names = [] # 章节名
    self.urls = [] # 章节链接
    self.nums = 0 # 章节计数

#解析下载章节的URL
  def getDownloadUrl(self):
    res = requests.get(url = self.target) #获取网页目标数据
    html = res.text #获取网页页面内容
    #解析标签为ul.mulu_list>li>a
    #解析ul
    ul_bf = BeautifulSoup(html,'html.parser')
    ul = ul_bf.find_all('ul',class_='mulu_list')
    #解析li中的a标签
    a_bf = BeautifulSoup(str(ul[0]),'html.parser')
    a = a_bf.find_all('a')
    # 获取总章节数 用于接下来的遍历
    self.nums = len(a)
    # 遍历存储章节对应的目录及链接
    for item in a:
      self.names.append(item.string) # 章节名字
      self.urls.append(self.target+item.get('href')) #章节路径


#解析正文
  def getContent(self,target:str):
    res = requests.get(url = target)
    html = res.text
    # 解析标签为div.chapter-content
    bf = BeautifulSoup(html,'html.parser')
    texts = bf.find_all('div',class_='chapter-content')
    # 正则表达式剔除多余的空格
    texts = texts[0].text.replace('\xa0'*8,'\n\n')
    return texts


# 写入文件
  def saveFiles(self,name,path,text):
    write_flag = True
    with open(path,'a',encoding='utf-8') as f:
      f.write(name+'\n')
      f.writelines(text)
      f.write('\n\n')


# 获取正文
if __name__ == '__main__':
  dl = downloader()
  dl.getDownloadUrl()
  print('下载《斗破苍穹》')
  for i in range(dl.nums):
    dl.saveFiles(dl.names[i],'斗破苍穹.txt',dl.getContent(dl.urls[i]))
    sys.stdout.write("下载进度:%.3f%%" % float(i/dl.nums)+'\r')
    sys.stdout.flush()
  print("下载完成")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

单线程爬取速度较慢,最好是晚上放着跑就行了
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/792276
推荐阅读
相关标签
  

闽ICP备14008679号