Beispiel #1
0
class 慧聪网Item(scrapy.Item):
    actionConfigUtils = Store.take('慧聪网', SpidersConfigUitls(webName='慧聪网'))
    datas = actionConfigUtils.getDataCatch()
    for data in datas:
        exec(data['name'] + "=scrapy.Field()")
    _url = scrapy.Field()
    _catchTime = scrapy.Field()
Beispiel #2
0
    def run(self, args, opts):
        # 获取爬虫列表
        # spd_loader_list = self.crawler_process.spider_loader.list()  # 获取所有的爬虫文件。
        # 获取config.xml中的爬虫信息。
        actionConfigUtils = Store.take("actionConfigUtils",
                                       SpidersConfigUitls())
        for spname in actionConfigUtils.execs:
            self.crawler_process.crawl(spname['webName'], **opts.spargs)

        # for spname in spd_loader_list or args:
        #     #运行第一次爬虫
        #     # configUtils=Store.get(spname)
        #     # opts.spargs.setdefault(spname,configUtils)#给spider传递参数
        #     self.crawler_process.crawl(spname, **opts.spargs)

        self.crawler_process.start()
class APyspiderSpider(CrawlSpider):
    name = '{{spiderName}}'
    config = Store.take(name, SpidersConfigUitls(webName=name))  # 在Stroue中创建一个对象。如果有就创建,没有就
    rules = config.getRules()
    allowed_domains = config.getAllowed_domains()
    start_urls = config.getStart_urls()
    PrintTool.print("爬虫"+name+"开始采集信息!!", fontColor="green")
    def __init__(self, *args, **kwargs):
        super(APyspiderSpider, self).__init__(*args, **kwargs)
    # def parse_item(self, response):
    #         self.myResponse=response
    #         # self.loadDate(response)
    #         datas=self.config.getDataCatch()
    #
    #         ##下面这串代码比较难理解。实际上是拼出了字符串。"GysPyspidersItem(公司名=self.公司名,地址=self.地址,固定电话=self.固定电话,主营产品=self.主营产品,客户=self.客户,手机号=self.手机号,公司网站 = self.公司网站,公司简介 =self.公司简介,电子邮箱 = self.电子邮箱,经营模式 = self.经营模式,企业类型 = self.企业类型,城市 = self.城市,公司规模 =self.公司规模,注册资本 = self.注册资本,来源网站= self.来源网站,信息获取的来源url= self.信息获取的来源url,记录时间= self.记录时间,)"
    #         ##并且这些字符串的获取都是从config配置文件中获取的。
    #         line="{{spiderName}}Item(_url=response.url,"
    #         for data in datas:
    #             line+=data['name']+"=self.selectElementStr('"+data['select']+"'),"
    #         line+=')'
    #         item=eval(line)
    #         print(self.name+"_爬虫 成功获得以下数据!!"+time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())+"\n",item)
    #         yield item
    #     #一般只要修改这里的数值就可以啦
    def parse_item(self, response):
        self.myResponse=response
        # self.loadDate(response)
        datas=self.config.getDataCatch()
        ##下面这串代码比较难理解。实际上是拼出了字符串。"GysPyspidersItem(公司名=self.公司名,地址=self.地址,固定电话=self.固定电话,主营产品=self.主营产品,客户=self.客户,手机号=self.手机号,公司网站 = self.公司网站,公司简介 =self.公司简介,电子邮箱 = self.电子邮箱,经营模式 = self.经营模式,企业类型 = self.企业类型,城市 = self.城市,公司规模 =self.公司规模,注册资本 = self.注册资本,来源网站= self.来源网站,信息获取的来源url= self.信息获取的来源url,记录时间= self.记录时间,)"
        ##并且这些字符串的获取都是从config配置文件中获取的。
        line="{{spiderName}}Item(_url=response.url,_catchTime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),"
        mode=""
        mutiplateArrs=[]
        for data in datas:
            if data.get('mode')=='mutiplate':
                mode='mutiplate'
                mutiplateArrs.append(data.get('name'))
            line += data['name'] + "=self.selectElementStr('" + data['select'] + "'," + str(data.get('mode')) + "),"
        line+=')'
        item=eval(line)
        #待优化
        sitekey=""
        if mode=='mutiplate':
            items = []
            itemMutiplateArr = {}
            for mutiplateArr in mutiplateArrs:
                itemMutiplateArr.setdefault(mutiplateArr, CommonUtils.changeStrToList(item[mutiplateArr]))
            for key in item.keys():
                if key in mutiplateArrs:
                    its=CommonUtils.changeStrToList(item[key])
                    for itf in its:
                        items.append({key:itf})
                    sitekey=key
                    break
            for i in range(len(items)):
                templates=[]
                for key1 in item.keys():
                    if key1 in mutiplateArr:
                        if key1!=sitekey:
                            try:
                                items[i].setdefault(key1,itemMutiplateArr[key1][i])
                            except:
                                raise ValueError("mutiplate的长度不一致!"+ items)
                    else:
                        items[i].setdefault(key1,item[key1])
            # 待优化
            for item in items:
                print(self.name + "_爬虫 成功获得以下数据!!" + time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime()) + "\n",
                      item)
                yield item
        else:
            print(self.name+"_爬虫 成功获得以下数据!!"+time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())+"\n",item)
            print(item)
            yield item
        #一般只要修改这里的数值就可以啦
    def loadDate(self,response):##弃用!!!
        # print(self.configDocument)
        self['']
        self.公司名 = self.selectElementStr("#logoco > h1 > span")
        self.地址 = self.selectElementStr("#contact > div > dl > dd:nth-child(2)")
        self.固定电话 = self.selectElementStr("#contact > div > dl > dd:nth-child(4)")
        self.主营产品 = self.selectElementStr("#gongshang > div > table >  tr:nth-child(2) > td:nth-child(2)")
        self.客户 = self.selectElementStr("#contact > div > dl > dd:nth-child(6)")
        self.手机号 = self.selectElementStr("#contact > div > dl > dd:nth-child(8)")
        self.公司网站 = ""
        self.公司简介 = ""  # response.css("#aboutuscontent::text").extract()[0],
        self.电子邮箱 = self.selectElementStr("#contact > div > dl > dd:nth-child(10)")
        self.经营模式 = ""
        self.企业类型 = ""
        self.城市 = ""
        self.公司规模 = ""
        self.注册资本 = ""
        self.来源网站 = "顺企网"
        self.信息获取的来源url = response.url
        self.记录时间 = time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())
    #只要取得选择器,就能获得这个选择器当中的所有文本
    def selectElementStr(self, selecterStr, mode):
        try:
            arr = self.myResponse.css(selecterStr).extract()
            if mode == "mutiplate":
                textArr = []
                if len(arr) > 1:
                    for text in arr:
                        if text.strip() != "":
                            newStr = re.sub(r'<!--[\s\S]*?-->', "", text).strip()
                            newStr = re.sub(r'<.*?>', "", newStr).strip()
                            textArr.append(newStr)
                    newStr = str(textArr)
                else:
                    newStr = re.sub(r'<.*?>', "", arr[0]).strip()
            else:
                if len(arr) > 1:
                    for text in arr:
                        if text.strip() != "":
                            newStr = re.sub(r'<.*?>', "", text).strip()
                            break
                else:
                    newStr = re.sub(r'<.*?>', "", arr[0]).strip()
        except:
            newStr = ""

        return newStr
