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函数完成单本书籍的抓取和保存
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)