scrapy爬虫【2】→爬天猫

本文主要是以爬取淘宝为例子,但请不要大量爬取,对别人服务器造成压力,其实也不敢多爬,别人的防爬机制应该很厉害,小心ip被封。

首先要明确目标
比如:老板今天叫你爬取天猫销量前120的笔记本电脑的一些详细信息
然后你就可以先打开天猫笔记本电脑网址https://list.tmall.com/search_product.htm?spm=875.7931836/B.subpannel2016040.19.z5JOIv&pos=1&cat=50024399&theme=663&acm=2016031437.1003.2.720502&scm=1003.2.2016031437.OTHER_1458241115467_720502
再按销量进行排名
大致看一下有哪些信息是你需要的,并且可以爬取的。
这里写图片描述
比如我们要爬取的“商品名称”,“价格”,“月销量”,“商品url”
后面三个这一页就可以直接爬取
但是有木有发现商品名不全?
我们需要进入到商品url里面去爬取它的完整名称
这里写图片描述

现在大致的需求我们已经明确了,可以开始写代码了
首先需要写items.py

class TaobaoGoodsItem(scrapy.Item):
    GOODS_NAME = scrapy.Field()         # 商品名称
    GOODS_PRICE = scrapy.Field()        # 价格
    MONTHLY_SALES = scrapy.Field()      # 月销量
    GOODS_URL = scrapy.Field()          # 商品url

然后可以写爬取的逻辑代码了

#encoding=utf-8
import scrapy
from taobao_goods.items import TaobaoGoodsItem

class TapTop(scrapy.Spider):
    name = 'TapTop'
    allowed_domains = ['detail.tmall.com','list.tmall.com']
    start_urls = ['https://list.tmall.com/search_product.htm?spm=a220m.1000858.0.0.aVNGHZ&cat=53320010&sort=d&style=g&active=1&industryCatId=53320010&theme=663&type=pc']

    def parse(self,response):
        divs = response.xpath('//div[@id="J_ItemList"]/div')
        print("items len = %d" %len(divs))
        for div in divs:
            item = TaobaoGoodsItem()
            # 价格
            item['GOODS_PRICE'] = div.xpath('div/p[1]/em/text()').extract_first()
            # 月销量
            item['MONTHLY_SALES'] = div.xpath('div/p[3]/span[1]/em/text()').extract_first()
            # url
            good_url = div.xpath('div/div[2]/a[1]/@href').extract_first()
            if not 'http' in good_url:
                good_url = response.urljoin(good_url)
            item['GOODS_URL'] = good_url

            # 进入店里面
            yield scrapy.Request(url=good_url, meta={'item':item}, callback=self.detail_parse)
        next_page = response.urljoin(response.xpath('//a[@class="ui-page-next"]/@href').extract_first())
        yield scrapy.Request(url=next_page,callback=self.parse)

    def detail_parse(self,response):
        # 获取item
        item = response.meta['item']
        # 商品名称
        item['GOODS_NAME'] = response.xpath('//*[@id="J_DetailMeta"]/div[1]/div[1]/div/div[1]/h1/a/text()').extract_first()
        yield item

可能有些人看的不太懂,我详细解释一下
name是你的spider名(唯一的名称)
allowed_domains是你允许出现的域名,scrapy会自动过滤你不想爬取的网址
start_urls是你起始的url
//
xpath不想解释,自己去百度,很容易
scrapy.Request是再次发起一个网页请求
meta是用来传递数据的
response.meta[‘item’]可以获取到你刚才传进来的item
yield item就能调用pipelines生成文件了

注意这里我进入下一页的方式是直接点下一页,而不是很多博客里面对url页数进行修改,各有各的好处吧。
所以你就这样把这个程序跑起来,估计不到一分钟你的ip就会被封

然后我们来写settings.py文件(超级重要)

SPIDER_MODULES = ['taobao_goods.spiders']
NEWSPIDER_MODULE = 'taobao_goods.spiders'
# 设置深度 默认为0(无限制)
DEPTH_LIMIT = 2
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0'

DEPTH_LIMIT 是scrapy帮你做好的东西,你要学会用啊。可以限制你爬取的深度,以免爬取过多

至于USER_AGENT请看我的第一篇博客:
http://blog.csdn.net/program_anywhere/article/details/72850085
亲生体验啊,你如果不加你试试,或许你爬过比如豆瓣这样的网站,不你加USER_AGENT是可以,反扒机制不太强,你要是在淘宝,天猫,这些大网站,你可以试试。我可是伤心欲绝过很多次,才把宝贵的经验分享给你

爬取的结果:
这里写图片描述

下一篇博客就基于这段代码,爬取淘宝笔记本电脑的图片

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值