首页 编程教程正文

【Python】并行爬取小说并下载到本地

piaodoo 编程教程 2020-02-22 22:07:06 1026 0 python教程

本文来源吾爱破解论坛

最近也在学习爬虫,写个小案例。 不多说直接上代码

novel.png (79.23 KB, 下载次数: 3)

下载附件  保存到相册

2018-5-18 08:52 上传



[Python] 纯文本查看 复制代码
import requests
from lxml import etree
from multiprocessing.dummy import Pool
import os
import re

#小说的章节地址
chapter_url = "https://www.biqudu.com/43_43821/"

#忽略警告 https请求设置verify=False时 有时候会报错 设置这条语句可以解决
requests.packages.urllib3.disable_warnings()

def get_response(url):
    
    '''
    :根据指定URL获取响应数据、
    :返回xpath选择器格式的数据
    '''
    html = requests.get(url,verify=False)
    return etree.HTML(html.text)

def get_chapter_content(selector):
    '''
    :传入xpath选择器格式的数据获取想要的数据
    :返回一个包含章节标题,和章节地址的数组
    '''
    html = []
    #根据xpath获取title
    title = selector.xpath('//*[@id="list"]/dl/dd/a/text()')
    # 根据xpath获取url
    href = selector.xpath('//*[@id="list"]/dl/dd/a/@href')
    #这里以12开始遍历是因为前面几个数据是不要的
    for i in range(12,len(title)):
        tit = title[i]
        url = "https://www.biqudu.com" + href[i]
        chapter = {"title":tit,"url":url}
        html.append(chapter)
    return html

def save_content(url):
    '''
    :根据传进来的URL获取数据并保存
    :这里的URL传入的事一个字典存储的地址和相对应保存文件的名称
    '''
    # 保存下载文件的文件夹
    folder = 'novel'
    # 获取选择器
    html = get_response(url['url'])
    # 提取出想要的内容
    con = html.xpath('//*[@id="content"]/text()')
    # 判断文件夹是否存在 不存在就创建
    if not os.path.exists(folder):
        os.mkdir(folder)
    # 去掉非法字符
    fileName = re.sub('[\/:*?"<>|]','-',url['name'])    
    # 保存文件
    with open(folder + "/" + fileName + ".txt","w+",encoding="utf-8") as f:
        # 得到的是一个list 这里转换为str
        content = ''.join(con)
        #遍历字符串 保存为每行不好过50个字符
        for i in range(0,len(content),50):
            f.write(content[i:i+50] + "\n")
def get_content(html):
    '''
    :并行爬取保存数据
    '''
    urls = []

    for con in html:
        url = con['url']
        name = con['title']
        urls.append({'name':name,'url':url})
    # 线程个数
    pool = Pool(4)
    # 使用map进行并行爬取,save_content为爬取保存函数,
    # urls为一个list,里面存储的为网址列表和对应的保存名字
    pool.map(save_content,urls)
    pool.close()
    pool.join()





def main():
    selector = get_response(chapter_url)

    html = get_chapter_content(selector)

    get_content(html)

    
if __name__ == '__main__':
    main()

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7583.html

搜索