Beispiel #4
0
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
# 模板:替换位置:__spiderName__替换成spider的名称
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
from clientScrapySystem.webScrapySystem.GYS_pySpiders.Action import Store
from clientScrapySystem.webScrapySystem.GYS_pySpiders.utils.ConfigUtils_spider import SpidersConfigUitls
class {{spiderName}}Item(scrapy.Item):
    actionConfigUtils = Store.take('{{spiderName}}', SpidersConfigUitls(webName='{{spiderName}}'))
    datas=actionConfigUtils.getDataCatch()
    for data in datas:
        exec(data['name']+"=scrapy.Field()")
    _url=scrapy.Field()
    _catchTime=scrapy.Field()
    # 公司名 = scrapy.Field()
    # 地址 = scrapy.Field()
    # 固定电话 = scrapy.Field()
    # 主营产品 = scrapy.Field()
    # 客户= scrapy.Field()
    # 手机号 = scrapy.Field()
    # 公司网站= scrapy.Field()
    # 公司简介= scrapy.Field()
    # 电子邮箱= scrapy.Field()
    # 经营模式= scrapy.Field()
    # 企业类型= scrapy.Field()
    # 城市= scrapy.Field()
    # 公司规模= scrapy.Field()
    # 注册资本= scrapy.Field()
    # 来源网站= scrapy.Field()
    # 记录时间= scrapy.Field()
