吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3626|回复: 15
收起左侧

[Python 转载] 【python】新手实战写的小说爬取【新笔趣阁】

  [复制链接]
战网无极限 发表于 2020-12-23 17:08
本帖最后由 战网无极限 于 2020-12-23 19:48 编辑

刚学习python 今天实践一下,因为个人比较喜欢看小说就写了一个新笔趣阁的爬虫
望大佬指点,因为还没学多线程所以是个单线程的
看了一下其他人的帖子,我又添加了从中间某一章开始下载的功能
[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[zhang:]:
        # 章节URL
        bookUrl = url[0]
        # 获取到的URL如下:/10/10489/4535761.html 所以要拼接一下
        bookUrl = 'http://www.xbiquge.la' + bookUrl
        bookTitle = url[1]
        # 删除章节标题中可能影响创建文件的符号如:*?:/\\<>|
        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)[0]
    name = get_urls(url)[1]
    name = str(name)
    name = name.replace("['", "").replace("']", "")
    mkdir(name)
    download_book(urls, zhang)

image.png
image.png
image.png
image.png

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
lesilence + 1 + 1 谢谢@Thanks!
woshicp + 1 + 1 热心回复!
yanyyuan + 1 热心回复!
tohjz + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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"(.*?)"

是的,引号里是正则表达式,是最简单的一种之一
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表