0

我的帖子

个人中心

设置

  发新话题

Scrapy框架爬取淘宝商品

今天闲的没事、就顺手写了个爬虫,中途踩过很多坑,淘宝的反爬机制还是挺严的,某些数据还得抓包分析
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
import re
from taobao.items import TaobaoItem
import urllib2,urllib
import ssl
import requests
class TbSpider(scrapy.Spider):
    name = "tb"
    allowed_domains = ["taobao.com"]
    start_urls = ['https://taobao.com/']

    def parse(self, response):
        key = "坚果"
        for i in range(0,30):#定义爬虫页数
            url = "https://s.taobao.com/search?q="+str(key)+"&commend=all&search_type=item&s="+str(44*i)
            yield Request(url=url,callback=self.page2)
        pass
    def page2(self,response):
        body=response.body.decode("utf-8","ignore")
        patid='"nid":"(.*?)"'
        patprice='"view_price":"(.*?)"'
        patname='"raw_title":"(.*?)"'
        pataddress='"item_loc":"(.*?)"'
        allid=re.compile(patid).findall(body)#商品Id集合
        allprice=re.compile(patprice).findall(body)#商品价格集合
        allname=re.compile(patname).findall(body)#商品名称集合
        alladdress=re.compile(pataddress).findall(body)#商户地址集合
        for j in range(0,len(allid)):
            thisid = allid[j]
            price = allprice[j]
            name = allname[j]
            address = alladdress[j]
            url1="https://item.taobao.com/item.htm?id="+str(thisid)
            yield Request(url=url1,callback=self.next,meta={'price':price,'name':name,'address':address,'itemid':thisid})

    def next(self,response):
        item = TaobaoItem()
        item["title"] = response.meta['name']
        item["link"] = response.url
        item["price"] = response.meta['price']
        item["address"] = response.meta['address']
        thisid = response.meta['itemid']
        #由于淘宝、天猫某些信息采用Ajax加载,且加载方式不同,故加以区分
        if 'tmall.com' in item["link"]:
            MonthlySalesurl = "https://mdskip.taobao.com/core/initItemDetail.htm?itemId=%s&callback=setMdskip" % thisid
            referer = "https://detail.tmall.com/item.htm"
            patjsonp = '{"sellCount":(.*?),'
            commenturl = "https://dsr-rate.tmall.com/list_dsr_info.htm?itemId=" + str(thisid)
            pat = '"rateTotal":(.*?),'
        else:
            MonthlySalesurl = "https://detailskip.taobao.com/service/getData/1/p1/item/detail/sib.htm?itemId=%s&modules=dynStock,qrcode,viewer,price,contract,duty,xmpPromotion,delivery,activity,fqg,zjys,couponActivity,soldQuantity&callback=onSibRequestSuccess" % thisid
            referer = "https://item.taobao.com/item.htm"
            patjsonp = '{"confirmGoodsCount":(.*?),'
            commenturl = "https://rate.taobao.com/detailCount.do?callback=jsonp100&itemId=" + str(thisid)
            pat = '"count":(.*?)}'
        hd = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
                'referer': referer
             }
        jsonp = requests.get(MonthlySalesurl, headers=hd).text  # 获取源码
        sellCount = re.compile(patjsonp).findall(jsonp)
        item["Sales"] = sellCount
        #print sellCount
        #ssl._create_default_https_context = ssl._create_unverified_context
        page = urllib2.urlopen(commenturl)
        commentdata = page.read()
        item["comment"] = re.compile(pat).findall(commentdata)
        yield item
        #print item
插入数据库
# -*- coding: utf-8 -*-
import MySQLdb as mdb
class TaobaoPipeline(object):
    def __init__(self):
        self.conn = mdb.connect(host='数据库地址', user='用户名', passwd='密码', db='数据库名称', port=端口, charset='字符集')

    def process_item(self, item, spider):
        try:
            title = item["title"]#商品标题
            link = item["link"]#商品链接
            price = item["price"]#商品价格
            Sales = item["Sales"][0]#商品月销量
            comment = item["comment"][0]#商品评论数
            address = item["address"]#商户地址
            sql = "INSERT INTO taobao(title,link,price,Sales,comment,address)VALUES('%s','%s','%s',%s,%s,'%s')"%(title,link,price,Sales,comment,address)
            print sql
            cur = self.conn.cursor()
            cur.execute(sql)
            self.conn.commit()
            cur.close()
        except Exception as e:
            pass
    def close_spider(self):
            self.conn.close()




本帖最近评分记录
  • 咖啡 无忧币 +10 要是再有个说明就更完美了。代码+截图,这个 ... 2017-2-23 17:29



本帖最后由 694380889 于 2017-2-23 17:32 编辑
厉害了我的波总~



引用:
原帖由 咖啡 于 2017-2-23 17:28 发表
厉害了我的波总~
也不推荐推荐。没爱了



引用:
原帖由 694380889 于 2017-2-23 17:29 发表

也不推荐推荐。没爱了
让你好好优化内容发布博客不听我的,哼~



波总转行啦



网络工程师
引用:
原帖由 菠萝味咖啡 于 2017-2-24 08:21 发表
波总转行啦
是的、、、、、



有没有其他数据



引用:
原帖由 kujind 于 2017-2-24 13:22 发表
有没有其他数据
哪些呢???说下



提示: 作者被禁止或删除 内容自动屏蔽
厉害啊。。技术活。。



引用:
原帖由 694380889 于 2017-2-24 13:26 发表

哪些呢???说下
譬如用户等级,以及好评差评比例



看来用户的需求还是很大的呢



引用:
原帖由 kujind 于 2017-2-25 11:19 发表

譬如用户等级,以及好评差评比例
可以的。



Traceback (most recent call last):
  File "items.py", line 5, in <module>
    from taobao.items import TaobaoItem
ImportError: No module named items



引用:
原帖由 zjcnew 于 2017-2-27 11:58 发表
Traceback (most recent call last):
  File "items.py", line 5, in
    from taobao.items import TaobaoItem
ImportError: No module named items
这个还需要设置其他位置滴的



引用:
原帖由 zjcnew 于 2017-2-27 11:58 发表
Traceback (most recent call last):
  File "items.py", line 5, in
    from taobao.items import TaobaoItem
ImportError: No module named items
不是直接Copy就能使用的



这个只是讲解,环境啥的每个人都不一样。肯定会报错了






2017年4月6日   https://detailskip.taobao.com/se ... 28392541802&amp;modules=qrcode,viewer,price,contract,duty,xmpPromotion,dynStock,delivery,upp,sellerDetail,activity,fqg,zjys,coupon&callback=onSibRequestSuccess  

请求这个接口一直403
模拟请求的时候要在header设置一下来源页面referer属性为你要抓取的宝贝链接 ,就可以成功获取了
header={
        "referer":"https://item.taobao.com/item.htm?id=524122865207"
     }



你好!现在淘宝的反爬策略进步了,你的这爬虫代码是无法爬到月销量字段的



‹‹ 上一贴:一个 Python 下发送邮件的库   |   下一贴:请教一个关于pysnmp-apps的问题 ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2017 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com