其实原生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')