本文主要是以爬取淘宝为例子,但请不要大量爬取,对别人服务器造成压力,其实也不敢多爬,别人的防爬机制应该很厉害,小心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是可以,反扒机制不太强,你要是在淘宝,天猫,这些大网站,你可以试试。我可是伤心欲绝过很多次,才把宝贵的经验分享给你
爬取的结果:
下一篇博客就基于这段代码,爬取淘宝笔记本电脑的图片