0x0101 2010-01-18 20:56
浏览 283
已采纳

帮MM用python抓取index及一级目录下的所有符合要求的网页

MM要学js,但是上不了网,要求我帮她把网上一个教程的相关内容抓出来,于是就有了下面的代码:

import urllib2
import urllib
import re

from sgmllib import SGMLParser 

class URLLister(SGMLParser):
    def reset(self):                            
        SGMLParser.reset(self)
        self.urls = []

    def start_a(self, attrs):                    
        href = [v for k, v in attrs if k=='href'] 
        if href:
            self.urls.extend(href)
            
js_root_url = "http://www.w3school.com.cn/js/"
#ep_root_url = "http://www.w3school.com.cn"
index_url = "index.asp"

f = urllib2.urlopen(js_root_url + index_url)

webfile = urllib.urlopen(js_root_url + index_url).read()
fp = file('index.asp', 'w+')
fp.write(webfile)
fp.close()

if f.code == 200:
    parser = URLLister()
    parser.feed(f.read())
    f.close()
    #url_pattern = re.compile(r'(^/js/js_|^/tiy/)\D*')
    url_js_pattern = re.compile(r'^/js/js\D*')
    #url_example_pattern = re.compile(r'^/tiy/\D*')
    url_sub_js_pattern = re.compile(r'^/js/js')
    for url in parser.urls:
        if url_js_pattern.search(url):
            url = url_sub_js_pattern.sub('js', url)
            webfile = urllib.urlopen(js_root_url + url).read()
            fp = file( url , 'w+')
            fp.write(webfile)
            fp.close()

 但是现在还是有问题存在的,最明显的是,单击index页上的超链接无法访问抓取到的一级页面

  • 写回答

1条回答 默认 最新

  • yooylet 2010-01-19 14:42
    关注

    这不是做简单的爬虫,其实是一个很复杂的网页静态化需求。
    你的程序需要对页面内的所有url做具体分析和转化——把url与保持到磁盘上的html页面对应起来。其中一个必须要解决的场景是这样的:下载完页面A中的链接B所指定的网页BB后,必须要回去改写页面A中B的链接值,例如A中内涵这样link B一个链接,而B页面在磁盘上保存为efg.html,那么A的内容必须要修改为link B
    如果不考虑链接的相对性,下载下来的页面是无法直接打开查看的。
    而更完整的程序,你要考虑的有以下几个方面:
    1,必须用多线程,遇到一个url就启动一个新线程进行查询、解析、转换、下载和记录,父线程等待子线程完成工作后修改自己负责的页面。考虑性能的话还得用线程池。
    2,记录爬过的链接以备查询,避免链接间回环引用造成死循环。
    3,制定一个url到文件路径的转换规则。
    4,制定url下载的边界,防止爬到无需下载的网页。
    这些是基本要素,我用java做过一个类似产品。以我的经验,看起来简单,可不太好写,因为url五花八门,页面结构非常多元,如果不幸遇到用js生成的动态页面就得歇菜了。

    对你的需求,我建议直接使用webzip,方便强大!几下搞定。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建