标题中有个“最”字,应该很多人都是不服气的,不过继续往下看,不知能不能改变您的看法。

下面以采集http://www.scrapyd.cn/为例子

from simplified_scrapy.spider import Spider

class ScrapydSpider(Spider):

name = 'scrapyd-spider'#定义爬虫名称

start_urls = ['http://www.scrapyd.cn/']#初始化入口链接

models = ['auto_main','auto_obj']#配置抽取模型

上面这个就是一个完整的爬虫了,简不简单:)

要想运行这个爬虫,需要用上下面的代码:

from simplified_scrapy.simplified_main import SimplifiedMain

SimplifiedMain.startThread(ScrapydSpider())

如果想对采集做点过滤,只采集教程数据,重写下面的方法就行

#返回True表示url符合要求;False表示不符合要求,将丢弃 def urlFilter(self,url): return url.find('/jiaocheng/')>0# 只采集教程数据

当然上面的爬虫例子是采集文章数据的通用型采集,并且抽取出的数据并不是那么准确。我们可以自定义抽取,重写方法extract,代码如下:

def extract(self, url, html, models, modelNames):

try:

html = self.removeScripts(html)# 去掉脚本数据,也可以不去

lstA = self.listA(html,url["url"])#抽取页面中的链接

data = []

ele = self.getElementByTag("h1",html)#取标题

if(ele):

title = ele.text

ele = self.getElementByClass("cont",html,"")#取正文

if(ele):

content = ele.innerHtml

ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和时间

author = None

time = None if(ele and len(ele)>1):

time = ele[0].text

author = ele[1].text

data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})

return [{"Urls": lstA, "Data": data}]#将数据返回给框架,由框架处理

except Exception as e:

print (e)

框架集成了常用的抽取方法,通常的抽取毫无压力。那么抽取出的数据放在哪里了呢?默认的情况是存放在同级目录的文件夹data下面,格式为json,如下图所示

存储为文本实在是太简单了,基本不能用在生产环境。是的,框架还提供了其他的存储方式。框架默认使用sqlite存储链接数据和页面信息,用json存储抽取出的详情信息。如果想使用其他方式存储,可以像下面这样做

from simplified_scrapy.core.redis_urlstore

import RedisUrlStore

url_store = RedisUrlStore(name,{'host':'127.0.0.1','port':6379})

from simplified_scrapy.core.mongo_urlstore

import MongoUrlStore

url_store = MongoUrlStore(name,{"multiQueue":True})

from simplified_scrapy.core.mongo_objstore

import MongoObjStore

obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})

from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore

html_store = MongoHtmlStore(name)

框架还提供了mongodb,redis的存储方式,如果这些都满足不了需要,可以自己实现不同的存储方式。

对于页面的存储,需要实现下面几个方法

def popHtml(self,state=0):

def saveHtml(self,url,html):

def updateState(self,id,state):

链接数据的存储,需要实现下面的方法

def popUrl(self):

def getCount(self):

def checkUrl(self,url):

def saveUrl(self, urls,i=None):

def resetUrls(self, urls):

详情信息的存储,需要实现下面的方法

def saveObj(self, data):

下面是一个完整的例子:

from simplified_scrapy.spider import Spider

class ScrapydSpider(Spider):

name = 'scrapyd-spider'

start_urls = ['http://www.scrapyd.cn/']

# models = ['auto_main','auto_obj']

def urlFilter(self,url):

return url.find('/jiaocheng/')>0# 只采集教程数据

# from simplified_scrapy.core.mongo_objstore import MongoObjStore

# obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})

# from simplified_scrapy.core.mongo_urlstore import MongoUrlStore

# url_store = MongoUrlStore(name,{"multiQueue":True})

# from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore

# html_store = MongoHtmlStore(name)

def extract(self, url, html, models, modelNames):

try:

html = self.removeScripts(html)# 去掉脚本数据,也可以不去

lstA = self.listA(html,url["url"])#抽取页面中的链接

data = []

ele = self.getElementByTag("h1",html)#取标题

if(ele):

title = ele.text

ele = self.getElementByClass("cont",html,"")#取正文

if(ele):

content = ele.innerHtml

ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和时间

author = None

time = None

if(ele and len(ele)>1):

time = ele[0].text

author = ele[1].text

data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})

return [{"Urls": lstA, "Data": data}]#将数据返回给框架,由框架处理

except Exception as e:

print (e)

from simplified_scrapy.simplified_main import SimplifiedMain

SimplifiedMain.startThread(ScrapydSpider())#启动爬虫

对于一般的爬取需求,上面的功能基本够用了。但是如果一次只能启动一个爬虫,就太不方便管理了。是的,还有另一种组织方式。你可以把所有爬虫放在一个文件夹里(比如spiders),使用配置文件进行配置,配置文件名称默认为:setting.json。

{ "spiders":[ {"file":"spiders.scrapydSpider","class":"ScrapydSpider"} ] }

然后在任意python文件中执行下面的方法,启动爬虫

from simplified_scrapy.simplified_main import SimplifiedMain

SimplifiedMain.startThread()

这种方式启动,只有在配置文件中配置了的爬虫才会被执行。

差不多到这里,这个框架是不是简单又好用:)

框架的安装:

pip install simplified-scrapy

如果是Python2,还需要安装futures

pip install futures例子源码:https://download.csdn.net/download/dabingsou/11958062​download.csdn.net

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