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/div/div/div/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
    returnchapter_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()
   

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


太高深,看不懂
页: [1] 2 3 4 5
查看完整版本: 小说网站爬虫