吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2189|回复: 48
收起左侧

[Python 原创] 小说网站爬虫

  [复制链接]
smile7788 发表于 2023-7-24 10:04
              小说网站网址,我没写出来,怕不符合论坛规则,大家借鉴一下思路就好哈。。

'''
    下载 XX小说网 小说脚本
'''
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()
   

免费评分

参与人数 6吾爱币 +10 热心值 +6 收起 理由
ushing + 1 + 1 用心讨论,共获提升!
苏紫方璇 + 5 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaopeng128 + 1 + 1 谢谢@Thanks!
zznk + 1 我很赞同!
antiol + 2 + 1 我很赞同!
histadawys + 1 + 1 谢谢@Thanks!

查看全部评分

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

 楼主| smile7788 发表于 2023-7-27 09:18
huali3 发表于 2023-7-26 02:05
感谢分享,但为什么我写出来报错啊

估计你下载的小说文字里面编码有问题,但是这种问题很好解决的。多百度一下就出来了。
你先看看这个:
https://blog.csdn.net/jim7424994/article/details/22675759
 楼主| smile7788 发表于 2023-7-27 09:21
weixiao222 发表于 2023-7-24 11:56
个人认为爬文本还是少开多线程,小说一个章节体积本来就小,多线程很容易被封。

谢谢提醒,确实有这个问题,但是一般盗版网站技术都不怎么样,我搞了几百个User-Agent 随机取 就没事了。。   这里没写,我后面加个帖子写一下。
zhang7069 发表于 2023-7-24 10:38
qingfeng0923 发表于 2023-7-24 10:43
感谢大佬的分析
haoiss 发表于 2023-7-24 10:45
这个真不错
yaoy1860 发表于 2023-7-24 10:48
推荐给了基友,表示好像比刷网文更有趣。
bdr 发表于 2023-7-24 10:50
谢谢分享
救救123 发表于 2023-7-24 11:04
学习了一下,感谢分享
keber 发表于 2023-7-24 11:04
感谢分享 有学习到一点
derong2006 发表于 2023-7-24 11:06

谢谢分享
wym12315 发表于 2023-7-24 11:06

太高深,看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 21:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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