scrapy初探之爬取武sir首頁博客
網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。
另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
二、scrapy框架
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 其可以應用在數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
其最初是為了頁面抓取 (更確切來說, 網絡抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy用途廣泛,可以用於數據挖掘、監測和自動化測試。
Scrapy主要包括了以下組件:
1、引擎(Scrapy)
用來處理整個系統的數據流處理, 觸發事務(框架核心)
2、調度器(Scheduler)
用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什麽, 同時去除重復的網址
3、下載器(Downloader)
用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
4、爬蟲(Spiders)
爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面
負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
6、下載器中間件(Downloader Middlewares)
位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
7、 爬蟲中間件(Spider Middlewares)
介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
8、調度中間件(Scheduler Middewares)
介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。
Scrapy運行流程大概如下:
- 引擎從調度器中取出一個鏈接(URL)用於接下來的抓取
- 引擎把URL封裝成一個請求(Request)傳給下載器
- 下載器把資源下載下來,並封裝成應答包(Response)
- 爬蟲解析Response
- 解析出實體(Item),則交給實體管道進行進一步的處理
- 解析出的是鏈接(URL),則把URL交給調度器等待抓取
三、scrapy實例
1、安裝
在windows平臺安裝需要pywin32或64 的支持
Anaconda:一個python的大集合包,可安裝爬蟲相關的包
Anaconda下載地址:
http://continuum.io/downloads
安裝過程中直接安裝vscode,自行加入環境變量中
安裝Scrapy:conda install scrapy
2、實例
1.創建項目(命令行cd至項目目錄)
scrapy startproject cnblog
2.自動創建目錄:
cnblog/
scrapy.cfg
cnblog/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
文件說明:
○ scrapy.cfg ?項目的配置信息,主要為Scrapy命令行工具提供一個基礎的配置信息。(真正爬蟲相關的配置信息在settings.py文件中)
○ items.py ? ?設置數據存儲模板,用於結構化數據,如:Django的Model
○ pipelines ? ?數據處理行為,如:一般結構化的數據持久化
○ settings.py 配置文件,如:遞歸的層數、並發數,延遲下載等
○ spiders ? ? ?爬蟲目錄,如:創建文件,編寫爬蟲規則
註意:一般創建爬蟲文件時,以網站域名命名
3.定義要爬取的字段(item.py)
import scrapy
class CnblogItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#博客名
name = scrapy.Field()
#博客鏈接
data = scrapy.Field()
#博客日期
time = scrapy.Field()
4.寫爬蟲
在spiders目錄下創建cnblog.py文件
import scrapy
from cnblog.items import CnblogItem
class CNBlogSpidle(scrapy.Spider):
# 這是爬蟲的名字,全局唯一
name = "cnblog"
# 這是爬蟲開始幹活的地址,必須是一個可叠代對象
start_urls = [‘http://www.cnblogs.com/wupeiqi/‘]
# 爬蟲收到上面的地址後,就會發送requests請求,在收到服務器返回的內容後,就將內容傳遞給parse函數。在這裏我們重寫函數,達到我們想要的功能
def parse(self, response):
for line in response.xpath(‘//div[@class="day"]‘): #篩選首頁中的博客
item = CnblogItem()
item[‘name‘] = line.xpath(‘.//div[@class="postTitle"]/a/text()‘).extract() #獲取博客名
item[‘data‘] = line.xpath(‘.//a/@href‘).extract()[1] #獲取url
item[‘time‘] = line.xpath(‘.//div[@class="dayTitle"]/a/text()‘).extract() #獲取日期
yield item #將item返回
Scrapy中Response可以直接使用Xpath來解析數據,更多Xpath語法詳見:http://www.w3school.com.cn/xpath/xpath_syntax.asp
篩選規則需要通過分析html寫出。
5.處理爬蟲返回的數據(pipelines.py)
import os
import urllib.request
class CnblogPipeline(object):
def process_item(self, item, spider):
#用request模塊獲取爬來的地址的博客
html = urllib.request.urlopen(item[‘data‘]).read()
#文件名拼接(item對象為列表形式,取出其字符串)
file_name = os.path.join(‘D:\\Temp‘,item[‘name‘][0]+‘.html‘)
#保存博客(爬取的內容為二進制,wb寫入)
with open(file_name,‘wb‘) as f:
f.write(html)
6.配置文件(settiings.py)
BOT_NAME = ‘cnblog‘
SPIDER_MODULES = [‘cnblog.spiders‘]
NEWSPIDER_MODULE = ‘cnblog.spiders‘
# 設置請求頭部
DEFAULT_REQUEST_HEADERS = {
"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘
}
# 不檢測robots.txt文件(因為Scrapy遵循了robots規則,如果你想要獲取的頁面在robots中被禁止了,Scrapy是會忽略掉)
ROBOTSTXT_OBEY = False
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
‘cnblog.pipelines.CnblogPipeline‘: 300,
}
7.執行爬蟲
C:\Users\LENOVO\PycharmProjects\fullstack>cd cnblog
C:\Users\LENOVO\PycharmProjects\fullstack\cnblog>scrapy crawl cnblog --nolog
8.結果輸出
scrapy初探之爬取武sir首頁博客