xiaop520 发表于 2018-5-18 08:59

【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
      url = "https://www.biqudu.com" + href
      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 + "\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()

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都行
这安装好了,文件打开就闪退。

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安装下应该就可以了吧
页: [1] 2 3 4
查看完整版本: 【Python】并行爬取小说并下载到本地