设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 11808|回复: 4
打印 上一主题 下一主题

抓取廖雪峰的Git教程

[复制链接]

3

主题

0

好友

51

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2013-10-6 15:05:52 |只看该作者 |倒序浏览
本帖最后由 跑跑慢慢 于 2013-10-6 15:08 编辑

为了练习抓取网页内容和正则表达式而写,貌似实际没什么用处. 欢迎指点可以优化的地方.
主要步骤:
1.访问教程首页:http://www.liaoxuefeng.com/wiki/ ... 8c67b8067c8c017b000,保存至本地.
2.首页中js,css保存至本地.
3.获得各章节地址列表,依次抓取.
4.对所有网页,抓取图片并保存至本地,修改js,css以及图片地址,修改章节地址.并保存到本地.
大致这些内容.

代码:
  1. #!/usr/bin/env python 2.7
  2. #-*- coding:utf-8 -*-
  3. """
  4. 爬虫:爬廖雪峰的Git教程

  5. 请先确保 e:/git/目录存在.
  6. import getgit 后,getgit.start()即可完成.
  7. python 正则表达式参考:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

  8. """
  9. import urllib2
  10. import urllib
  11. import re
  12. import os

  13. __all__=['gethtml','start','getcss','getjs','getimage']

  14. starturl='http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000'
  15. domain='http://www.liaoxuefeng.com/wiki/'
  16. rootPath='e:/git/'  #本地保存文件夹.

  17. def func(m):
  18.     """
  19.     /wiki/a/b
  20.     替换为
  21.     a.b.html
  22.     或
  23.     /wiki/a
  24.     替换为
  25.     a
  26.     """
  27.     if(m.group(2)!=''):
  28.         s = m.group(1)+'.'+m.group(2)+'.html'
  29.     else:
  30.         s= m.group(1)+'.html'
  31.     return s
  32. def gethtml(url):
  33.     """
  34.     获取网页内容,并保存到本地.返回内容.
  35.     """
  36.     print("URL:\t%s" % url)
  37.     try:
  38.         urlfile = urllib2.urlopen(url)
  39.         source = urlfile.read()
  40.         urlfile.close()
  41.         #html = source.decode('utf-8')
  42.         return source
  43.     except urllib2.HTTPError, exc:
  44.         if exc.code == 404:
  45.             print "Not found !"
  46.         else:         
  47.             print "HTTP request failed with error %d (%s)" % (exc.code, exc.msg)
  48.     except urllib2.URLError, exc:
  49.         print "Failed because:", exc.reason
  50. def start():
  51.     """
  52.     抓取首页内容,查找地址列表,循环地址列表抓取内容.
  53.     """
  54.     source=gethtml(starturl)
  55.     #css,js文件保存到本地.
  56.     getcss()
  57.     getjs()
  58.     #获取匹配的url列表,为各章节地址.
  59.     pattern=re.compile(r'/wiki/(\w*[/]?\w*)')
  60.     urls=re.findall(pattern,source)
  61.     #将url中 / 改为.准备工作
  62.     filenamepattern=re.compile(r'(/)')
  63.     #章节目录改为本地文件名
  64.     menupattern=re.compile(r'/wiki/(\w*)/?(\w*)')
  65.     #href="/themes/改为href="e:/git/themes/,e:/git/ 用rootPath
  66.     cssjspattern=re.compile(r'href="/(themes/)')
  67.     #<img src="/api" 替换为<img src="e:/git/api".
  68.     imagepattern=re.compile(r'<img src="/(api/.*?)/url')
  69.     getimage(source)
  70.     for url in urls:
  71.         source = gethtml(domain+url)
  72.         getimage(source)
  73.         #将url中 / 改为.
  74.         name=filenamepattern.sub(r'.',url)

  75.         #修改页面内章节目录连接.
  76.         source=menupattern.sub(func,source)
  77.         #修改css/js连接.
  78.         source=cssjspattern.sub(r'href="%s\g<1>'% rootPath,source)
  79.         #修改图片链接.
  80.         source=imagepattern.sub(r'<img src="%s\g<1>.png' % rootPath,source)
  81.         #保存本地
  82.         file=open(rootPath+name+'.html','w')
  83.         file.write(source)
  84.         file.close()
  85. def getcss():
  86.     """
  87.     css文件保存到本地.
  88.     """
  89.     source=gethtml(starturl)
  90.     cssPattern = re.compile(r'(/themes.*?\.css)')
  91.     csses=re.findall(cssPattern,source)
  92.     for css in csses:
  93.         csshref = cssPattern.sub(r'http://www.liaoxuefeng.com\g<1>',css)
  94.         source = gethtml(csshref)
  95.         if source:
  96.             csspath = rootPath+css
  97.             parentfolder = os.path.split(csspath)
  98.             try:
  99.                 os.makedirs(parentfolder[0])
  100.             except (WindowsError):
  101.                 pass
  102.             file = open(csspath,'w')
  103.             file.write(source)
  104.             file.close()
  105. def getjs():
  106.     """
  107.     js文件保存到本地.
  108.     """
  109.     source=gethtml(starturl)
  110.     cssPattern = re.compile(r'(/themes.*?\.js)')
  111.     csses=re.findall(cssPattern,source)
  112.     for css in csses:
  113.         csshref = cssPattern.sub(r'http://www.liaoxuefeng.com\g<1>',css)
  114.         source = gethtml(csshref)
  115.         if source:
  116.             csspath = rootPath+css
  117.             parentfolder = os.path.split(csspath)
  118.             try:
  119.                 os.makedirs(parentfolder[0])
  120.             except (WindowsError):
  121.                 pass
  122.             file = open(csspath,'w')
  123.             file.write(source)
  124.             file.close()
  125. def getimage(source):
  126.     """
  127.     图片下载 使用urllib.urlretrieve(url,path)
  128.     源代码:src="/api/resources/001374713236987f0e694e1a02a4a538eaab311bb26a0bb000/url"
  129.     实际请求      url: http://www.liaoxuefeng.com/api/resources/001374713236987f0e694e1a02a4a538eaab311bb26a0bb000/url
  130.     保存本地位置 path: e:/git/api/resources/001374713236987f0e694e1a02a4a538eaab311bb26a0bb000.png
  131.     """
  132.     pattern = re.compile(r'(api/.*?)(?=/url)')
  133.     resources=re.findall(pattern,source)
  134.     for resource in resources:
  135.         resourcehref = pattern.sub(r'http://www.liaoxuefeng.com/\g<1>',resource+'/url')
  136.         
  137.         resourcepath = rootPath+resource+".png"
  138.         parentfolder = os.path.split(resourcepath)
  139.         try:
  140.             os.makedirs(parentfolder[0])
  141.         except (WindowsError):
  142.             pass
  143.         print("URL:\t%s" % resourcehref)
  144.         urllib.urlretrieve(resourcehref,resourcepath)
  145.    
  146. #start()
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-10-8 11:55:38 |只看该作者
是保存成了页面吧?

可以尝试做成chm或pdf的电子书,方便分享。不过这个是python之外的事了。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

161

积分

注册会员

Rank: 2

板凳
发表于 2013-10-18 19:00:11 |只看该作者
我想说这个教程写的太好了可以么……新手真心很容易上手~~“网上其他的教程要不然太难,要不然太简单”。
回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

地板
发表于 2014-9-14 20:33:19 |只看该作者
可以尝试做成chm或pdf的电子书,方便分享。不过这个是python之外的事了??

...然后要怎么做啊。。~
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2014-9-14 20:59:19 |只看该作者
daystudy 发表于 2014-9-14 20:33
可以尝试做成chm或pdf的电子书,方便分享。不过这个是python之外的事了??

...然后要怎么做啊。。~ ...

网上有这种生成工具的,找一个来搞一下就行了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 10:19 , Processed in 0.023517 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部