战网无极限 发表于 2020-12-23 17:08

【python】新手实战写的小说爬取【新笔趣阁】

本帖最后由 战网无极限 于 2020-12-23 19:48 编辑

刚学习python 今天实践一下,因为个人比较喜欢看小说就写了一个新笔趣阁的爬虫
望大佬指点,因为还没学多线程所以是个单线程的
看了一下其他人的帖子,我又添加了从中间某一章开始下载的功能
import os
import re

import requests

headers = {
    'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}
# 书名存储变量
name = ''
zhang = 0


def get_urls(url):
    # 请求网址
    html = requests.get(url, headers=headers)
    # 指定页面编码
    html.encoding = html.apparent_encoding
    # 用正则获取章节URL
    reg = r"<dd><a href='(.*?)' >(.*?)</a></dd>"
    urls = re.findall(reg, html.text)
    # 用正则获取章节名
    reg2 = r"<h1>(.*?)</h1>"
    name = re.findall(reg2, html.text)
    return urls, name


def download_book(urls, zhang):
    # 循环输出章节URL
    for url in urls:
      # 章节URL
      bookUrl = url
      # 获取到的URL如下:/10/10489/4535761.html 所以要拼接一下
      bookUrl = 'http://www.xbiquge.la' + bookUrl
      bookTitle = url
      # 删除章节标题中可能影响创建文件的符号如:*?:/\\<>|
      bookTitle = re.sub('[*?:/\\<>|]', '', bookTitle)
      # 抓取每一章节内容
      chapter = requests.get(bookUrl, headers=headers)
      chapter.encoding = chapter.apparent_encoding
      chapter_reg = r'<div id="content">(.*?)<p><a href='
      chapter_content = re.findall(chapter_reg, chapter.text)
      # 转化list为str
      data = str(chapter_content)
      # 替换章节内容中的字符
      data = re.sub('[\r\[\]]', '', data)
      data = data.replace(' ', ' ').replace('<br />', '').replace('\\r\\r', '').replace('\'', '')
      # 将数据写入文档
      print("正在下载:%s" % bookTitle)
      with open('./Books/' + name + '/{}.txt'.format(bookTitle), 'w+', encoding='gbk') as f:
            f.write(data)
            f.close()


def mkdir(name):
    folder = os.path.exists('Books\\' + name)
    if not folder:# 判断是否存在文件夹如果不存在则创建为文件夹
      os.makedirs('Books\\' + name)# makedirs 创建文件时如果路径不存在会创建这个路径
      print('文件夹不存在,已创建')
    else:
      print('文件夹存在')


if __name__ == '__main__':
    print("书籍ID由新笔趣阁:www.xbiquge.la 提供")
    bookId = input("请输入书籍ID:")
    url = 'http://www.xbiquge.la/1/'
    url = url + bookId + '/'
    # url = 'http://www.xbiquge.la/1/1618'
    zhang = int(input("请输入开始章节:"))
    zhang = zhang - 1
    urls = get_urls(url)
    name = get_urls(url)
    name = str(name)
    name = name.replace("['", "").replace("']", "")
    mkdir(name)
    download_book(urls, zhang)




fenc 发表于 2020-12-23 18:51

顶楼主一个

woshicp 发表于 2020-12-23 17:13

章节都是分开的,最好爬到一个文件里面

战网无极限 发表于 2020-12-23 17:15

woshicp 发表于 2020-12-23 17:13
章节都是分开的,最好爬到一个文件里面

倒也是可以,将写文件放到循环外,用list存下所有章节内容再转换一下存储就可以了

liuchenxii 发表于 2020-12-23 17:40

这个怎么感觉只爬取了字符,空格全没了

战网无极限 发表于 2020-12-23 17:42

liuchenxii 发表于 2020-12-23 17:40
这个怎么感觉只爬取了字符,空格全没了

一开始空格太多,只想着删掉,倒是忘了考虑这一茬了

云岛鹤川 发表于 2020-12-23 17:55

可以 学习学习

战网无极限 发表于 2020-12-23 18:15

一会去看一下从中间章开始下载

brightwill 发表于 2020-12-23 18:16

这个r开头的,表示是正则?r"<h1>(.*?)</h1>"

战网无极限 发表于 2020-12-23 18:22

brightwill 发表于 2020-12-23 18:16
这个r开头的,表示是正则?r"(.*?)"

是的,引号里是正则表达式,是最简单的一种之一
页: [1] 2
查看完整版本: 【python】新手实战写的小说爬取【新笔趣阁】