예제 #1
0
def bookDetailUpdate(request,id):
	"""***更新书籍:
	如果抓取得到的书籍已存在,则跳过;
	如果抓取得到的书籍不存在,表示是新书,则将其具体信息保存***"""
	
	#--得到上次抓取的断点信息--#
	log=Log.objects.get(siteId=id)                                                                   #取出当前抓取网站的Log
	lastBreakSubId=log.breakSubId                                                                 #得到上次抓取的断点子分类id
	lastBreakPageId=log.breakPageId                                                              #得到上次抓取的断点分页页码
	lastBreakItemId=log.breakItemId                                                               #得到上次抓取的分页中的具体断点书籍序号
	subcategory=SubCategory.objects.filter(siteId=id,id__gte=lastBreakSubId)   #得到该网站下所有id大于等于断点id的子分类(即从上次断点处开始抓取)
	
	#--对所有匹配分类进行判断和抓取--#
	for c in subcategory:                                                                                #对所有匹配分类进行循环
		log.breakSubId=c.id                                                                           #在日志里记录当前分类id
		log.breakSubTitle=c.title                                                                     #在日志里记录当前分类名称
		log.save()                                                                                          #保存Log
		firstUrl=c.url                                                                                      #得到子分类的图书列表地址(第一页)
		redirectUrl=urlopen(firstUrl).geturl()                                                    #得到子分类地址重定向后的地址(当当在这里做了重定向)
		
		#--得到总页数--#
		pageData=catchIter(pagePatterns,getHtml(redirectUrl))                         #抓取列表的分页信息
		try:
			for p in pageData:
				pagenum=p.group('Page')                                                       #得到当前子分类的总页数
			totalPageNum=int(pagenum)                                                         #将字符串转化为整型,用于下面的循环
		except NameError:  
			totalPageNum=1                                                                          #如果不存在第二页,则总页数为1
			
		#--开始抓取--#
		if c.id ==lastBreakSubId:                                                                    #判断当前子分类是否是上次断点子分类
			startPage=lastBreakPageId                                                           #如果是,则当前分类的起始页从上次断点分页处开始
			for i in range(startPage,totalPageNum+1):                                     #对所有匹配分页进行循环
				if i==startPage:                                                                    #判断是否是上次断点分页,如果是,则后面继续判断具体书籍序号
					if i==1:
						url=redirectUrl                                                          #如果上次断点分页为第一页,则使用第一页重定向后的地址redirectUrl
					else:
						url=getPageUrl(firstUrl,i)                                           #如果 i 不等于1,调用getPageUrl函数获取分页地址
					try:
						bookDetail_1=catchIter(detailPatterns_1,getHtml(url))  #抓取书的部分信息,得到当前页所有书籍的一个迭代器
					except URLError,e:                                                          #出现URLError异常后的处理
						urlErrorHandler(log,e)                                                #调用urlErrorHandler函数处理URLError
					itemId=0                                                                         #给当页具体书籍序号初始化
					for b in bookDetail_1:                                                       #对当前页的所有书籍进行循环
						itemId+=1                                                                 #记录下当前书籍序号
						if itemId <= lastBreakItemId:                                      #如果序号小于等于上次断点序号,跳过后面的语句
							continue
						else:                                                                         #如果序号大于上次断点序号,进行正常抓取和保存
							itemId+=1
							singleBookSave(c,log,b)                                         #执行单本书抓取和保存
				else:                                                                                      #如果不是上次断点分页,则执行正常抓取
					log.breakPageId=i                                                             #在Log里记录下当前分页页码
					log.save()                                                                         #保存到Log
					url=getPageUrl(firstUrl,i)
					try:
						bookDetail_1=catchIter(detailPatterns_1,getHtml(url))    #抓取书的部分信息,得到当前页所有书籍的一个迭代器
					except URLError,e:  
						urlErrorHandler(log,e)                                                 #调用urlErrorHandler函数处理URLError
					itemId=0
					for b in bookDetail_1:
						itemId+=1
						singleBookSave(c,log,b,itemId)                                    #调用singleBookSave函数完成单本书籍的抓取和保存
예제 #2
0
						urlErrorHandler(log,e)                                                 #调用urlErrorHandler函数处理URLError
					itemId=0
					for b in bookDetail_1:
						itemId+=1
						singleBookSave(c,log,b,itemId)                                    #调用singleBookSave函数完成单本书籍的抓取和保存
		else:
			startPage=1                                                                                #如果不是上次断点分类,则从第一页开始
			for i in range(startPage,totalPageNum+1):
				log.breakPageId=i  
				log.save()                                                                             #在Log里记录下当前分页页码
				if i==1:
					url=redirectUrl                                                                #如果i为1,则说明为第一页,使用第一页重定向后的地址redirectUrl
				else:
					url=getPageUrl(firstUrl,i)
				try:
					bookDetail_1=catchIter(detailPatterns_1,getHtml(url))         #抓取书的部分信息,得到当前页下所有书籍的迭代器
				except URLError,e:
					urlErrorHandler(log,e)                                                       #调用urlErrorHandler函数处理URLError
				itemId=0
				for b in bookDetail_1:
					itemId+=1
					singleBookSave(c,log,b)
					log.breakItemId=itemId
					log.save()
	return HttpResponse('抓取成功,请<a href="/bookcatch/addsite/">返回</a>')
	
def bookList(request,siteId,id):
	site=SiteInfo.objects.get(id=siteId)
	sub=SubCategory.objects.get(id=id)
	top=sub.topcategory
	booklist=BookDetail.objects.filter(siteId=siteId,subCategory=sub.title)