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()
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
# -*- 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()
# 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="):