找回密码
  注册[Register]
查看: 325|回复: 8

[python] 小说网站爬虫

[复制链接]
发表于 2023-7-24 12:16 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

              小说网站网址,我没写出来,怕不符合论坛规则,大家借鉴一下思路就好哈。。

'''
    下载 XX小说网 小说脚本
'''
[Python] 纯文本查看 复制代码
import sys
import requests
import parsel
from concurrent.futures import ThreadPoolExecutor, as_completed
#运行脚本 C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe .\download_XXX_com.py
# 定义请求头
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'}
# 要获取的小说网页
url = 'https://www.XXX.com/book/76780/'
# 获取网页内容
def get_url_html(url : str) -> str:
    # 调用第三方库requests发送请求,模拟浏览器访问
    response = requests.get(url, headers=headers)
    # 网页响应后根据网页文字内容自动转码为utf-8格式
    response.encoding = response.apparent_encoding
    # 响应数据转换为可视的网页文本信息
    html = response.text
    return html
# 获取标题
def parse_get_title(context : str) -> str:
    selector = parsel.Selector(context)
    title = selector.xpath('/html/body/div/div[2]/div[1]/div[1]/div[2]/h1/text()').get()
    return title
# 获取所有章节信息
def parse_get_chapter(context : str) -> list:
    l_ret = []
   
    selector = parsel.Selector(context)
    lis = selector.css('#play_0 > ul > li')
    for li in lis:
        info = {}
        info['name'] = li.xpath('a/text()').get()   
        info['url'] = li.xpath('a/@href').get()
        l_ret.append(info)

    return l_ret
# 解析单章节内容
def parse_get_one_chapter(context : str) -> str:
    ##content > p:nth-child(5)         
    r = ''
   
    selector = parsel.Selector(context)
    lc = selector.css('#content > p::text').getall()[1:]
    for l in lc:
        r = r + '    ' + l + '\r\n'
  
    #第二页
    # ‘#content > div.m-tpage > ul > li.col-md-4.col-xs-12.col-sm-12 > a’
    next_page_name = selector.css("#content > div.m-tpage > ul > li.col-md-4.col-xs-12.col-sm-12 > a::text").get()
    if next_page_name == '下一页':
        next_page_href = selector.css("#content > div.m-tpage > ul > li.col-md-4.col-xs-12.col-sm-12 > a::attr(href)").get()
        next_page_url = url[0 : url.index('/book')] + next_page_href
        next_page_content = get_url_html(next_page_url)
        next_selector = parsel.Selector(next_page_content)
        next_lc = next_selector.css('#content > p::text').getall()[1:]
        for l in next_lc:
            r = r + '    ' + l + '\r\n'
   
    r = r.replace('&nb','')
    return r   
# 线程获取单章节内容
def thread_spider(chapter_info : dict):
    name = chapter_info['name']
    url_c  = chapter_info['url']
    # 第一页
    context = get_url_html(url_c)
    rc = parse_get_one_chapter(context)
   
    chapter_info['context'] = rc
    return  chapter_info   
def main():
    # 获取主网页内容
    html_content = get_url_html(url)
    # 获取小说标题
    story_title = parse_get_title(html_content)
    # 获取章节列表
    list_chapter_info = parse_get_chapter(html_content)
    # 线程池 获取所有章节内容 最大16个线程同时跑
    with ThreadPoolExecutor(max_workers=16) as t:
        obj_list = []
        # 把要做的事情挂到线程
        for chapter_info in list_chapter_info:
            obj = t.submit(thread_spider, chapter_info)
            obj_list.append(obj)
        # 等待所有线程结束
        for future in as_completed(obj_list):
            data = future.result()
            print(data)
            print('*' * 50)
            
    # 获取到的内容写入文件        
    with open(story_title + '.txt','w') as f:
        for chapter_info in list_chapter_info:
            f.write('\r\n')
            f.write(chapter_info['name'])
            f.write('\r\n')
            f.write(chapter_info['context'])
        
if __name__ == '__main__':
    main()

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2023-7-24 12:40 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 13:08 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 13:30 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 13:45 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 14:06 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 14:34 | 显示全部楼层
先收藏了,万一用到呢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 14:43 | 显示全部楼层
谢谢大佬分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2023-7-24 14:47 | 显示全部楼层
谢谢分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-4-28 15:23 , Processed in 0.040700 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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