随手用python写一个下载源码爬虫试试

  最近在研读jdk源码,网上找了下资源,发现都不完整。

  后来新发现了一个有完整源码的地方,主要包括了java,c,c++的东西,装逼需要,就想拿来玩玩。但是,找了好多种下载打开的方式,发现都不对。于是,我随手写了python爬虫,把他搞定。

1. 思路分析

  1.1. 目标地址:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/dddb1b026323/,打开后先自己看下,是否符合自己的需求;

  1.2. 分析此结构下主要有两种形式,一是目录文件,二是最终文件,特征明显,可区分出最终结果;

  1.3. 目录深度不确定,很自然地想到了递归;

  1.4. 查询有效目录,很自然地想到了正则表达式;

  1.5. 基于可能有中断的情况,可能需要进行断点下载,因此考虑加个简单的跳过功能;

  1.6. 考虑可能出现重复下载某文件或目录的情况,耗费资源,因此加一个全局文件集,进行去重处理;

  1.7. 由于该文件目录很规律,就直接沿用其目录结构了;

  1.8. 考虑到本机环境可能不稳定,于是利用公司测试环境服务器;

  1.9. 开工!

2. 鲁棒的代码来一波

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib,urllib2
import re
import os
import HTMLParser
dirbase = ‘/tmp‘
urlbase = ‘http://hg.openjdk.java.net‘
url= urlbase + ‘/jdk8u/jdk8u/jdk/file/dddb1b026323/src‘
# 标识用于跳过目录至xx,以达到按需下载
skip_to_p = ‘‘
# 辅助跳过标识
skip_find = False;
textmod ={‘user‘:‘amei‘}
textmod = urllib.urlencode(textmod)
print(url)
req = urllib2.Request(url = ‘%s%s%s‘ % (url,‘?‘,textmod))
res = urllib2.urlopen(req)
res = res.read()
# 全局已搜寻过的文件集合,防重入
allflist = []

# 1. 找到content的表单,2. 找出有效的地址链接
table=re.findall(r‘<tbody class="stripes2">(.+)<\/tbody>‘,res, re.S)
harr = re.findall(r‘href="(/jdk8u[\w\/\._]+)">(?!\[up\])‘, table[0])

def down_src_recursion(harr):
  global allflist,skip_find;
  if(not harr):
    return False;
  i=0; arrlen = len(harr)
  print("in new dir cur...")
  if(len(allflist) > 1500):
     print(‘over 1500, cut to 800 exists...‘)
     allflist = allflist[-800:]
  for alink in harr:
    i += 1;
    # 对最后一个目录符号去除,防止无用的扫描
    alink = alink.rstrip(‘/‘)
    if(skip_to_p and not skip_find):
    if(alink != skip_to_p):
      print(‘skip file, cause no find..., skip=%s,now=%s‘ % (skip_to_p, alink))
      continue;
    else:
      skip_find = True;
    if(alink in allflist):
      print(‘目录已搜寻过:‘ + alink)
      continue;
    pa = dirbase + alink
    if(os.path.isfile(pa)):
      print(‘文件已存在,无需下载: ‘ + pa)
      continue;
    reqt = urllib2.Request(urlbase + alink)
    rest = urllib2.urlopen(reqt)
    rest = rest.read()
    allflist.append(alink)
    if(rest.find(‘class="sourcefirst"‘) > 0):
       print(‘这是个资源文件:%s         %d/%d‘ % (alink, i, arrlen))
       filename = alink.split(‘/‘)[-1]
       linearr = re.findall(r‘<span id=".+">(.+)</span>‘, rest)
       fileObject = open(dirbase + alink, ‘w‘)
       for line in linearr:
          try:
            # 文件存在特殊的html标识符,需要转换,但由于有非标准语言存在,可能抛出异常,需捕获
            line = HTMLParser.HTMLParser().unescape(line)
          except UnicodeDecodeError as e:
            print(‘oops, ascii convert error accour:‘, e)
          fileObject.write(line + ‘\r\n‘)
       fileObject.close()

    else:
      print(‘这是目录:%s        %d/%d‘ % (alink, i, arrlen))
      if(not os.path.exists(pa)):
         print(‘创建目录:%s‘ % alink)
         os.makedirs(‘/tmp‘ + alink, mode=0777)
      ta=re.findall(r‘<tbody class="stripes2">(.+)<\/tbody>‘,rest, re.S)
      ha = re.findall(r‘href="(/jdk8u[\w\/\._]+)">(?!\[up\])‘, ta[0])
      down_src_recursion(ha)

