一个考拉海购的爬虫

  其实原生python来做爬虫是个挺简单的事,小站点的话用不到多线程,大型站点不用多线程就跑不动了肯定,曾经试过去学习scrapy,但是发现其实还不如用原生的写来得快,可能是我这里的需求都比较简单吧。


python3写的,写的很乱,用到了下面这些库,json和os是做的时候,调试用的,其实可以删掉。

关于我的编码规范,这简直惨不忍睹,最近也没有爬虫的需求,没什么用的机会,做的时候,还是要养成习惯比较好。

import requests
import urllib.request
import json
import re
import os
import codecs

title_head=('【官方进口直供】',
'【官方授权】',
'【赠品】',
'【礼盒装】',
'官方授权')

#获取网页和正则内容
def getdata(url,regexp):
	data=urllib.request.urlopen(url).read().decode('utf-8')
	arr=re.findall(regexp,data,re.S)
	return arr

#获取分类url
def geturl(c,page):
	#return "http://www.kaola.com/navigation.html?c={0}&pageNo={1}".format(c,page)
	return "http://www.kaola.com/category/{0}/{1}.html?pageNo={2}".format(c[0],c[1],page)

#存储所有数据
def save_csv(data,filename):
	str=''
	for i in data:
		str+=",".join(i)+"\n"

	f=codecs.open(filename,'w','utf-8')
	f.write(str)
	f.close()
	
	
def formate_data(data,categoryName,categoryName_2,categoryName_3):
	result=[]
	for q in data:
	
		#判断是否存在热销or新品标签
		if q[0].__len__()>20:
			#存在热销,新品
			activityflag=re.findall(">(.*?)<",q[0])[0]
		else:
			activityflag=''
		
		
		#获取商品品牌
		brand_tmp=q[2]
		for w in title_head:
			brand_tmp=q[2].replace(w,'')
		#过滤无关字符
		if brand_tmp.find('| ')!=-1:
			tmp=brand_tmp.split('| ')
			brand=tmp[1].strip().split(' ')
		else:
			brand=brand_tmp.strip().split(' ')
		#如果分割空格之后只有一个数据,那么信息中没有品牌
		if brand.__len__()>1:
			brand=brand[0].strip()
			if brand.__len__()>25:
				brand=''
		else:
			brand=''

		url="http://www.kaola.com/product/{0}.html".format(q[3])
		
		result.append(
			(
				brand,			#品牌
				q[1],			#价格
				activityflag,	#热销
				q[2].strip(),	#名称
				q[4],			#评论
				q[5],			#国家
				q[6],			#来源
				categoryName,	#一级分类
				categoryName_2,	#二级分类
				categoryName_3,	#三级分类
				url,			#url
				
			)
		)
	return result

#regexp
reg='<div class="activityflag">(.*?)</div>.*?<div class="desc clearfix">.*?<span class="cur"><i>¥</i>(.*?)</span>.*?<a class="title" title="(.*?)" href="/product/(\d+)\.html" data-param.*?<span class="icon"></span>(\d+)</a>.*?<span class="proPlace ellipsis">(.*?)</span>.*?<span>(.*?)</span>'


url='http://www.kaola.com/getFrontCategory.html'
r=requests.get(url)
category=r.json().get('frontCategoryList')

result_data=[]

#顶级分类
for i in category:
	#顶级分类名称
	categoryName=i['categoryName']
	#二级分类
	for o in i['childrenNodeList']:
		#二级分类名称
		categoryName_2	=o['categoryName']
		categoryId_2	=o['categoryId']
		
		#三级分类
		for p in o['childrenNodeList']:
			#三级分类名称
			categoryName_3	=p['categoryName']
			categoryId_3	=p['categoryId']
			
			print(categoryName,categoryName_2,categoryName_3)
			
			for l in range(1,100):
				url=geturl((categoryId_2,categoryId_3),l)
				data=getdata(url,reg)
				#没有数据那么跳出,遍历下一个分类
				if data==[]:
					break
				result_data.extend(formate_data(data,categoryName,categoryName_2,categoryName_3))


save_csv(result_data,'c:/xiji/python/kaola2/kaola_160810.csv')

kaola_spider_160810.txt


最后修改:2017 年 03 月 26 日 06 : 46 PM

发表评论