吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7503|回复: 31
收起左侧

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

[复制链接]
xiaop520 发表于 2018-5-18 08:59
最近也在学习爬虫,写个小案例。 不多说直接上代码
novel.png

[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()

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
五五66 + 1 + 1 我很赞同!
wi5101 + 1 + 1 用心讨论,共获提升!
cqtyyd + 1 + 1 谢谢@Thanks!
blueshark + 1 + 1 谢谢 @Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| xiaop520 发表于 2018-5-18 10:05
上官轩墨 发表于 2018-5-18 09:58
楼主代码中用到的库怎么安装,我刚学python,不知道安装哪些库?是不是还要安装写什么软件比如:Anaconda    ...

直接命令行pip install requests   和 pip install lxml
直接python 命令运行,不用什么IDE都行
上官轩墨 发表于 2018-5-18 20:33
本帖最后由 上官轩墨 于 2018-5-18 20:34 编辑
xiaop520 发表于 2018-5-18 10:05
直接命令行pip install requests   和 pip install lxml
直接python 命令运行,不用什么IDE都行

这安装好了,文件打开就闪退。
0U8BH}2[5}NGL)C[3G~KLOR.png

图片

图片
Lich 发表于 2018-5-18 09:10
he58394835 发表于 2018-5-18 09:11
这个功能好
he58394835 发表于 2018-5-18 09:13
打包下载下。
暮丶辰 发表于 2018-5-18 09:14
谢谢 @Thanks!
齐恩 发表于 2018-5-18 09:16
学习了,谢谢分享
cqtyyd 发表于 2018-5-18 09:18
非常感谢,就喜欢下载下来慢慢看,总觉着网上浏览不是在看书!
shaokui123 发表于 2018-5-18 09:22
非常感谢
上官轩墨 发表于 2018-5-18 09:32
楼主请问需要安装什么库?我的怎么运行不了
 楼主| xiaop520 发表于 2018-5-18 09:38
上官轩墨 发表于 2018-5-18 09:32
楼主请问需要安装什么库?我的怎么运行不了

Requests和lxml
把你提示少的模块pip安装下应该就可以了吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 13:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表