穆琪的博客

一个程序员的自传

scrapy爬取bootcdn上面的文件【实验】

做了个小实验,去爬取https://www.bootcdn.cn/上面的jss和css文件。

框架使用的是scrappy,把文件保存在本地,简单实现了一下跳过重复下载。

不多说了,上代码:

scrapy的spiders文件夹下的主逻辑文件:

代码思路是先使用从bootcdn上的api上下载的所有库名称的文件

https://api.bootcdn.cn/names.min.json

然后读入一个数组,将爬取范围限定在www.bootcdn.cn下面。

然后创建一个下载文件夹

组装url后爬取改库页面下的所有文件连接,使用xpath匹配:

//span[@class='library-url']/text()

获取文件链接后创建相应的文件夹并下载该文件,然后将链接加入已下载文件,这样中途断开后重新运行不会下载已经下载的文件。

# -*- coding: utf-8 -*-
import json
import logging
import os
import requests
import scrapy
class BootcdnSpider(scrapy.Spider):
    log_format = '%(asctime)s[%(levelname)s]: %(message)s'
    logging.basicConfig(filename='bootcdn-scrapy.log',
                        level=logging.DEBUG,
                        format=log_format)
    name = "Bootcdn"
    logging.info('-------start spider------')
    allowed_domains = ["www.bootcdn.cn"]
    start_urls = []
    with open("names.min.json", "rb") as f:
        logging.info('read names.min.js')
        pkg_list = json.loads(f.read())
        for pkg_name in pkg_list:
            start_url = "https://www.bootcdn.cn/" + pkg_name + "/"
            start_urls.append(start_url)
    download_path = "download_file/"
    file_list_path = download_path + "file_list.txt"
    if not os.path.exists(download_path):
        logging.warning(download_path + "not exists, create it")
        os.makedirs(download_path)
    if not os.path.exists(file_list_path):
        logging.warning(file_list_path + "not exists, create it")
        with open(file_list_path, "wb") as fl_fw:
            fl_fw.write('')
        file_list = []
    else:
        with open(file_list_path, "rb") as fl_fr:
            file_list = list(fl_fr)
    def parse(self, response):
        logging.info("starting:" + response.url + "  parse")
        urllist = response.xpath(
            "//span[@class='library-url']/text()").extract()
        for url in urllist:
            url_split = url.split('/')
            ver = url_split[4]
            if ("beta" in ver) or ("alpha" in ver):
                continue
            all_path = url_split[3:-1]
            dir_path = self.download_path
            for p in all_path:
                dir_path = dir_path + p + "/"
            jscss_file = url_split[-1]
            file_path = dir_path + jscss_file
            file_list_item = url
            if (file_list_item + '\r\n' in self.file_list) or (
                    file_list_item + '\n' in self.file_list):
                logging.warning(file_list_item + " exists, skip it")
                continue
            if not os.path.exists(dir_path):
                logging.warning(dir_path + "not exists, create it")
                os.makedirs(dir_path)
            else:
                logging.warning(dir_path + " exists, skip it")
            if not os.path.exists(file_path):
                logging.warning(file_path + "not exists, download it")
                r = requests.get(url)
                with open(file_path, "wb") as jscss_fw:
                    jscss_fw.write(r.content)
                logging.info("download " + file_path + " successful")
            else:
                logging.warning(file_path + " exists, skip it")
            with open(self.file_list_path, "a+") as fl_fr:
                fl_fr.write(file_list_item + '\n')
            print url + " successful"


© 鲁ICP备18041558号
Powered by Z-BlogPHP & Yiwuku.com