toxyf 发表于 2022-11-9 21:31

笔趣阁小说爬虫下载

Python爬虫新手,第一个项目是笔趣阁小说下载,感觉有很多可以改正的地方,欢迎大佬批评。

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

# 下载链接的前缀,‘944’是《剑来》的地址,想下载其他书可以查看原网页换地址
first_url = 'https://www.bqg99.com/book/944/'

basic_url = {
    'whole': None,
    'index': 1
}

custom_header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35'
}

# 下载好的小说
output = 'D:/Data/novel.txt'


# 更新网页链接
def update_link(url_dict):
    url_dict['whole'] = first_url + str(url_dict['index']) + '.html'
    url_dict['index'] = url_dict['index'] + 1
    print(url_dict['whole'])
    return url_dict


# 通过GET方法获取网页文本内容
def fetch_text(url_dict, request_header):
    data = requests.get(url=url_dict['whole'], headers=request_header, allow_redirects=False)
    print('status = %d' % data.status_code)
    if data.status_code == 302:
      return None
    else:
      data = BeautifulSoup(data.text, 'lxml')
      article = data.find(name='div', class_='content')
      chapter_topic = article.h1.text
      content_soup = article.find(name='div', id='chaptercontent', class_='Readarea ReadAjax_content')
      content_soup.p.decompose()        # 去掉多余的“上一章”、“下一章”的导航链接
      charter_words = content_soup.stripped_strings
      chapter = {
            'topic': chapter_topic,
            'content': charter_words
      }

      return chapter


def main():
    novel = open(file=output, mode='a+', encoding='utf8')

    link = update_link(basic_url)
    text = fetch_text(url_dict=link, request_header=custom_header)

    while text is not None:
      novel.write(text['topic'])
      novel.write('\n')
      for line in text['content']:
            line = line
            novel.write(line)
            novel.write('\n')
      novel.write('\n\n')
      time.sleep(1)        # 暂停1秒,防止服务器拒绝,不过这个网站好像没有反爬机制

      link = update_link(link)
      text = fetch_text(url_dict=link, request_header=custom_header)

    novel.close()


if __name__ == '__main__':
    main()








konley 发表于 2022-11-9 23:39

用bs4+requests实现这样子的效果已经很不错啦~ 后面可以按这样子的思路慢慢完善:保存的小说名和路径不要写死→界面不美观加个进度条吧~→用lxml的xpath解析(更简洁)→selenium解决一些玄学问题→(协程)异步爬取→epub格式小说的制作(提取目录)等等
看了一遍代码 这里可以改一下 详情看注释:

novel.write(text['topic'])
      novel.write('\n')
      lines = list(text['content'])# 将generator转为list 方便控制line
      for line in lines[:-1]:# 每篇小说的倒数第一行是网站水印 不添加进txt
            novel.write(line)
            novel.write('\n')
      novel.write('\n\n')

lsy832 发表于 2022-11-9 22:01

谢谢分享源码

kant101x 发表于 2022-11-9 23:58

精彩,学到了。

airwenlee 发表于 2022-11-10 01:05

哪位帮忙做个阅读app的书源,这个网站不错

szs6008 发表于 2022-11-10 05:16

谢谢分享源码

tzlqjyx 发表于 2022-11-10 07:06

谢谢分享,后续可以在你这代码上修改

kooke2008 发表于 2022-11-10 08:30

很好的建议,我也喜欢看《剑来》,这个码真的好。

Wapj_Wolf 发表于 2022-11-10 08:37

我只是了为学习PY,绝对不是为了爬书。真的……

12394613643 发表于 2022-11-10 08:39

又得费眼了
页: [1] 2 3 4
查看完整版本: 笔趣阁小说爬虫下载