分析網(wǎng)頁(yè)
分析爬取網(wǎng)頁(yè)
office官網(wǎng)提供了大量的Word脸狸、Excel最仑、PowerPoint等模板信息。
該實(shí)例使用Scrapy爬蟲(chóng)架構(gòu)炊甲,爬取該網(wǎng)站所有的模板文件泥彤。
進(jìn)入網(wǎng)頁(yè)
按F12??
開(kāi)始分析網(wǎng)頁(yè)源碼
該網(wǎng)站模板信息眾多,每個(gè)模板都有一條分類(lèi)信息
通過(guò)這些分類(lèi)標(biāo)簽獲取該站所有模板信息
通過(guò)審查元素我們發(fā)現(xiàn)分類(lèi)標(biāo)簽存在于
'''
<div class="odcom-template-categories-pane>
'''
每個(gè)分類(lèi)標(biāo)簽在
'''
<p class="c-subheading-4">
'''
進(jìn)去其中業(yè)務(wù)這個(gè)標(biāo)簽
https://templates.office.com/zh-CN/%E4%B8%9A%E5%8A%A1
通過(guò)審查元素找到模板詳情頁(yè)鏈接
獲取下一頁(yè)鏈接地址
進(jìn)入模板詳情頁(yè)
我們可以獲取其分類(lèi)信息卿啡、名稱(chēng)吟吝、描述、APP颈娜、下載地址剑逃,預(yù)覽圖。
通過(guò)分類(lèi)標(biāo)簽->分類(lèi)詳情->模板詳情爬取全站的模板信息官辽。
編寫(xiě)爬蟲(chóng)
新建項(xiàng)目
打開(kāi)cmd 進(jìn)入項(xiàng)目目錄
輸入?scrapy startproject office
回車(chē) scrapy提示我們
You can start your first spider with:
? ? cd office
? ? scrapy genspider example example.com
打開(kāi)項(xiàng)目文檔->新建一個(gè)爬蟲(chóng)
我們接著輸入
cd office
scrapy genspider templates https://templates.office.com/
我們使用pycharm 打開(kāi)項(xiàng)目文件
進(jìn)入templates.py
該文件用來(lái)編寫(xiě)項(xiàng)目中的爬蟲(chóng)程序
'''
# -*- coding: utf-8 -*-
import scrapy
from office.itemsimport OfficeItem
class TemplatesSpider(scrapy.Spider):
name ='templates'
? ? start_urls = ['http://templates.office.com/?omkt=zh-CN/']
URLBASE ="https://templates.office.com"
? ? category =''
? ? def parse(self, response):
#category_url = response.css(".odcom-template-category-link").extract()
? ? ? ? for urlsin response.css(".odcom-template-category-link::attr(href)").extract():
self.category = urls
print(urls)
yield scrapy.Request(self.URLBASE+urls, callback=self.parse_category)
def parse_category(self, response):
for urlsin response.css(".odcom-template-item-anchor::attr(href)").extract():
yield scrapy.Request(self.URLBASE+urls, callback=self.parse_dell)
if response.css(".f-hide a::attr(data-bi-name)").extract_first() !="下一頁(yè)":
page_url = response.css(".m-pagination li")[-1].css("::attr(href)").extract()[0]
scrapy.Request(self.category+page_url, callback=self.parse_category)
def parse_dell(self, response):
items = OfficeItem()
items["category"] = response.css(".c-hyperlink::text").extract()[1]
items["filename"] = response.css("#breadcrumbLine::text").extract()[0]
items["description"] = response.css("#tempDescription::text").extract()[0]
items["app"] = response.css(".odcom-core-app-label::text").extract()[0]
items["down_url"] = response.css(".odcom-template-details-action-buttons a::attr(href)").extract()[0]
items["img"] = response.css(".odcom-template-details-preview-thumbnail::attr(src)").extract()[0]
yield items
'''
items.py
'''
import scrapy
class OfficeItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
? ? category = scrapy.Field()
filename = scrapy.Field()
description = scrapy.Field()
app = scrapy.Field()
down_url = scrapy.Field()
img = scrapy.Field()
'''
程序開(kāi)始會(huì)從
'''
start_urls = ['http://templates.office.com/?omkt=zh-CN/']內(nèi)的網(wǎng)站蛹磺,請(qǐng)求該網(wǎng)頁(yè),之后調(diào)用parse函數(shù)處理
'''
在parse中
'''
response.css(".odcom-template-category-link::attr(href)").extract()
'''
通過(guò)CCS選擇器 獲取每個(gè)分類(lèi)標(biāo)簽詳情頁(yè)的鏈接地址
'''
yield scrapy.Request(self.URLBASE+urls, callback=self.parse_category)
'''
請(qǐng)求每個(gè)分類(lèi)標(biāo)簽詳情頁(yè)地址通過(guò)回調(diào)函數(shù)parse_category 處理請(qǐng)求的數(shù)據(jù)
在parse_category中
'''
response.css(".odcom-template-item-anchor::attr(href)").extract()
'''
獲取頁(yè)面中模板詳情頁(yè)的鏈接地址
之后
'''
yield scrapy.Request(self.URLBASE+urls, callback=self.parse_dell)
'''
請(qǐng)求鏈接地址 調(diào)用parse_dell處理
下面的if 語(yǔ)句 判斷是否是最后一頁(yè)
如果 不是 則請(qǐng)求新一頁(yè) 并回調(diào)自己
parse_dell
用來(lái)存在下載地址同仆、描述等信息
items.py
相當(dāng)于建立一個(gè)字典結(jié)構(gòu)
最后我們?cè)赾md中輸入
scrapy crawl??templates -o 1.json
運(yùn)行爬蟲(chóng)
結(jié)果將存儲(chǔ)在當(dāng)前目前下的1.josn中