用python3采集shopify站点商品

最近接到一个任务,要用wordpress+woocommerce建立几百个电商站点,站点上要有足够的商品数据。我当然是有自己团队的,不过目前我的团队就只有我和另外一个同事。这个任务的难点是商品数据,首先想到的是采集。尝试了火车头和八爪鱼,发现并不能满足我的需求。于是打算用python3来试试。

虽然不是程序员,但是我对程序的一些流程和思路还是比较了解的,对于这个任务,我的思路是:

第一步:把内容抓下来。

抓取页面用requests模块就可以实现了。因为我们要抓的内容不止是一个页面,所以还要考虑循环抓取。

第二步:把内容筛选出来。

一开始考虑用正则,后来无意从一本书上看到,说BeautifulSoup才是最好的。

第三步:把内容存起来。

因为导入wordpress需要特定的csv格式,这里需要考虑的就是如何保存为csv格式,还要特定的格式。

有了上面的大框架,还需要考虑一些细节问题。比如网络不好的时候怎么办?比如当存入内容的时候,文件被占用后不能存入数据怎么办?

具体的描述比较累,现在直接公布代码:

import requests,bs4,csv,os,re,time
'''采集商品url'''
def shopifylist(url):
    while True:
        try:
            res=requests.get(url,timeout=30)
            res.encoding = res.apparent_encoding
            print('请求',url,'状态',res.status_code)
            res.raise_for_status()#如果返回状态不是200,则抛出异常
            break
        except:
            timeout=3
            print('链接失败,等待',timeout,'秒重试')
            time.sleep(timeout)
            print('')
            print('重新链接中')
            
    print('链接顺畅,开始获取商品链接')
    noStarchSoup=bs4.BeautifulSoup(res.text,'html.parser')#html.parser 指定解析器
    url=noStarchSoup.select('.product-card.sc-pb-element')

    for i in range(len(url)):
        imgurl='https://tribalhollywood.com'+url[i].get('href')
        print('获取产品url')
        shopify(imgurl,site)#调用采集内容方法
        print('\n')
'''采集商品url结束'''

'''采集商品内容开始'''
def shopify(url,site):
    print('开始请求产品页面',url)
    while True:
        try:
            res=requests.get(url,timeout=30)
            res.encoding = res.apparent_encoding
            print('成功请求商品页面:',res.status_code)
            res.raise_for_status()#如果下载发生问题,就抛出异常
            break
        except:
            print('请求商品页面',url,'失败,重新链接')
    
    noStarchSoup=bs4.BeautifulSoup(res.text,'html.parser')
    #匹配class属性为‘wc-block-grid__product-title’的内容
    name=noStarchSoup.select('.product-single__title')
    name=name[0].getText()
    price=noStarchSoup.select('.product-single__price')
    price=price[0].getText()
    price=re.sub(' ','',price)
    price=re.sub('\n','',price)
    #特别注意class="rte product-single__description"只需要product-single__description
    des=noStarchSoup.select('.product-single__description')
    des=des[0].getText()
    des=re.sub('Hollywood','customadd.com',des)#替换版权信息
    
    img=noStarchSoup.select('#ProductThumbs-product-template img')
    
    if img==[]:
        img=noStarchSoup.select('.sc-pb-element1')
        l=img[0].get('src')
        l='http:'+l
        l=re.sub('_960x','',l)
    else:
        l=[]
        for i in range(len(img)):
            imgurl=img[i].get('src')
            imgurl=re.sub('_160x160','',imgurl)
            l.append('https:'+imgurl)
        l=','.join(l)

    fileHeader=['标题','产品url','价格','描述','图片']
    file=[name,url,price,des,l]
    #文件存储的地方,文件夹需要事先创建,并指定文件的格式为utf-8

    while True:
        try:
            csvFile=open(site,'a',encoding='utf-8')
            break
        except:
            print('')
            print(site+'文件写入失败,重试中。。。。。')
            time.sleep(5)

    size=os.path.getsize(site)#判断文件大小,如果文件大于0则表示文件有内
    writer=csv.writer(csvFile)
    if size==0:
        writer.writerow(fileHeader)
        writer.writerow(file)
        csvFile.close()
    else:
        writer.writerow(file)
        csvFile.close()
        print('采集成功!')

