def singleBookSave(subcategory,log,b,itemId): """***单本书函数:单本书籍的抓取、匹配、最后保存到数据库***""" #--得到单本书的信息,并保存到数据库--# imgUrl=getGroup(b,'ImgUrl') #取出封面小图地址 buyUrl=getGroup(b,'Url') #取出购买地址 title=b.group('Title') #取出书名 if title: title=title.decode('GBK') #如果title存在,进行转码 author=b.group('Author') #取出作者 if author: author=author.decode('GBK') #如果author存在,进行转码 publisher=b.group('Publisher') #取出出版社 if publisher: publisher=publisher.decode('GBK') #如果publisher存在,进行转码 date=b.group('Date') #取出出版日期 if date: date=date[10:].decode('GBK') #如果date存在,去掉“出版日期:” 四个字,并转码为UTF-8 price=getGroup(b,'Price') #取出当当价格,并转码 oprice=getGroup(b,'OPrice') #取出原价,并转码 state=getGroup(b,'State') #取出货存状态,并转码 #--如果得到的state为'link_sale',则有货,赋值为1,否则无货,赋值为0--# if state=='link_sale': state=1 else: state=0 #--记录当前事件--# log.currentEvent='Catch bookDetail_2' log.save() detailHtml=getHtml(buyUrl) #得到当前书籍的购买网页数据 try: bookDetail_2=compiledDetailPatterns_2.search(detailHtml) #抓取书的另一部分信息 edition=bookDetail_2.group('Edition')[11:].decode('GBK') #取出版次,去掉“版次:”,并转码 totalPage=bookDetail_2.group('TPage')[11:].decode('GBK') #取出总页数,去掉“页数:”,并转码 format=bookDetail_2.group('Format')[11:].decode('GBK') #取出开本,去掉“开本:”,并转码 isbn=bookDetail_2.group('ISBN')[13:].decode('GBK') #取出ISBN,去掉“ISBN:”,并转码 pack=bookDetail_2.group('Pack')[11:].decode('GBK') #取出装帧,去掉“装帧:”,并转码 bigImgUrl=bookDetail_2.group('BigImgUrl').decode('GBK') #得到封面大图地址,并转码 captionData=compiledCaptionPatterns.search(detailHtml) #抓取内容简介,并转码 if captionData: #如果匹配到简介,则取出 try: caption=captionData.group('Caption').decode('GBK') #对内容简介进行编码转换 except UnicodeDecodeError: #如果转换编码的过程中捕捉到UnicodeDecodeError,将caption赋值为None caption=None else: caption=None #如果没有匹配到简介,则赋值为None except AttributeError: edition='暂无' totalPage='暂无' format='暂无' isbn='暂无' pack='暂无' bigImgUrl='暂无' caption='暂无' #--保存数据到数据库--# bdetail=BookDetail(title=title,buyUrl=buyUrl,price=price,oprice=oprice, state=state,caption=caption,imgUrl=imgUrl,bigImgUrl=bigImgUrl, author=author,publisher=publisher,date=date,edition=edition, totalPage=totalPage,format=format,isbn=isbn,pack=pack, subCategory=subcategory.title,topCategory=subcategory.topcategory.title,siteId=subcategory.siteId) try: bdetail.save() #保存到数据库 except DataError: pass #如果捕捉到DataError,将其忽略,继续抓取 log.breakItemId=itemId #在Log里记录下当前序号 log.errorInfo='No Exception Raise' #书籍保存成功,无异常发生 log.currentEvent='Save Books Success' #当前事件为保存书籍成功 log.save() #保存Log
#--得到当前抓取网站相关信息--# site=SiteInfo.objects.get(id=id) #得到当前抓取的站点信息 log=Log.objects.get(siteId=id) #得到当前抓取站点的日志Log startUrl=site.startUrl #得到抓取的起始页地址 #--开始匹配和抓取--# try: topC=compiledTopPatterns.finditer(getHtml(startUrl)) #调用公共函数catchIter抓取所有一级分类,得到所有一级分类的迭代器 except URLError,e: #如果出现URLError,将错误记录到日志,并返回错误信息和当前事件 urlErrorHandler(log,e) #调用urlErrorHandler函数处理URLError log.currentEvent='Catch Category False' #如果发生异常,则记录事件为'Catch Category False' log.save() #保存log数据 return HttpResponse(log.errorInfo) #返回log信息 for top in topC: topLink=getGroup(top,'TopLink') #调用getGroup函数,取出一级分类url,并对其转码 topTitle=getGroup(top,'TopTitle') #调用getGroup函数,取出一级分类标题,并对其转码 tc=TopCategory(title=topTitle,url=topLink,siteId=id) #将一级分类数据保存到TopCategory的模型中,siteId为当前抓取站点的id值 tc.save() #保存一级分类到数据库 subHtml=top.group() #得到当前一级分类的匹配信息(其中包括每个子分类的列表) subC=compiledSubPatterns.finditer(subHtml) #对子分类进行匹配,得到当前一级分类下的所有子分类的一个迭代器 for sub in subC: #对子分类迭代器进行循环 subLink=getGroup(sub,'SubLink') #取出子分类url,并对其转码 subTitle=getGroup(sub,'SubTitle') #取出子分类标题,并对其转码 sc=SubCategory(title=subTitle,url=subLink,topcategory=tc,siteId=id) #将子分类数据赋值给SubCategory模型 sc.save() #保存子分类数据到数据库 #--记录日志--# log.errorInfo='No Exception Raise' log.currentEvent='Save Category Success' log.save() return HttpResponse('抓取成功,请<a href="/bookcatch/addsites/">返回</a>')