使用scrapy制作的小说爬虫

爬虫配套的django网站  https://www.zybuluo.com/xuemy268/note/63660

首先是安装scrapy,在Windows下的安装比较麻烦,大家好好百度下,这里就不细说了,在ubuntu下的安装

apt-get install python-dev
apt-get install python-lxml
apt-get install libffi-dev
pip install scrapy

爬取小说的话无非就是爬取两个页面,小说介绍页和小说章节页,然后又分为2种情况

    1. 小说介绍页中含有章节列表目录
    2. 小说介绍页中不含章节列表目录,但是含有指向章节列表的URL

相对于a情况来说:

def parse(self,response):
# 使用xpath,获取小说名,作者,分类,介绍,章节列表URL
#使用下面的方法获取章节列表URL可以直接使用Request(),还能直接获得章节名
#http://www.ydzww.com
    SgmlLinkExtractor(restrict_xpaths=(config.get("NovelChapterList_XPATH"),),).extract_links(response)

对于b情况:

#可以使用xpath 获取 指向章节列表的URL,如何url不完整的话可以使用
get_base_url(response) 获取域名信息,然后使用moves.urllib.parse.urljoin()进行拼接
#然后就可以使用Request(),后面的步奏基本上就和a情况一样了
#http://www.ydzww.com

插入数据库这个方面,google一下,使用twisted的数据库接口,好像这个是异步的,配合scrapy估计会更好,要是使用别的也没有关系,我用的django Model 没发现问题

提供一个网上搜出来的代码

# Cannot use this to create the table, must have table already created

from twisted.enterprise import adbapi
import datetime
import MySQLdb.cursors

class SQLStorePipeline(object):

    def __init__(self):
        self.dbpool = adbapi.ConnectionPool(‘MySQLdb‘, db=‘mydb‘,
                user=‘myuser‘, passwd=‘mypass‘, cursorclass=MySQLdb.cursors.DictCursor,
                charset=‘utf8‘, use_unicode=True)

    def process_item(self, item, spider):
        # run db query in thread pool
        query = self.dbpool.runInteraction(self._conditional_insert, item)
        query.addErrback(self.handle_error)

        return item

    def _conditional_insert(self, tx, item):
        # create record if doesn‘t exist.
        # all this block run on it‘s own thread
        tx.execute("select * from websites where link = %s", (item[‘link‘][0], ))
        result = tx.fetchone()
        if result:
            log.msg("Item already stored in db: %s" % item, level=log.DEBUG)
        else:
            tx.execute(                "insert into websites (link, created) "
                "values (%s, %s)",
                (item[‘link‘][0],
                 datetime.datetime.now())
            )
            log.msg("Item stored in db: %s" % item, level=log.DEBUG)

    def handle_error(self, e):
        log.err(e)

#该代码片段来自于: http://www.sharejs.com/codes/python/8392
#http://www.ydzww.com

另外就是爬虫控制这块,使用默认的控制,爬虫爬的太快了,有封站的危险,再有就是怕那么快,把采集站爬掉了,以后采集谁的呀?

# 同时下载个数
CONCURRENT_REQUESTS = 5
CONCURRENT_REQUESTS_PER_SPIDER = 5
CLOSESPIDER_PAGECOUNT = 100000
CLOSESPIDER_TIMEOUT = 36000
DOWNLOAD_DELAY = 1.5
RETRY_ENABLED = False
COOKIES_ENABLED = False
# http://www.ydzww.com

这个是我的配置,从我这么多天的采集来看,一分钟采集40个左右的页面,也差不多了

内容的过滤

基本上内容都是用xpath来获取的,然后章节内容也里面还使用了一些正则,去除内容里面的URL,还有一些有关采集站的信息

