小说网站爬虫
小说网站网址,我没写出来,怕不符合论坛规则,大家借鉴一下思路就好哈。。'''
下载 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()
huali3 发表于 2023-7-26 02:05
感谢分享,但为什么我写出来报错啊
估计你下载的小说文字里面编码有问题,但是这种问题很好解决的。多百度一下就出来了。
你先看看这个:
https://blog.csdn.net/jim7424994/article/details/22675759 weixiao222 发表于 2023-7-24 11:56
个人认为爬文本还是少开多线程,小说一个章节体积本来就小,多线程很容易被封。
谢谢提醒,确实有这个问题,但是一般盗版网站技术都不怎么样,我搞了几百个User-Agent 随机取 就没事了。。 这里没写,我后面加个帖子写一下。 有用的技能又增加了,感谢大佬分享 感谢大佬的分析 这个真不错 推荐给了基友,表示好像比刷网文更有趣。 谢谢分享 学习了一下,感谢分享 感谢分享 有学习到一点
谢谢分享
太高深,看不懂