多线程爬取小说并写入txt
引言
不知道说啥子, 直接进入正题,哦,本人实测,一本一万多章的小说大概四分钟能爬完,在此想说(小说)网站牛逼,不像学校的教务系统,说多了都是泪
多线程
爬取属于io密集型的,所以引入多线程
redis
用redis分发任务以及数据暂存,所以想用的得去下个redis,嘻嘻嘻,其实之前还用了mongodb,为了减少麻烦,就缩减为redis了
redis windows安装 需要开着redis-server,到了启动redis-server那步即可停止
代理
质量不错就用,免费的去一边(自己试了些免费,不咋行)
代码
'''
安装redis 开启server
采用redis 数据太多好像一次取不出来 试了一个一万多章的,一次只取出了9000多章, 现在分批次取
所以大概需要的值有两个
1. 所需要爬取小说的目录页面的链接
2. 第一章的开头位置, 因为有些可能前六章是最新章节 默认:0
3.有问题再联系,小说网站总体差不多(网页排版)应该能适用几个网站吧吧吧吧
'''
import random
import redis
# import pymongo
import requests
import json
import logging
import threading
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
# from Proxyer import Proxyer
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
class BookDownload:
def __init__(self, chapter_link, start_place=0, abbr='http://', proxy=None):
self.chapter_link = chapter_link # 目录页面的链接
self.start_place = start_place # 第一章在目录中的位置
self.abbr_link = chapter_link # 前缀 链接的前一部分 做了处理 不需要再传了
self.redis_client = redis.Redis()
self.event = threading.Event()
self.redis_list = 'url_info'
self.redis_failed_list = 'failed_url'
self.redis_cache = 'download'
self._proxy = proxy
# self.mongo_collect = pymongo.MongoClient().chapter_3.test3 # mongodb,自己设置
self.all_chapter = 0
self.successed_download = 0
self.session = requests.session()
self.header = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (