Scrapy 爬取 網易考拉 動態載入 解析json 獲取商品詳情

身體健康 ,才能 好好學習。

一周的重感冒+胃抽筋終於過去了,繼續學python!!!

參考資料:Scrapy安裝、爬蟲入門教程、爬蟲實例(豆瓣電影爬蟲) - Shirlies - 博客園

github.com/ZhangBohan/f

json在線解析工具:在線JSON校驗格式化工具(Be JSON)

目標網址:搜索-網易考拉海購

採集目的:獲取 指定商品系列 的 商品詳情 ,並將產品詳情圖 下載到本地,按規定格式命名圖片以及文件夾。(網上的例子超級多呢,爬淘寶,爬京東)

這次寫簡單點,主要 有些知識點我還沒有吃透。

第一步 :思路 分析

通過搜索框搜索 指定商品信息,進入商品列表,獲取 分頁商品的url,再獲取單個詳情頁商品的url(滿滿的套路,很熟悉),解析存儲。和之前爬取智聯招聘的路子 是一樣一樣的。

搜索框:

url為:搜索-網易考拉海購

分頁:

第二步:網頁分析

關於動態分析網頁的技術不解釋了,懶。

F5刷新一下頁面;

我們需要的所有的商品信息全部都在非同步載入的json里,在這個goods下。

其實我一開始也是解析源碼,發現獲取不到數據,就猜想是否是動態。

小技巧: 一般F5後顯示的結果,前10個,特別是前3個,重點查看,然後將ctrl + f 將頁面的關鍵字,比如:價格,標題號碼在Preview或者Response下查找,如果匹配,那麼正確率就越高。

在json解析器中查看:

有講近2500行的商品信息代碼。

重點就是解析json數據了,這個很費點時間,但是理清楚它的層次結構就會簡單許多。

第三步:實戰開始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

No1:scrapy startproject KLao

No2:在 spiders下新建一份kaola_spider.py文件。

項目結構如下:

No3:編寫主函數 kaola_spider.py文件。

1)先獲取 所有 分頁的 url

2)根據scrapy的 starturl獲取的是一個 list,將所有分頁 url,放入starturl這個list容器里。

# -*- coding: UTF-8 -*-from scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelectorfrom kaola.items import KaolaItemfrom scrapy.http import Requestimport json ,reclass KaolaSpider(BaseSpider): name = "kaola" # spider name allowed_domains = ["kaola.com"] # domain start_urls = ["http://www.kaola.com/product/1501901.html"] # start url 要採集的網頁地址 # base_url = http://www.kaola.com/search.html?key=%25E8%25BF%2590%25E5%258A%25A8%25E6%2589%258B%25E7%258E%25AF&isSelfProduct=true&pageNo= # page_size = 2 def __init__(self): for page in range(1,self.page_size+1): self.start_urls.append(self.base_url+str(page)) # 把所有的目錄頁面寫入的 start_urls pass

3)利用 xpath選擇器:獲取 每個單頁 商品的url

首先獲取網頁源碼,再 用xpath

def parse(self, response): web_content = HtmlXPathSelector(response) href = web_content.xpath(//p[@class="goodsinfo clearfix"]/a/@href).extract() for href in href: urls = http://www.kaola.com+ href yield Request(urls, callback=self.getProductData) # callback 下一步需要處理的函數

No3:解析單個商品 url【主要是解析json】

先獲取包裹在json里的數據:利用正則匹配:

開頭:

def getProductData(self, response): alldata_item = [] pattern = re.compile( {"actualCurrentPrice":(.*?)"}, //,re.S) items = re.search(pattern,response.body) result = items.group().replace(, //,) pageJson = json.loads(result)#將str解析成dic,解析json格式,解出來是一個字典

解析json

層層拆套

例如

他的上一層:

所以:

id = pageJson[goodsId] sku = whg + str(id) name = pageJson[title] country = pageJson[originCountryName] warehouseNameAlias = pageJson[warehouseNameAlias] # 國內自營倉 price = pageJson[actualCurrentPrice] img_description = pageJson[detail] # 產品詳細圖

獲取的結果放入結果集:alldata_item= []里

alldata_item.append({"sku":sku,"name":name,"country":country,"warehouseNameAlias":warehouseNameAlias,"price":price,"img_description":img_description}) return alldata_item

No4:存入到item里:

def my_items(self,response): productData = self.getProductData(response) # 獲取 上個函數的 信息 items = [] for data in productData: item=KlcaoItem() item[sku]=data[sku] item[name] = data[name] item[country] = data[country] item[warehouseNameAlias] = data[warehouseNameAlias] item[img_description] = data[img_description] item[price] = data[price] return items

最後 的 return 千萬不能省略

主要部分就完成了!!!

scrapy 下載圖片的步驟 了 ,我們在 pipeline里完成。

1)在setting里設置圖片下載地址:

2)參考:github.com/ZhangBohan/f

下載圖片: 獲取圖片url

複雜點的 :商品詳情圖,包裹在json里,裡面還需要再近 一步 提取:

(detail在上一步已經提取存入了item【img_description】)

提取 detail的 url

# download description image des_tree = etree.HTML(description) des_list = des_tree.xpath(//p/img/@src) i = 1 des_text = [] for des_url in des_list: # 圖片命名 XX_01.jpg if i <10: i = "0"+str(i) image_name = str(sku)+"_" + str(i) + ".jpg" product_name = item[name] file_path = dir_path+description/+sku if os.path.isdir(file_path) == False: os.mkdir(file_path) file_path = %s/%s % (file_path, image_name) # full_path = <img src="{{media url="wysiwyg/product/w/g/+sku+/ + image_name + "}}" onerror= his.style.display="none" alt=" + product_name + "> with open(file_path, wb) as handle: response = requests.get(des_url, stream=True) for block in response.iter_content(2048): handle.write(block) des_text.append(full_path) i = int(i) + 1

最後記得加 return item!!!!!

運行 scrapy crawl kaola -o myresult.csv [下載圖片並生成csv文件]

推薦閱讀:

0x02:入門(2)
Python入門到精通視頻課程(10)
用例3: CVE-2012-3152

TAG:scrapy | Python框架 | Python教程 |