整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

python网络爬虫-爬取淘宝联盟

python网络爬虫-爬取淘宝联盟

联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前。

网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是全球统一资源定位符URL,用来定义互联网上一个唯一的资源 例如:一张图片、一个文件、一段视频都可以用url唯一确定。

爬虫的基本流程:

  1. 发送请求
  2. 获得相应内容
  3. 解析内容
  4. 保存数据

爬虫所需的工具:

1. 请求库:requests,selenium(可以驱动浏览器解析渲染CSS和JS,但有性能劣势(有用没用的网页都会加载))

2. 解析库:正则,xpath,beautifulsoup,pyquery

3. 存储库:文件,MySQL,Mongodb,Redis

下面实现一个爬虫,爬取符合条件的淘宝联盟网站的商品。

1. URL分析

我们首先打开淘宝联盟网址,在搜索栏随便输入一件 商品,比如“鞋子”

2. 按F12可以查看访问当前网页发送的所有请求

现在发现没东西,因为有的网站是动态加载的,当我们下拉滚动条时,看到有如下请求:

然后点击下一页,在 下面的请求:

通过分析这就是我们所要请求的URL。

3. 请求头

User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户host;

cookies:cookie用来保存登录信息

注意: 一般做爬虫都会加上请求头

请求头需要注意的参数:

(1)Referrer:访问源至哪里来(一些大型网站,会通过Referrer 做防盗链策略;所有爬虫也要注意模拟)

(2)User-Agent:访问的浏览器(要加上否则会被当成爬虫程序)

(3)cookie:请求头注意携带

4、请求体

    如果是get方式,请求体没有内容 (get请求的请求体放在 url后面参数中,直接能看到)
    如果是post方式,请求体是format data
 
    ps:
    1、登录窗口,文件上传等,信息都会被附加到请求体内
    2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

5、响应状态码

  200:代表成功

  301:代表跳转

  404:文件不存在

  403:无权限访问

  502:服务器错误

2. 请求并获取响应

我们通过不同的方式来分别请求并获取响应,具体实现如下:

1.url请求,获取响应的json数据,并将json数据转换成dict 采用 urllib2 实现

#url请求,获取响应的json数据,并将json数据转换成dict  采用 urllib2 实现
def getJSONText(url):
    try:
        page=urllib2.urlopen(url)
        data=page.read()
        #print (data)
        #print (type(data))
        #dict_data=json.loads(data)
        dict_data=demjson.decode(data)
        #print dict_data
        #print type(dict_data)
        return dict_data
    except:
        return ""

2.#url请求,获取响应的json数据,并将json数据转换成dict 采用 添加请求头、设置代理的方式 实现

#url请求,获取响应的json数据,并将json数据转换成dict  采用 添加请求头、设置代理的方式 实现
def getJSONText2(url):
    try:
        proxies={
            "http": "http://221.10.159.234:1337",
            "https": "https://60.255.186.169:8888",
        }
        headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
        data=requests.get(url, headers=headers,proxies=proxies).text
        print (data)
        print (type(data))
        # dict_data=json.loads(data)
        dict_data=demjson.decode(data)
        print dict_data
        print type(dict_data)
        return dict_data
    except:
        return "" 

3.采用selenium实现

#url请求,获取响应的json数据,并将json数据转换成dict  采用selenium实现
def get_browser_text(url):
    #browser=webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
    browser=webdriver.Firefox(executable_path="C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe")
    try:
        browser.get(url)
        print(browser.page_source)
        browserdata=browser.page_source
        browser.close()
        # res=r'<a .*?>(.*?)</a>'
        res=r'<pre .*?>(.*?)</pre>'
        json_data=re.findall(res, browserdata, re.S | re.M)
        print json_data
        for value in json_data:
            print value
 
        dict_data=demjson.decode(json_data)
        print 'dict_data:'
        print dict_data
        # print type(dict_data)
        return dict_data
    except:
        return ""

4.

# 获取单个商品的HTML代码并用正则匹配出描述、服务、物流3项参数  采用urllib2
def getHTMLText(url):
    try:
        data=urllib2.urlopen(url).read()
        res=r'<dd class="tb-rate-(.*?)"'
        data_list=re.findall(res, data, re.S | re.M)
        print type(data_list)
        print data_list[0]
        #for value in mm:
        #   print value
        return data_list
    except:
        return  ""

