博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用scrapy 0.24 制作的小说爬虫
阅读量:7061 次
发布时间:2019-06-28

本文共 3003 字,大约阅读时间需要 10 分钟。

hot3.png

使用scrapy制作的小说爬虫

爬虫配套的django网站      

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

apt-get install python-devapt-get install python-lxml    apt-get install libffi-devpip 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 adbapiimport datetimeimport 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 = 5CONCURRENT_REQUESTS_PER_SPIDER = 5CLOSESPIDER_PAGECOUNT = 100000CLOSESPIDER_TIMEOUT = 36000DOWNLOAD_DELAY = 1.5  RETRY_ENABLED = FalseCOOKIES_ENABLED = False# http://www.ydzww.com

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

内容的过滤

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

(http(s)?://.)?(www\.)?[-a-zA-Z0-9@:!$^&\*%.()_\+~#=\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的稳定性还是值得肯定的

已经用这个爬虫程序制作了一个小说站,   

 

 

转载于:https://my.oschina.net/u/580843/blog/366787

你可能感兴趣的文章
[KMP]字符串匹配算法
查看>>
Copies in Seconds
查看>>
范内瓦·布什发表《诚如所思》,被信息界公认为是信息科学经典之作
查看>>
javascript基础修炼(10)——VirtualDOM和基本DFS
查看>>
算符优先文法,中缀式求值,栈的典型应用
查看>>
垃圾收集器(一)
查看>>
[转] 随机数是骗人的,.Net、Java、C为我作证
查看>>
第一天
查看>>
VUE基础插值表达式
查看>>
如何在mysql客户端即mysql提示符下执行操作系统命令
查看>>
人月神话读后感
查看>>
Learning Agile software Development
查看>>
window7利用Nexus搭建maven私有服务器
查看>>
java中的多态
查看>>
态度!!!
查看>>
[洛谷P4688][Ynoi2016]掉进兔子洞
查看>>
Android org.json.JSONArray cannot be converted to JSONObject
查看>>
Android2.3系统 自定义的PopupWindow在实例化时报空指针异常
查看>>
javascript 要注意的事项
查看>>
phpexcel中文手册
查看>>