Beispiel #5
0
# This package will contain the spiders of your Scrapy project
#
# Please refer to the documentation for information on how to create and manage
# your spiders.
# 判断是否config.xml中需要被执行的spider是否存在,如果不存在则在template文件夹下面的的spider_template.py为模板创建,一个新
# 的spider。名字按照name命名
"""
根据配置文件中的爬虫项目,动态创建爬虫。根据模板创建(template/spider_template.py)。创建在本文件夹下面。
"""
import re
from clientScrapySystem.webScrapySystem.GYS_pySpiders.Action import Store
from clientScrapySystem.webScrapySystem.GYS_pySpiders.utils.ConfigUtils_spider import SpidersConfigUitls
import os
#获取其初始化配置文件(如果没有,则创建一个新的配置文件)
actionConfigUtils=Store.take("actionConfigUtils",SpidersConfigUitls())
#获取当前目录下(spider文件)所有的文件的工作路径。并保存在filePaths这个数组中 e.g['GYS_pySpiders/spiders/Spider_招商100.py', 'GYS_pySpiders/spiders/Spider_顺企网.py', 'GYS_pySpiders/spiders/__init__.py']
filePaths=[]
#获取当前目录下(spider文件)所有spider的name属性名 e.g:['招商100', '顺企网']
spiderNameFiles = []
for root, dirs, files in os.walk("GYS_pySpiders/spiders"):
    filePaths=list(map(lambda x:root+'/'+x,files))
    break
#读取spider文件下面所有spider文件(除了_init_.py文件)。并通过os流读取其spider的名称。并保存在spiderNameFiles数组中
for filePath in filePaths:
    files=open(mode='r',file=filePath,encoding='utf-8')
    lines=files.readlines()
        #存放了所有spider的名称
    for line in lines:
        if line.find('name')!=-1:
            newLine=line.strip().replace(' ','')
            if newLine.startswith("name="):
Beispiel #6
0
 def __init__(self):
     self.configUtils =SpidersConfigUitls()
Beispiel #7
0
class Func:
    def __init__(self):
        self.configUtils =SpidersConfigUitls()

    def scrapying(self, webName=""):  #
        """
        开始爬虫
        """
        if webName == "":
            pass
        else:
            execWeb = self.configUtils.xmlConfig.configDocumentObj['_children'][0]['exec']
            if execWeb==webName:
                pass
            else:
                self.configUtils.xmlConfig.configDocumentObj['_children'][0]['exec']=webName
                self.configUtils.xmlConfig.updata()
        execute(['scrapy', 'crawl', '_pySpider'])
        pass

    def addScrapyWeb(self, options={'webName': 'None',
                                    'start_url': '',
                                    'allowed_domains': '',
                                    'rules': [
                                        {
                                            'allow': '', 'follow': ''
                                        }
                                    ],
                                    'selectors': [
                                        {
                                            'name': '',
                                            'select': ''
                                        }
                                    ],
                                    'filePath': ''
                                    }):
        """
        :param
        webName:网站名称 不允许重复
        start_url:网站开始的名称
        allowed_domains:允许爬虫的域名
        scrapyName:爬虫的名字
        rules:爬虫的规则[(re,follow),] re:正则。follow:是否跟进(只允许一个不跟进)
        selectorsAndKey:选择器和字段名称

        检车是否可以使用
        :return
        """
        rules = []
        for rule in options['rules']:  # 添加rule
            rule.setdefault('_name', 'rule')
            if rule['follow'] == False:
                rule.setdefault('callback', 'parse_item')
            rules.append(rule)
        dataCatch = []
        for selector in options['selectors']:
            selector.setdefault('_name', 'data')
            dataCatch.append(selector)
        obj = {
            'webName': options['webName'],
            'start_url': options['start_url'],
            'allowed_domains': options['allowed_domains'],
            '_name': 'website',
            '_children': [
                {
                    '_name': 'rules',
                    '_children': rules
                },
                {
                    '_name': 'dataCatch',
                    '_children': dataCatch
                },
                {
                    '_name': 'dataSave',
                    '_children': [
                        {
                            '_name': 'file',
                            'path': options['filePath'],
                            'encoding': ''
                        }
                    ]
                }
            ]
        }
        # 将这个obj添加到虚拟文档中
        self._getConfigDocumentObjWebsites().append(obj)
        # 更新
        self.configUtils.updata()

    def removeScrapyWeb(self, webName):
        def remove(self):
            arr = self._getConfigDocumentObjWebsites()
            for i in range(0, len(arr)):
                if arr[i]['webName'] == webName:
                    self._getConfigDocumentObjWebsites().remove(arr[i])
                    return True
            # 移除脚本
            return False

        if remove(self) == True:
            self.configUtils.updata()
        else:
            print("无此元素,删除事变")

    def _getConfigDocumentObjWebsites(self):
        """
        中间方法:返回当前所有website对象
        """
        return self.configUtils.configDocumentObj['_children'][0]['_children']

    def modifyScrapyWeb(self, webName, ):
        pass

    def displayScrapyWeb(self, webName):
        """
        根据名称(webName)返回一个obj内存对象对象
        """
        website = self.configUtils.get('website', ('webName', webName))  # 获得website的DOM Element对象
        websiteObj = self.configUtils.loadObjectByTag(website)  # 获得该对象的Obj
        return websiteObj