Python抓取小说

Python抓取小说

前言

此脚本为了在MAC上抓取小说而写,用Python几句代码就可以了。

代码

# coding=utf-8

import re
import urllib2
import chardet
import sys
from bs4 import BeautifulSoup
import codecs

class Spider():

    def __init__(self):
        self.aTag=re.compile("<a href=\"(http://www.44pq.com/read/[0-9]+?_[0-9]+?.html)\"[^>]*?>(.+?)</a>")
        self.contentTag=re.compile("<div class=\"readerContent\" id=\"content\">(.+?)</div>",re.I|re.S)

    def getHtml(self, url):
        headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6‘}
        req=urllib2.Request(url,headers=headers)
        response = urllib2.urlopen(req)

        html = response.read()
        return html
        #soup=BeautifulSoup(html.decode("GB18030","ignore"))
        #return soup.findAll("a")
        #return soup.prettify()
        #typeEncode = sys.getfilesystemencoding()
        #infoencode = chardet.detect(html).get(‘encoding‘,‘utf-8‘)
        #return html.decode(‘GB18030‘,‘ignore‘).encode("utf-8")
        return html.decode(‘GB18030‘,‘ignore‘).encode(sys.getfilesystemencoding())

    def Run(self):
        bookurl="http://www.44pq.com/read/13567.html"
        bookname="地球上唯一的魔法师"
        text=[]
        matchs=self.aTag.finditer(self.getHtml(bookurl))
        alist=list(matchs)
        total = len(alist)
        print "total {0}".format(total)
        i=0
        for m in alist:
            i+=1
            text.append(m.group(2).decode("gb18030"))
            text.append(self.getContent(m.group(1)))
	    self.writeFile(bookname,"\n\n".join(text))
	    del text[:]
            print "{0}/{1}".format(i,total)
        self.writeFile(bookname,"\n\n".join(text))
        print "done!"

    def writeFile(self,filename,text):
        f=open(filename+".txt","a")
        f.write(text)
        f.close()

    def getContent(self,url):
        c=self.getHtml(url)

        c=self.contentTag.search(c).group(1)
        c=re.sub("<[^>]+?>","",c)
        c=c.replace("nbsp;","").replace("&","")
        return c.decode("gb18030")

if __name__ == ‘__main__‘:
    reload(sys)
    sys.setdefaultencoding(‘utf-8‘)
    spider = Spider()
    spider.Run()

声明一下,实在搞不定CSDN编辑器的格式问题了,上述代码中:

self.writeFile(bookname,"\n\n".join(text))

del text[:]

这两行是在for循环里的,而不应该是与关键字for对齐的。

上面不必要的import可以删掉。以小说《地球上唯一的魔法师》为例,aTag是匹配小说目录所有章节的正则表达式,contentTag是匹配小说正文的正则表达式。

需要声明一点,此代码每抓取一章,就写入文件一次,以防内存占用过大。

self.writeFile(bookname,"\n\n".join(text))

del text[:]

如果需要,也可以抓取N章写入文件一次,只需加入一个简单的逻辑判断就OK了。占用多少内存和写多少次文件,每个人有自己不同的衡量标准。

Python抓取小说

时间: 2024-10-12 23:10:55

Python抓取小说的相关文章

Python抓取页面乱码问题的解决

import urllib2 response=urllib2.urlopen('http://house.focus.cn/') html=response.read() print html.decode('gbk') Python抓取页面乱码问题的解决,布布扣,bubuko.com

使用python抓取CSDN关注人的所有发布的文章

# -*- coding: utf-8 -*- """ @author: jiangfuqiang """ import re import urllib2 import cookielib import time def startParser(author,page=1): reg = r'<a href="/\w+/article/details/\d+">\s*\t*\n*\s*\t*\s*.*?\t*\n

运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

原文地址:运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

Python抓取需要cookie的网页

Python抓取需要cookie的网页 在仿照<Python小练习:可视化人人好友关系>一文时,需要登录模拟登录人人网.然而自从CSDN事件之后,人人网开始使用加密方式处理登录名和密码,直接使用post方式已经无法登陆人人网.这时,从豆瓣讨论中找到了解决方法: 1. 首先使用浏览器登陆人人,然后找到浏览器中关于登陆的Cookie: 2. 将Cookie记录下来,在Python中使用cookie模块模拟浏览器的行为: 3. 取得并解析数据. 1. HTTP协议与Cookie 抓取网页的过程跟浏览

使用python抓取CSDN关注人的全部公布的文章

# -*- coding: utf-8 -*- """ @author: jiangfuqiang """ import re import urllib2 import cookielib import time def startParser(author,page=1): reg = r'<a href="/\w+/article/details/\d+">\s*\t*\n*\s*\t*\s*.*?\t*\n

Python抓取网页&amp;批量下载文件方法初探(正则表达式+BeautifulSoup) (转)

Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup) 最近两周都在学习Python抓取网页方法,任务是批量下载网站上的文件.对于一个刚刚入门python的人来说,在很多细节上都有需要注意的地方,以下就分享一下我在初学python过程中遇到的问题及解决方法. 一.用Python抓取网页 基本方法: [python] view plaincopyprint? import urllib2,urllib url = 'http://www.baidu.com' req 

python抓取百度彩票的双色球数据

最近在学习<机器学习实战>这本书,在学习的过程中不免要自己去实践,写些练习.这写练习的第一步就需要收集数据,所以为了写好自己的练习程序,我得先学会收集一些网络数据.了解到用python抓取网页数据的一些方法后,我就根据别人的demo,自己实践了一下,学着从百度彩票网站上抓取双色球的历史数据.以下我就介绍一下自己的小程序. 大致思路如下 找到相关url和其参数 找出页面上你要抓取的数据的位置,也就是说这个数据在那些标签下 将每页中学要的数据取下来按一定格式存放在自己本地 需要的环境: pytho

使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过BeautifulSoup对页面进行解析,并从中获取房源价格,面积,户型和关注度的数据. 准备工作 首先是开始抓取前准备工作,导入需要使用的库文件,这里主要使用的是requests和BeautifulSoup两个.Time库负责设置每次抓取的休息时间.这里并非全部,后续还会在过程中导入新的库. 抓取列表页 开始抓取

用Python抓取全站中的404错误

链接是SEO的一个重要因素.为了在搜索引擎中获取更好的排名,一定要定期检查下网站中的链接是否依然有效.特别是由于一些巨大的改动可能会导致坏链接的出现.要检测这些站内的链接问题,可以通过一些在线的工具.比如Google Analytics,Bing Webmaster Tools,brokenlinkcheck.com等.尽管有现成的工具,我们也可以自己来编写一个.使用Python会非常容易. 参考原文:How to Check Broken Links with 404 Error in Pyt