Python爬取笔趣阁小说

上一篇文章中,我们爬取了猫眼网的电影排行Top100,可以看至今为止最受欢迎的各类大片,今天我们走进小说阅读的世界,对于爱看小说又不想花钱的你,这可是大大的福利,先牛刀小试一下,我们爬取一部小说,这次代码也是大叔自己独立完成的,中间出现了许多问题,但是都逐一解决了。今天爬取的小说名字为天龙之祸害武林,额,一听名字。。。我就不想看了,这也是半个小时前我临时决定爬取的,篇幅较短,内容不作评价,反正只是爬取的素材而已,话不多说,来看具体过程。
  首先,依然导入我们需要的库,比之上次,这次增加了Python自带的time和re,os,编写途中由于是完成测试,就想爬取完毕自动关机,至于re,笔者也正在学习,之后会出一篇用正则获取文本的文章。

import requests,time,re
from bs4 import BeautifulSoup
import bs4,os

之后定一个函数用来获取页面,这里得提一下,笔趣阁网站设置了反爬机制,还得设置证书和头文件信息,网站正常响应时的状态码均为200,我们可以以此为条件进行判断,最后返回值为response.text

def get_one_page(url):
  headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 '
                   'Safari/537.36 '
  }
  requests.packages.urllib3.disable_warnings()  #避免出现警告信息
  response = requests.get(url,headers=headers,verify=False)

  if response.status_code == 200:     #根据状态码判断是否访问成功
      response.encoding = response.apparent_encoding
      return response.text
  return None

接下来就是爬取的核心操作了,我们要在获取的整个页面中进行解析筛选我们需要的东西,首先运用BeautifulSoup进行解析,在源代码中我们注意到,每个章节的标题都在h1的标签中包含,所以根据节点直接就可以获取章节题目,正文的所有内容均在div,‘id=‘content’’的子标签下,我们用刚开始学的正则表达式re来获取下一个章节的地址,然后创建空列表来存放爬取的正文内容,返回值为存放文本的列表和下一章节的地址。

def parse_one_page(html):
  soup = BeautifulSoup(html,'lxml')
  chapter_name = soup.h1.string
  pattern = soup.find('div',{'id':'content'})
  next_url = re.search("下一章.*?报错欠更", html, re.S).group(2)
  book_list = []   #创建空列表用来存放文本内容
  book_list.append(chapter_name)
  if pattern:
      for br in pattern:
          if isinstance(br,bs4.element.NavigableString):  #文本类型为NavigableString
              # print(br.string)
              book_list.append(br.string)
  print(chapter_name,' 已经完成下载',' 下一章节:',next_url)
  return book_list,next_url

用各个函数后,将文本保存至本地,注意编码格式,以防万一全部修改为‘utf-8’,在最后一章节爬取后它会自动跳转至目录界面,我们以此为终点,至此,爬虫完毕,可以愉快的阅读了。

def main():
   start = time.clock()
   print('开始下载,请等待...')
   url = 'https://www.biquge.info/3_3368/1791070.html'
   while True:
       html = get_one_page(url)
       content,next_url= parse_one_page(html)
       with open('天龙祸害武林.txt','a+',encoding='utf-8') as f:
           for i in content:
               f.write(i)
       url = next_url
       if url == 'https://www.biquge.info/3_3368/':
           break
   print('下载已完成')
   end = time.clock()
   print('Running time:%.4s Seconds'%(end-start))
   # os.system('shutdown -s -t 30')

这是我们的爬取过程,每个章节爬取完毕都是自动显示下个章节地址,最后总计用时325秒,五分的时间爬取了一位比手数月的作品,嘎嘎,还是挺有成就感的。

第一卷 初入天龙 第一章 虐杀  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791073.html
第二章 拜师  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791074.html
第三章 弑师  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791076.html
第四章 逃  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791077.html
第五章 立誓  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791078.html
第六章 收服  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791079.html
第七章 玄苦  已经完成下载  下一章节: https://www.biquge.info/3_3368/1791080.html
下载已完成
Running time:325. Seconds

至此,本篇文章结束,之后的分享中会多用正则方法,同时打算把整个网站的所有小说都爬取下来,敬请期待,对于不懂的或者有什么意见欢迎留言或者私信。

你可能感兴趣的:(个人学习)