(http(s)?://.)?(www\.)?[[email protected]:!$^&\*%.()_\+~#=\uff10-\uff40{}\[\]]{2,256}[\[\]{}!$^\*&@:%._\+~#=()][\[\]{}a-z!$^\*&@:%._\uff10-\uff40\s]{2,6}\b([\[\]-a-zA-Z0-9()@:%_\+.~#?&//=]*)
# www.ydzww.com

这个是我使用来处理内容页url的正则,到目前为止采集小说里面没有碰到处理不了的URL,要是大家能发现有处理不了的话,评论一下,我好做个修改,方便大家使用么!

爬虫比现行的小说爬虫来说,优点有以下几点:

  1. 能在linux下面完美运行,windows下面能运行,但是有时可能出现log文件乱码
  2. 通过和数据库的配置,一本小说对应一个采集站,3分钟循环监控单本小说,保证小说能够在最快的时间采集
  3. 运行快速稳定,scrapy的稳定性还是值得肯定的

已经用这个爬虫程序制作了一个小说站, 易读中文网

时间: 2024-11-07 20:19:55

使用scrapy制作的小说爬虫的相关文章

C#最基本的小说爬虫

新手学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站. 第一次搞爬虫,涉及到了网络协议,正则表达式,弄得手忙脚乱跑起来效率还差劲,慢慢改吧. 爬的目标:http://www.166xs.com/xiaoshuo/83/83557/ 一.先写HttpWebRequest把网站扒下来 这里有几个坑,大概说下: 第一个就是记得弄个代理IP爬网站,第一次忘了弄代理然后ip就被封了..... 第二个就是要判断网页是否压缩,第一次没弄结果各种转码gbk utf都是乱

使用django+mysql+scrapy制作的一个小说网站

小说网站用的程序都是千篇一律的,jieqi + guanguang,无聊时间学习python+django,也做了一个小说网站,下面说一说做这个网站一些过程, 制作这种采集站,最要紧的是要有一个好的采集器,在python的世界里面,爬取网页真是小菜一碟,urllib urllib2 requests 都是神器,不过为了追求程序的稳定性和易用性,我采用了scrapy这个第三方采集库 在windows下安装这个采集库有点麻烦,给大家推荐一个网站 http://www.lfd.uci.edu/~goh

[转载]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程

我们使用dmoz.org这个网站来作为小抓抓一展身手的对象. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建项目 (Project):新建一个新的爬虫项目 明确目标(Items):明确你想要抓取的目标 制作爬虫(Spider):制作爬虫开始爬取网页 存储内容(Pipeline):设计管道存储爬取内容 好的,基本流程既然确定了,那接下来就一步一步的完成就可以了. 1.新建项目(Project) 在空目录下按住Shift键右击,选择“在此处打开命令窗口”,输入一

【nodejs爬虫】使用async控制并发写一个小说爬虫

最近在做一个书城项目,数据用爬虫爬取,百度了一下找到这个网站,以择天记这本小说为例. 爬虫用到了几个模块,cheerio,superagent,async. superagent是一个http请求模块,详情可参考链接. cheerio是一个有着jQuery类似语法的文档解析模块,你可以简单理解为nodejs中的jQuery. async是一个异步流程控制模块,在这里我们主要用到async的mapLimit(coll, limit, iteratee, callback) async.mapLim

使用scrapy框架---爬小说,入库

本人步骤: 1>setting.py: BOT_NAME = 'newding' SPIDER_MODULES = ['newding.spiders']NEWSPIDER_MODULE = 'newding.spiders' ROBOTSTXT_OBEY = True ITEM_PIPELINES = { 'newding.pipelines.NewdingPipeline': 300,} 以上配置:创建项目会自动出现这些 以下是想要入数据库的(阶段): MYSQL_USER = 'root'

使用scrapy进行股票数据爬虫

周末了解了scrapy框架,对上次使用requests+bs4+re进行股票爬虫(http://www.cnblogs.com/wyfighting/p/7497985.html)的代码,使用scrapy进行了重写. 目录结构: stocks.py文件代码 1 # -*- coding: utf-8 -*- 2 import scrapy 3 import re 4 5 6 class StocksSpider(scrapy.Spider): 7 name = "stocks" 8 s

Scrapy 轻松定制网络爬虫

网络爬虫(Web Crawler, Spider)就是一个在网络上乱爬的机器人.当然它通常并不是一个实体的机器人,因为网络本身也是虚拟的东西,所以这个“机器人”其实也就是一段程序,并且它也不是乱爬,而是有一定目的的,并且在爬行的时候会搜集一些信息.例如 Google 就有一大堆爬虫会在 Internet 上搜集网页内容以及它们之间的链接等信息:又比如一些别有用心的爬虫会在 Internet 上搜集诸如 [email protected] 或者 foo [at] bar [dot] com 之类的

Scrapy:Python的爬虫框架

网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便. Scrapy使用了Twisted异步网络库来处理网络通讯.整体架构大致如下: Scrapy主要包括了以下组件: 引擎,用来处理整个系统的数据流处理,触发事务. 调度器,用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回. 下载器,用于下载网页

Python下用Scrapy和MongoDB构建爬虫系统(1)

本文由 伯乐在线 - 木羊 翻译,xianhu 校稿.未经许可,禁止转载!英文出处:realpython.com.欢迎加入翻译小组. 这篇文章将根据真实的兼职需求编写一个爬虫,用户想要一个Python程序从Stack Overflow抓取数据,获取新的问题(问题标题和URL).抓取的数据应当存入MongoDB.值得注意的是,Stack Overflow已经提供了可用于读取同样数据的API.但是用户想要一个爬虫,那就给他一个爬虫. 像往常一样,在开始任何抓取工作前,一定要先查看该网站的使用/服务条