'''采集内容结束'''


#urlpro=str(input('输入要采集的商品列表'))
urlpro='https://www.tribalhollywood.com/collections/mens-necklaces'
site='D:\Backup\桌面\python3\mens-necklaces1.csv'
nt=['我不是空的']
n=1
while nt!=[]:
    url=urlpro+'?page='+str(n)
    prourl=shopifylist(url)#调用采集列表方法
    print('成功采集',n,'页')
    n=n+1
    res=requests.get(url)
    res.raise_for_status()
    noStarchSoup=bs4.BeautifulSoup(res.text,'html.parser')
    nt=noStarchSoup.select('.next')
print('全部采集完毕!!')
发表在 python3爬虫 | 标签为 , , , | 留下评论

用python3采集阿里巴巴国际站商品:下

采集阿里巴巴商品模块主要由三部分组成,第一部分是逐条读取商品url,第二部分是提取商品页面的有用内容,第三部分是把保存起来。

我这边保存商品url用的是txt格式,于是采用line = f.readline() 方法来逐条读取:

f = open("/Users/gaotiansong/Desktop/custom_shirt/urllist.txt")
line = f.readline() #逐条读取

提取商品页面的有用内容,我这里使用的是正则。正则模块是python3自带的,只需要import re 就可以正常使用了。

第三部分是保存。采集内容是为了导入网站,一般网站都支持csv格式导入,所以我们直接保存为csv格式。这里需要用到csv库,同样,csv库是python3自带的,import csv就可以了。

思路说完了,下面直接分享代码:

import requests,re,os,csv

'''采集方法开始'''
def caiji(url,n):
    target = url
    req = requests.get(url=target) #抓取到的内容
    html=req.text #转化为字符串
    mo=re.compile('.*logo\.(jpg|png)') #匹配图片地址模式
    mo1=re.compile('<title>.* -')#匹配标题模式
    mocs=re.compile('\/\/sc[0-9]{2}\.alicdn\.com\/kf\/.*?50x50\.jpg')
    moprice=re.compile('(\$[0-9]*\.[0-9]{2}){1}') #匹配价格
    
    price=moprice.findall(html)
    if price==[]:#商品不存在则跳过
        print('该商品不存在')
        return '错误'
    #price=price[0]#获取价格
    price=price[0]
    imgurl=mocs.findall(html)
    title=mo1.findall(html)
    title=title[0] #/把数组变成字符串,sub只能处理字符串
    mo2=re.sub(('<title>'),'',title) #删除‘<title>’
    h1=re.sub(' -','',mo2) #删除' -'
    print('采集:',h1)
    #处理图片链接问题
    url=set(imgurl) #把列表变成集合,删除重复项
    url=list(url) #把集合变成列表,方便处理
    url=','.join(url) #把列表中的项以“,”链接起来,转化为字符串
    url=re.sub('_50x50.jpg','',url)#查找_50x50.jpg替换成空,即删除
    url=re.sub('//','https://',url)#查找//替换成https://

    fileHeader=['标题','价格','图片地址'] #设置表单每列标题
    file=[h1,price,url]
    csvFile=open('/Users/gaotiansong/Desktop/custom_shirt/custom_shirt_pro.csv','a')
    writer=csv.writer(csvFile)
    if n==1:
        writer.writerow(fileHeader)
        writer.writerow(file)
    else:
        writer.writerow(file)
        csvFile.close()  
'''采集方法结束'''
#获取网址列表
f = open("/Users/gaotiansong/Desktop/custom_shirt/urllist.txt")
line = f.readline() #逐条读取
n=0
while line:
    url=line
    n=n+1
    caiji(url,n) #调用采集方法
    print('成功采集',n,'条')
    line = f.readline()
f.close() #关闭文件

如果你也喜欢python3 ,喜欢网络爬虫,欢迎一起交流。

发表在 python3爬虫 | 标签为 , | 留下评论