3. 爬虫完整代码如下:

#coding=utf-8
__author__='yansong'
# 2018.07.12
# 抓取淘宝联盟 比率>10 ,描述、服务、物流3项参数高于或持平于同行业的商品图片。
 
 
import json
import demjson
import urllib2
import os
import time
import requests
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import sys
reload(sys)
sys.setdefaultencoding('utf8')
 
path_name=u'T恤宽松日系男款'  #图片保存的文件夹名称
Myname=u'T恤宽松日系男款'   #搜索关键字
 
# 创建文件夹
path=os.getcwd()   				     # 获取此脚本所在目录
new_path=os.path.join(path,path_name)
if not os.path.isdir(new_path):
	os.mkdir(new_path)
 
#url请求,获取响应的json数据,并将json数据转换成dict  采用selenium实现
def get_browser_text(url):
    #browser=webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
    browser=webdriver.Firefox(executable_path="C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe")
    try:
        browser.get(url)
        print(browser.page_source)
        browserdata=browser.page_source
        browser.close()
        # res=r'<a .*?>(.*?)</a>'
        res=r'<pre .*?>(.*?)</pre>'
        json_data=re.findall(res, browserdata, re.S | re.M)
        print json_data
        for value in json_data:
            print value
 
        dict_data=demjson.decode(json_data)
        print 'dict_data:'
        print dict_data
        # print type(dict_data)
        return dict_data
    except:
        return ""
 
 
#url请求,获取响应的json数据,并将json数据转换成dict  采用 urllib2 实现
def getJSONText(url):
    try:
        page=urllib2.urlopen(url)
        data=page.read()
        #print (data)
        #print (type(data))
        #dict_data=json.loads(data)
        dict_data=demjson.decode(data)
        #print dict_data
        #print type(dict_data)
        return dict_data
    except:
        return ""
 
 
# 获取单个商品的HTML代码并用正则匹配出描述、服务、物流3项参数  采用urllib2
def getHTMLText(url):
    try:
        data=urllib2.urlopen(url).read()
        res=r'<dd class="tb-rate-(.*?)"'
        data_list=re.findall(res, data, re.S | re.M)
        print type(data_list)
        print data_list[0]
        #for value in mm:
        #   print value
        return data_list
    except:
        return  ""
 
 
#url请求,获取响应的json数据,并将json数据转换成dict  采用 添加请求头、设置代理的方式 实现
def getJSONText2(url):
    try:
        proxies={
            "http": "http://221.10.159.234:1337",
            "https": "https://60.255.186.169:8888",
        }
        headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
        data=requests.get(url, headers=headers,proxies=proxies).text
        print (data)
        print (type(data))
        # dict_data=json.loads(data)
        dict_data=demjson.decode(data)
        print dict_data
        print type(dict_data)
        return dict_data
    except:
        return ""
 
 
def getJSONText3(url):
    try:
        driver=webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe")
        driver.get(url)  # 访问淘宝宝贝页面,获取cookie
        # driver.get(taobao_comment_url)  # 直接访问宝贝评论会被反爬虫检测到。上一步获得cookie后可得到评论数据
        print(driver.find_element_by_xpath('/html/body').text)
        data=driver.find_element_by_xpath('/html/body').text
        #data=requests.get(url, headers=headers,proxies=proxies).text
        print (data)
        print (type(data))
        # dict_data=json.loads(data)
        dict_data=demjson.decode(data)
        print dict_data
        print type(dict_data)
        return dict_data
    except:
        return ""
 
 
