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

最后修改:2019 年 11 月 13 日 12 : 59 AM