一个最简单好用的Python爬虫框架

标题中有个“最”字,应该很多人都是不服气的,不过继续往下看,不知能不能改变您的看法。
下面以采集http://www.scrapyd.cn/为例子

from simplified_scrapy.core.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.html
          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.core.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.html
          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

你可能感兴趣的:(一个最简单好用的Python爬虫框架)