def mytaobao_spider():
    # 每一页的url  循环抓取60页
    for page in range(0, 60):
 
        url=(
        'http://pub.alimama.com/items/search.json?q=%s&_t=1531556288035&toPage=%d&perPageSize=50&auctionTag=&shopTag=yxjh&t=1531556427336&_tb_token_=7e73deef30e18&pvid=10_117.136.70.61_599_1531556285246' % (
        Myname, page))
        # url=('http://pub.alimama.com/items/channel/qqhd.json?q=%s&channel=qqhd&_t=1531121449018&toPage=%d&perPageSize=50&shopTag=&t=1531125125414&_tb_token_=eeee6ee3be688&pvid=19_118.112.188.32_688_1531125125232'%(Myname,page))
        # url=('http://pub.alimama.com/items/search.json?q=%E9%9E%8B%E5%AD%90&_t=1531368912715&auctionTag=&perPageSize=50&shopTag=yxjh&t=1531368913289&_tb_token_=e370663ebef17&pvid=10_118.112.188.32_9532_1531368912863')
        print url
        time.sleep(2)  # 延时2秒,添加延时操作是因为淘宝有反爬虫机制,过于频繁的访问IP可能会被限制
        url_data=getJSONText(url)
        # 一页中每件商品的标签信息
        for i in range(0, 50):
            time.sleep(1)
            try:
                # print type(url_data['data']['pageList'][i]['pictUrl'])
                pictUrl=url_data['data']['pageList'][i]['pictUrl']  # 图片url
                sellerId=url_data['data']['pageList'][i]['sellerId']  # 商品id
                auctionUrl=url_data['data']['pageList'][i]['auctionUrl']  # 淘宝链接
                auctionId=url_data['data']['pageList'][i][
                    'auctionId']  # 淘宝链接='http://item.taobao.com/item.htm?id=%d'%(auctionId)
                tkRate=url_data['data']['pageList'][i]['tkRate']  # 比率
                zkPrice=url_data['data']['pageList'][i]['zkPrice']  # 价格
 
                # 需要抓取比率大于10.00的商品信息
                if tkRate > 10.00:
                    # time.sleep(1)
                    # print '详细信息:'
                    # print type(tkRate)
                    # print type(zkPrice)
                    # print '比率:%f' % (tkRate)
                    # print '价格:%f' % (zkPrice)
                    # print sellerId
                    # print auctionId
                    # print pictUrl
                    # print auctionUrl  # 淘宝链接
                    # print type(sellerId)
                    print auctionUrl
 
                    # 每件商品的子url (描述相符、发货速度、服务态度 等信息)
                    # sub_url=('http://pub.alimama.com/pubauc/searchPromotionInfo.json?oriMemberId=%d&blockId=&t=1531369204612&_tb_token_=e370663ebef17&pvid=10_118.112.188.32_760_1531368931581' % (sellerId))
                    sub_url=auctionUrl  # 每件商品的淘宝url
                    sub_url_data=getHTMLText(sub_url)  # 获取店铺的 描述、服务、物流 信息
                    print type(sub_url_data)
                    print len(sub_url_data)
 
                    # 如果返回的是空字符串, 则说明没有取到我们想要的字段,是因为淘宝有不同的页面,对于这种页面我们需要进一步分析下面的url
                    if (len(sub_url_data)==0):
                        info_url=('https://world.taobao.com/item/%d.htm' % (auctionId))
                        info_data=urllib2.urlopen(info_url).read()
                        res_info=r'<li class="([^s].*?)<img'
                        tmp_url_data=re.findall(res_info, info_data, re.S | re.M)
                        print "tmp_url_data:"
                        for value1 in tmp_url_data:
                            print value1
 
                        sub_url_data=[]
                        score_list=[x[0:4] for x in tmp_url_data]  # 截取前面5位
                        print 'new_list:'
                        for score in score_list:
                            print score
                            if score=='down':
                                score='lower'  # d第一种页面与第二种页面返回的店铺评定信息不同,需转换成统一的方便后面处理,将 down 转换为 lower
                            sub_url_data.append(score)
 
                        print '替换后的list元素:'
                        for level_data in sub_url_data:
                            print level_data
                    # 如果3项评定参数都不是‘lower’ 就将图片和相关信息抓取出来   任意一项参数为‘lower’都不符合要求
                    if ((not (sub_url_data[0]=='lower')) and (not (sub_url_data[1]=='lower')) and (
                    not (sub_url_data[2]=='lower'))):
                        # for value in sub_url_data:
                        #   print value
 
                        mypictUrl='http:' + pictUrl  # 图片url
                        picture_content=urllib2.urlopen(mypictUrl).read()
                        picture_name=auctionUrl + '.jpg'  # 拼接图片名称
                        print picture_name
                        time.sleep(1)
 
                        # 需要写入文件的信息
                        spider_info='url:' + url + '\n' + '  sub_url:' + sub_url + '\n' + '  淘宝链接:' + auctionUrl + '\n' + '  mypictUrl:' + mypictUrl + '\n\n'
                        try:
                            # 写图片
                            index_num=picture_name.index('id=')
                            with open(path_name + '/' + picture_name[index_num:], 'wb') as code:
                                code.write(picture_content)
                            # 写URL信息
                            with open(path_name + '/' + 'spider.txt', 'a') as spider_code:
                                spider_code.write(spider_info)
                        except (IOError, ZeroDivisionError), e:
                            print e
                            print "Error: 没有找到图片文件或读取文件失败"
                        else:
                            print "图片写入成功"
 
                        time.sleep(1)
 
            except (IndexError, KeyError, TypeError), e:
                print e
                print "每件商品信息读取失败"
            else:
                pass
                # print "每件商品的标签信息读取成功"
 
 
