爬取小黄文

依然范特西╮ 提交于 2019-11-27 18:28:54
# coding=utf-8
import requests
from bs4 import BeautifulSoup
import time
from multiprocessing import Pool
import threading
from requests.adapters import HTTPAdapter

rs = requests.Session()
rs.mount('http://', HTTPAdapter(max_retries=30))
rs.mount('https://', HTTPAdapter(max_retries=30))

# monkey.patch_all()


# class MyThread(threading.Thread):
#     """重写多线程,使其能够返回值"""
#     def __init__(self, target=None, args=()):
#         super(MyThread, self).__init__()
#         self.func = target
#         self.args = args
#
#     def run(self):
#         self.result = self.func(*self.args)
#
#     def get_result(self):
#         try:
#             return self.result  # 如果子线程不使用join方法,此处可能会报没有self.result的错误
#         except Exception:
#             return None



threads_content = {}

# 获取小说内容
def extraction_chapter(id, chapter_url):
    """获取小说内容"""

    res = rs.get(chapter_url, timeout=(5, 7))
    # print(result)
    # res.encoding = "gbk"
    # print (res)
    soup = BeautifulSoup(res.text, 'lxml')
    # print(soup)
    # title = soup.select('div.txtbox > h1')[].text

    title = soup.select('#txtbox > h1')
    content = soup.select('#content')
    # con = title + content
    title_str = str(title[0])
    content_str = str(content[0])

    # print(content_str)

    title_re = title_str.replace('<h1>', '')
    title_re = title_re.replace('</h1>', '\n')
    content_re = content_str.replace('<div id="content">', '')
    content_re = content_re.replace('<p>', '\n\t')
    content_re = content_re.replace('</p>', '')
    content_re = content_re.replace('</div>', '')

    make_sign = "\n\n\t_____(ฅ>ω<*ฅ)喵呜~~~_____\n\n"

    con = title_re + content_re + make_sign
    threads_content[id] = con


# 获取小说每章网址(已分进程)
def extraction(novel_url):
    # print("+")

    res = rs.get(novel_url, timeout=(3, 5))
    # 输入小说总页面

    # 获取元素
    soup = BeautifulSoup(res.text, 'lxml')

    # 寻找书名
    novel_title = soup.select('#bookinfo-right>h1')
    novel_title = str(novel_title[0])
    novel_title = novel_title.replace('<h1>', '')
    novel_title = novel_title.replace('</h1>', '')
    print(novel_title)

    chapter_all = soup.select('#list>ul>li>a')
    # 获取章节所在元素,a标签

    # chapter = str(chapter[0].attrs["href"])
    # 获取a标签href属性
    # print(type(chapter_all))
    file_name = novel_title + '.txt'

    with open(file_name, 'w', encoding='utf-8') as f:
        f.write('')

    # content_con = ""
    threads = []
    id = 0

    # 遍历拼接每章网址
    for chapter in chapter_all:
        chapter = str(chapter.attrs["href"])
        # 获取a标签href属性

        chapter_url = novel_url + chapter
        # 完成拼接

        # charpter_con = extraction_chapter(chapter_url)
        # 调用子方法, 萃取每章内容.
        # 使用协程提高效率
        # charpter_con = gevent.spawn(extraction_chapter, chapter_url)
        # charpter_con.join()
        t = threading.Thread(target=extraction_chapter, args=(id, chapter_url,))
        threads.append(t)
        t.start()
        id += 1

    # 遍历所有线程,等待所有线程都完成任务
    for t in threads:
        t.join()
    # print(content_con)

    # 遍历线程字典, 导入内容
    # i = 0
    # value = ""
    # while i <= len(threads_content):
    #     value = value + threads_content[i]
    #     i += 1

    for i in threads_content:
        with open(file_name, 'a', encoding='utf-8') as f:
            f.write(threads_content[i])

    # threads_content.clear()

# 完本页面网址
def end_book(end_url):
    res = rs.get(end_url, timeout=(3, 5))
    # 输入小说总页面

    # 获取元素
    soup = BeautifulSoup(res.text, 'lxml')

    # 寻找书籍a元素
    novel_name = soup.select('.bookimg>a')


    po = Pool()
    for name in novel_name:
        # 获取每个元素的网址

        novel_url = name.attrs["href"]

        # print(novel_url)
        # extraction(novel_url)
        # 把 网址传入方法.

        # 进程池方式进行,把进程放入进程池

        po.apply_async(extraction, (novel_url,))

    po.close()
    po.join()

def book(index_url, start, end):
    num = start

    while num < end + 1:

        index = '/index_' + str(num) + '.html'

        if num == 1:
            index = ""

        # 全本书索引页面
        index_con = index_url + index

        # 调用全本方法, 并传入参数
        end_book(index_con)

        print(index_con)

        num += 1


if __name__ == '__main__':
    # 输入网址
    url = "https://www.yite.cc/quanben"  # 此处输入小说总网址
    page_start = 95  # 开始页数
    page_end = 96  # 结束页数

    # 开始时间
    start_time = time.time()


    # 定义进程池, 默认为cpu核数


    book(url, page_start, page_end)




    # 结束时间
    end_time = time.time()

    # 耗时
    elapsed = end_time - start_time

    print('消耗时间:' + str(elapsed))

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!