zoukankan      html  css  js  c++  java
  • 用 python 爬取 gutenberg 上的英文科幻小说

    gutenberg地址:http://www.gutenberg.org/

    前记:对象的作业是翻译还没有被翻译过的英文科幻小说。百度搜索无望,借助了伟大的python和伟大的gutenberg下载了1000多篇英文科幻小说。下一步希望能通过程序判断这些文章是否被翻译过。

    学习到的内容:

    1. 在寻找提取链接的规律时,需要多思考。最初选择直接提取链接,遇到很多问题。后来选择直接提取编号,就变得容易很多。

    2. 正则表达式的使用还需加强。

    3. 注意 try… except… 的使用。

    # -*- coding: utf-8 -*-
    """
    Created on Wed Feb 15 12:04:26 2017
    
    @author: Wayne
    """
    
    import urllib2, re
    
    url = "http://www.gutenberg.org/wiki/Science_Fiction_(Bookshelf)#B"
    # gutenberg上科幻小说类目地址
    
    content = urllib2.urlopen(url).read()
    # 读取类目网页内的信息
    
    relink = 'title="ebook:(d{1,10})">'
    # 设置正则表达式
    
    links = re.findall(relink, content)
    # 通过正则表达式提取网页内的书籍编号,生成列表links
    
    x = 0
    # 计数符号,用于书籍命名和程序输出
    
    book_url_list = []
    # 初始化列表,用于存放每本书的链接
    
    for link in links:
    # 遍历书籍编号
        link = 'http://www.gutenberg.org/ebooks/'+link
        # 将书籍编号和地址头合并为有效链接
        book_url_list.append(link)
        # 将有效链接追加到书籍链接列表中
    
    for i in book_url_list:
    # 遍历链接列表
        x = x+1
        # 计数
        try:
        # 正常运行
            html_doc = urllib2.urlopen(i).read()
            # 读取书籍链接内容
            f_url_h = html_doc.find('<a href="//')
            f_url_t = html_doc.find('" type="text/html;')
            f_url_a = "http://"+html_doc[f_url_h+11 : f_url_t]
            # 得到书籍内容页面的链接        
            a = urllib2.urlopen(f_url_a).read()
            # 读取书籍内容
            
            f_name_h = html_doc.find('<h1 itemprop="name">')
            f_name_t = html_doc.find('</h1>')
            b = html_doc[f_name_h+20 : f_name_t]
            # 得到书名 
            
            fout = open('SF%d%s.html' %(x,b), 'w') 
            # 建立并打开以书名命名的html文件
            fout.write(a)
            # 将书籍内容写入文件
            fout.close()
            # 关闭文件
            print "Download success %d: %s" %(x, b)
            # 打印下载成功信息:包含编号和书名
        except:
        # 若发生错误,则直接略过,进行下一个链接循环
            print "Download failed %d" %x
            # 打印失败信息和编号
            continue
    

     

  • 相关阅读:
    php 扩展模块安装过程
    nginx 配置若干问题
    df 显示 100%的问题
    pcre 不支持 utf 的问题
    服务器TCP连接中 TIME_WAIT 状态过多
    Linux 运维笔试题(一)答案
    Linux 运维笔试题(一)
    Java 内存监控(一)之 jps命令
    python 入门
    Java 内存监控命令简介(零)
  • 原文地址:https://www.cnblogs.com/wnzhong/p/6401415.html
Copyright © 2011-2022 走看看