if __name__=='__main__':
    mytaobao_spider()

4. 运行效果

抓取的图片在指定的目录下:

同时写了一个spider.txt文件,里面是详细的URL信息:

单个商品的淘宝链接如:http://item.taobao.com/item.htm?id=566676904510

淘宝链接构成: http://item.taobao.com/item.htm?+id=566676904510 抓取的图片名称是以商品的id来命名的,我们根据图片就可以快速找到该商品,该爬虫抓取的都是 比率>10 ,描述、服务、物流3项参数高于或持平于同行业的商品,也可以根据自己需要,抓取价格、销售量等符合自己要求的商品。

样在微信上发淘宝商品链接?相信很多淘宝卖家都有过这样的疑问,不过这个貌似都是2014年的话题了拖到现在好像没什么特别的讨论价值,但是淘宝商品如何有效精准的推广到微信是一直卖家们比较关注的问题。其实就淘宝商品推广到微信有很多优质的淘宝卖家在这方面很有心得,他们经常会在一些比较知名的行业论坛分享,到目前为止有很多的中小卖家纷纷效仿把淘宝流量分到微信上。淘宝链接分享到微信,目前比较常规的方法就是淘宝商品的分享按钮,可以直接复制口令到微信,很方便。这里小编在这里再分享一个可以把淘宝图文链接分享到微信的方法技巧:

第一步:打开百度网页搜索:"甩手工具箱"并下载,登录工具箱;

第二步:打开工具首页,找到“推广商品到微信”功能;

第三步:进入甩手工具箱常规的抓取页面,有三种抓取方式供选择;

第四步:以第一种抓取方式为例:点击进入第一个店铺,进入店铺首页,抓取整页or整店商品;

第五步:选择性抓取所需生成二维码的商品,选择下一步;

第六步:批量生成商品二维码,通过扫描二维码即可实现淘宝商品图文链接快速分享到微信朋友圈。

通过上面六个步骤的操作即可完成”推广商品到微信”的全过程,简单总结就三个步骤:搜索-抓取-生成,可以用作商品二维码,也可以实时分享到微信朋友圈。

很多卖家朋友通常是把店铺流量通过返现或者打折等方式导流到微信圈子中,然后通过日常的维护,在合适的时间再导流回淘宝。也有的朋友,通过自己培养精准的微信朋友圈子,在微信上发淘宝商品链接导流到淘宝店铺。所以在解决完"怎样在微信上发淘宝商品链接"问题之后,需要把重心放在微信圈子的维护的工作上。

更多内容关注微信:450647316

写在最前面※

【关于商品审核时间】

工作日

10:30之前提交审核的,11:00之前审完

15:00之前提交审核的,15:30之前审完

20:00之前提交审核的,20:30之前审完

周末/公共假期

20:00之前提交审核的,20:30之前审完

如果审核遇到问题,请将审核未通过的商品编号发到群里(如:6535408016756310200,可在商品管理中查看),我们会集中为大家处理。

商品前端展示与后台录入内容对照示例:

一、创建商品

点击“商品”—“创建商品”

二、设置产品参数

支付方式:在线支付。目前小店仅支持这一种支付方式

