一、簡介
Scrapy,Python開發的一個快速,高層次的屏幕抓取和web抓取框架 ,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可 以用于數據挖掘、監測和自動化測試。
Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便 的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲 等,最新版本又提供了web2.0爬蟲的支持。
二、Scrapy結構
1. 主要組件
- scrapy引擎(Scrapy)
用來處理整個系統的數據流,觸發事務 - 調度器(Scheduler)
用來接收引擎發來的請求,可以理解為一個url隊列,每次爬取網頁從它這里獲取url - 下載器(Downloader)
用于下載網頁,交給Spider(Scrapy下載器是建立在twisted 這個高效的異步模型上的) - 爬蟲(Spider)
Spider是用來從網頁中提取所需要的信息,交給Pipeline處理(持久化)。同時Spider也可以提取出鏈接,讓Scrapy繼續抓取下一個頁面 - 項目管道(Pipeline)
從Spider獲取到所需要的信息,進行進一步過濾、持久化 - 下載器中間件(Downloader Middlewares)
位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的 請求及響應 - 爬蟲中間件(Spider Middlewares)
介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求 輸出。 - 調度中間件(Scheduler Middewares)
介于Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應 。
2.基本流程
① 引擎從調度器中取出一個鏈接(URL)用于接下來的抓取
②引擎把URL封裝成一個請求(Request)傳給下載器
③下載器把資源下載下來,并封裝成應答包(Response)
④爬蟲解析Response
⑤解析出實體(Item),則交給實體管道進行進一步的處理
⑥解析出的是鏈接(URL),則把URL交給調度器等待抓
三、創建項目
使用anaconda安裝:conda install scrapy
安裝過程可能會比較慢,需耐心等待
在控制臺輸入指令scrapy startproject demoScrapy
即可在當前目錄下創建Scrapy工程
工程目錄
四、實戰:爬取伯樂在線IT標簽的所有文章的信息
1、分析
網址:http://blog.jobbole.com/category/it-tech/
2、在items文件的類中創建所需字段
thumb_url = scrapy.Field()
date = scrapy.Field()
title = scrapy.Field()
tag = scrapy.Field()
summary = scrapy.Field()
detail_url = scrapy.Field()
3、在spiders文件夾中創建一個scrapy.Spider的子類,并重寫其中的name、start_urls、parse()
name = "list_spider"
start_urls = ["http://blog.jobbole.com/all-posts/"]
def parse(self, response):
result = dict()
print("++++++"*50)
container = response.xpath("http://div[@class='post floated-thumb']")
curr_page = int(response.xpath("http://span[@class='page-numbers current']/text()").extract_first())
# print(type(container))
list_index = 1
for item in container:
# print(item)
result["thumb_url"] = item.xpath("./div[@class='post-thumb']//img/@src").extract_first()
content_container = item.xpath(".//div[@class='post-meta']")
result["date"] = ""
date_b = content_container.xpath("./p/text()").extract()
match = re.findall("(\d{4}/\d{2}/\d{2})", str(date_b))
if len(match):
result["date"] = match[0]
result["title"] = content_container.xpath("./p/a[@class='archive-title']/text()").extract_first()
result["tag"] = content_container.xpath("./p/a[@rel]/text()").extract_first()
result["summary"] = content_container.xpath("./span[@class='excerpt']/p/text()").extract_first()
result["detail_url"] = content_container.xpath(".//span[@class='read-more']/a/@href").extract_first()
result["curr_index"] = (curr_page-1) * 20 + list_index
yield result
list_index += 1
next_page = response.xpath("http://a[@class='next page-numbers']/@href").extract_first()
if next_page:
yield scrapy.Request(url=next_page, callback=self.parse)
提取標簽信息用的是xpath,可以參考http://www.w3school.com.cn/xpath/index.asp
4、這時候所有數據都已經爬取到了,scrapy會將爬取到的數據輸出到控制臺
爬取到的數據
將數據存到數據庫:
image.png
存到csv:
image.png
存到Excel:
image.png