# go...
down_src_recursion(harr);

3. 让代码跑起来

python jdk-crawler.py

4. 瞅瞅下载得咋样了

du -sh /tmp/jdk8u/

ok, 以上,就打完了。等测试环境下载完成后,再通过ftp搬到你电脑上了。

原文地址:https://www.cnblogs.com/yougewe/p/9407243.html

时间: 2024-10-11 22:24:19

随手用python写一个下载源码爬虫试试的相关文章

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

Hadoop之HDFS原理及文件上传下载源码分析(下)

上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文件上传.下载源解析. 文件上传 先上文件上传的方法调用过程时序图: 其主要执行过程: FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(楼主上篇已经介绍过了) 调用FileSystem的create()方法,由于实现类为Dis

设置eclipse自动下载源码

有时候,我们会好奇有些包的源码是怎么写的,毕竟源码是学习这个框架的最直接最原始的方法,可是Eclipse无法帮我们自动下载源码,这里推荐一个插件,可以帮我下载想要的源码. Java Source Attacher 插件主页:http://marketplace.eclipse.org/content/java-source-attacher#.U5RmTePp0QI 可以通过eclipse自动安装,也可以手动下载包 今天尝试自动安装貌似很慢,下载包也需要翻墙,我把这个包放在我的资源页,如果有需要

spring如何下载源码和jar包

spring现在已经将源码和jar包分开放置,不能直接一下都拥有源码和jar包. 有些朋友说jar包需要通过maven去下载,其实不然,spring官网上就能拿到一切. 一,下载源码 (1)输入官网地址http://spring.io或spring.io(有默认http的浏览器),进入简洁的官网页面 (2)点击官网导航的PROJECTS进入项目页面,在项目页面中通过SPRING FRAMEWORK进入 (3)通过上面的SPRING FRAMEWORK导航到如下页面,再点击小猫进入源码下载页面 (

在 github 上下载源码

可以找到下面的源码获取方式. 在github开源项目的页面上可以找到上图的三个获取源码方式. 使用git的网址,可以使用比如TortoiseGit这里的客户端软件获取源码 TortoiseGit 如下图,如果安装了TortoiseGit,那么在一个还没有建立git关系的文件夹上右键,可以看到三个相关菜单. 点击Git Clone, 出现下图窗口 再点击OK,既可以下载源码.使用TortoiseGit,也可以方便的进行源码提交. 官方客户端软件GitHub Windows版本下载 http://w

礼物说仿写项目iOS源码

礼物说仿写(updating...) 源码下载:http://code.662p.com/view/14507.html api: 礼物说 首页精选 banner2: http://api.liwushuo.com/v2/secondary_banners?gender=1&generation=2 banner1: http://api.liwushuo.com/v2/banners?channel=iOS 精选: http://api.liwushuo.com/v2/channels/101

eclipse中maven项目引入依赖后自动下载源码

好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名 传统的方法就是,手动执行 Maven -> Download Sources 也就是说,每添加一个依赖,就需要手动执行一次. 其实 eclipse 的 Maven 插件就提供了这个功能,但是可能有许多开发人员没关注这个功能, 所以这个分享给那些不太清楚这个功能的同学,配置很简单, 只需要勾选windows -> Preferences -> Maven ->

C写的扫描器源码

Title:C写的扫描器源码 --2010-10-27 20:02 无意间看见的一个源代码,弄回来读下. ----------------------------------------------------------------------------------------------------------------------------------- #include <stdio.h>#include <winsock.h> #define NETWORK_ERR

[py]python写一个通讯录step by step V3.0

python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输出 2.把日期换算成年龄 3.更新操作做的更优雅 准备工作 db准备 - 创建数据库 mysql> create database txl charset utf8; Query OK, 1 row affecte