商品URL:(此项选填)可填入淘宝/天猫(其他平台暂不支持)商品链接后,点击获取宝贝详情,自动获取已有宝贝已有淘宝/天猫商品信息

-效果如图【抓取后的信息请认真核对,如有顺序颠倒、图片未能正常抓取 请手动补充调整】

产品标题:准确简洁的描述商品,如:不锈钢真空保温杯,长效保温,支持验货

※如果是虚拟商品,请在标题写清楚【线上发货,无物流信息】

卖点:四个汉字(前端不展示)

商家推荐语:用一句话描述并推荐一下商品的优点,如:大分量雨前龙井茶 (前端不展示)

商品类目:请根据商品属性选择,可参考:类目对应表:https://shimo.im/sheet/AbmrMa54LOgps9qT。不同类目涉及的商品规格信息不同。

商品规格:请按实际情况填写

价格:需不高于市场同类商品价格,并且在后续设置的订单套餐价格范围内

原价:不填

佣金比例:0

运费设置:运费默认为包邮,如果您设置运费的需求,请新建运费模板并选择。

※如何新建运费模板?

1.选择【运费设置】右边的【新建运费模板】

或者进入【物流】-【运费模板】新建运费模板

2.设置模板名称、宝贝地址

模板名称:请根据需求随意设置

宝贝地址:宝贝地址为商家发货地址,请选择商品上线后的实际发货地

3.选择计价方式

按件数计价:选择按件数计价,填写默认运费,如 1件10元,没增加1件,增加运费2元。

按重量计价:选择按件数计价,填写默认运费,如 1kg10元,每增加1kg,增加运费2元。

4.设置指定地区运费

如果有些地区不采用默认运费,需要单独设置。请点击【为指定地区设置运费】,设置特定地区的运费规则。计价方式 与之前选择的计价方式一致。

注意:此项不是必须设置,如统一运费规则,不需要设置此项。

5.点击【提交】完成新增运费模板

三、设置产品主图

主图要求如下:

1.必须上传5张图片

2.图片必须为正方形(长宽比1:1)简易图片裁剪教程:https://jingyan.baidu.com/article/cd4c29793d0a39756f6e6077.html

3.只支持png,jpg,jpeg三种格式的图片

四、产品详情

1.建议将详情内容做成宽度为600的图片后上传,每张图片大小最好控制在1M左右。只支持png,jpg,jpeg三种格式的图片。如需上传动图,请先将图片扩展名改为.jpg。

(修改方式:http://dwz.cn/7XOHP2)【请注意 一定要上传图片!文本形式的产品详情严重影响转化率,提交审核后会被驳回哦!】

2.详情页图片中要说明商品规格重量、特点、优势、使用方法、保质期等,从多角度尽量展示商品的全部细节。文字说明建议做成图片,便于阅读。

3.如无详情,可将主图图片辅以文字说明制作成详情图片,合理排序后上传。

五、订单套餐

↑这是个GIF↑

1.首先点击“创建商品规格”

-规格名称:可根据产品名称填写

-子规格名称:可根据商品的规格类型填写,如:颜色、套餐组合、图案、瓶、盒等

-子规格选项:可填写商品的具体规格内容,如:商品重量、商品数量、商品尺寸等

【子规格的数量。选项可根据实际情况增加减少】

设置完成后点击确定

2.选择已经保存的规格名称,设置库存价格商品编码

商品编码不展示给用户,可自行设置

单价可以大于或者小于售价,但是必须有一个套餐价格与售价保持一致

库存数量可设置较大数值,防止商品卖光库存不足

六、商品管理

正在售卖商品:已经提交审核正在线上售卖商品可以在这里查看

提交申请商品:已提交审核但仍在审核中的商品可以在这里查看

下架商品:已被下架商品可以在这里查看

封禁商品:违规被封禁处理的商品可以在这里查看

保存为提交商品:完成商品创建,点击了【保存】的商品可以在这里查看,如需给保存商品提交审核 请点击【修改商品】

回收站:已删除商品可以在这里查看

七、商品资质

商品所需相关资质,请查看:【特殊类目商家资质要求】 对照上传。

了解禁止投放商品请查看:【头条小店禁售商品管理规范】