如何批量下载资源?简单爬虫攻略!


入门python其实一个机缘,虽然现在还是入门状态,但是开始接触主要是由于看到网站上有一个喜欢的漫画,但是不喜欢在电脑上看,想要下载下来,但是一张张的保存又太麻烦了,所以开始学习了爬虫。

一个简单的批量网页资源下载,分为4个部分:

  1. 分析网页规律,找到资源所在的所有网页。
  2. 分析每个网页的源码和特点,找需要资源的URL,并转化成正则表达式。
  3. 编写爬虫程序,下载资源。
  4. 保存资源。


下面是一个简单的爬虫,我将分别针对4个部分进行说明:

# -*- coding:utf-8 -*-
""" imports libs """
import urllib
import urllib.request
import re
import os
import time


""" spider class """
class spider :    
    
    def __init__(self):
        #初始化函数
        self.siteURL = 'http://www.tingshulou.com/down/?1306-'
    
    def getMp3Url(self,url):
        # 获取0~30的资源
        realUrl =  "http://audio.xmcdn.com"
        print("getMp3Url "+url)
        request = urllib.request.Request(url)
        request.add_header('Referer','http://www.tingshulou.com/')
        request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0')
        response = urllib.request.urlopen(request)
        page = response.read().decode('gbk')
        pattern = re.compile('<a class="dlink" title="1号线路" href="http://audio.xmcdn.com/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9-_]*).mp3',re.S)
        items = re.findall(pattern,page)
        print(items)
        print(len(items))
        for it in range(len(items[0])):
            print(it)
            realUrl += "/" + items[0][it]
            print(realUrl)
        realUrl = realUrl+".mp3"
        return realUrl

    def getMp3Url31(self,url):
        # 获取31~152的资源
        realUrl =  "http:/"
        print("getMp3Url "+url)
        request = urllib.request.Request(url)
        request.add_header('Referer','http://www.tingshulou.com/')
        request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0')
        response = urllib.request.urlopen(request)
        page = response.read().decode('gbk')
        pattern = re.compile('<a class="dlink" title="1号线路" href="http://([A-Za-z0-9.]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9-_]*).mp3',re.S)
        items = re.findall(pattern,page)
        print(items)
        print(len(items))
        for it in range(len(items[0])):
            print(it)
            realUrl += "/" + items[0][it]
            print(realUrl)
        realUrl = realUrl+".mp3"
        return realUrl
    
    def saveMp3(self,mp3Url,fileName):
        # 保存数据
        print (mp3Url)
        print (fileName)
        u = urllib.request.urlopen(mp3Url)
        data = u.read()
        f = open(fileName, 'wb')
        f.write(data)
        print (u"保存音频",fileName)
        f.close()


    def mkdir(self,path):
        #创建新目录
        path = path.strip()
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists=os.path.exists(path)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录
            print (u"偷偷新建了名字叫做"+path+u'的文件夹')
            # 创建目录操作函数
            os.makedirs(path)
            return True
        else:
            # 如果目录存在则不创建,并提示目录已存在
            print (u"名为"+path+'的文件夹已经创建成功')
            return False


    def dodownload(self):
        # 入口函数
        self.mkdir("all_files")
        for i in range(0,30):
            url = self.siteURL + str(i) + ".html"
            print("dodownload "+url)
            time.sleep(1)
            self.saveMp3(self.getMp3Url31(url),str(i)+".mp3")
        for i in range(31,152):
            url = self.siteURL + str(i) + ".html"
            print("dodownload "+url)
            time.sleep(1)
            self.saveMp3(self.getMp3Url31(url),str(i)+".mp3")


sp = spider()
sp.dodownload()

首先:分析网页规律,找到资源所在的所有网页。

看 dodownload 函数的两个 for 循环,url 变量的值即为有效包含资源的网页地址,根据其规则,组合成有效的网址,如下:
http://www.tingshulou.com/down/?1306-0.html

其次:分析每个网页的源码和特点,找需要资源的URL,转换成正则表达式。

这是一个编码的过程,通过观察规律找到资源,转成正则表达式,给到程序,程序就能找真正的资源地址,见函数:getMp3Url31 和 getMp3Url

0-30 资源地址:

 <a class="dlink" title="2号线路" href="http://audio.xmcdn.com/group28/M0A/66/C1/wKgJSFlrXLvwQYieAArlNdEcv5w634.mp3 

0~30 的正则表达式为:

<a class="dlink" title="1号线路" href="http://audio.xmcdn.com/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9-_]*).mp3 

31-159 资源地址:

<a class="dlink" title="1号线路" href="http://aod.tx.xmcdn.com/group26/M00/F2/EB/wKgJWFlrXQXhBgrAAAsTsTFee1I435.mp3 

31-159的正则表达式:

 <a class="dlink" title="1号线路" href="http://([A-Za-z0-9.]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9]*)/([A-Za-z0-9-_]*).mp3 

然后:编写爬虫程序,下载资源,代码如上,编写爬虫注意2点:

1. 主要伪装 — 简单的模拟一下浏览器头,代码如下:

request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0')

2. 不要给服务器太大压力,增加延迟。

time.sleep(1)

最后: 保存数据,就是一些简单的python文件和文件夹操作,这里就不详细说明了。

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/how-to-download-in-batch.html

历史上的今天:

  1. 2017:  实验:site差距,有图有真相(0)
  2. 2017:  服务器共享磁盘网络映射方法集萃!(0)

发表评论

电子邮件地址不会被公开。 必填项已用*标注