有半個月沒有更新了,最近確實有點忙。先是華為的比賽,接着實驗室又有項目,然后又學習了一些新的知識,所以沒有更新文章。為了表達我的歉意,我給大家來一波福利。。。(我的新書《Python爬蟲開發與項目實戰》出版了,大家可以看一下樣章)
今天咱們說的是爬蟲框架。之前我使用python爬取慕課網的視頻,是根據爬蟲的機制,自己手工定制的,感覺沒有那么高大上,所以我最近玩了玩 python中強大的爬蟲框架Scrapy。
Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,並且非常方便。Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通訊,架構清晰,並且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:
綠線是數據流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的“下一頁”的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數據,它們則被送到 Item Pipeline 那里,那是對數據進行后期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。
簡要介紹了Scrapy的工作流程,咱們開始直奔主題,使用Scrapy爬取美女圖片。
大家注意今天不是講Scrapy基礎教程,咱們在之后的七夜音樂台開發的時候會講解。所以咱們今天直接上手。
以 煎蛋網(http://jandan.net)為例:
咱們來到煎蛋網首頁,其中有一個欄目是妹子,今天的目標就是它。
圖片的分類是按頁進行排列,咱們要爬取所有的圖片需要模擬翻頁。
打開火狐中的firebug,審查元素。
這是咱們需要的圖片鏈接,只要獲取這個鏈接,進行下載就可以了。
咱們看看翻頁后的鏈接是什么???
咱們只要解析出紅線圈出的這個標簽,就可以知道下一頁的鏈接了,就是這么簡單。好了,這時候就可以寫代碼了。。。
打開cmd,輸入scrapy startproject jiandan,這時候會生成一個工程,然后我把整個工程復制到pycharm中(還是使用IDE開發快)。
上圖就是工程的結構。
jiandanSpider.py ------Spider 蜘蛛
items.py -----------------對要爬取數據的模型定義
pipelines.py-------------咱們最終要存儲的數據
settings.py----------------對Scrapy的配置
接下來我把代碼貼一下:
jiandanSpider.py: #coding:utf-8 import scrapy from jiandan.items import JiandanItem from scrapy.crawler import CrawlerProcess class jiandanSpider(scrapy.Spider): name = 'jiandan' allowed_domains = [] start_urls = ["http://jandan.net/ooxx"] def parse(self, response): item = JiandanItem() item['image_urls'] = response.xpath('//img//@src').extract()#提取圖片鏈接 # print 'image_urls',item['image_urls'] yield item new_url= response.xpath('//a[@class="previous-comment-page"]//@href').extract_first()#翻頁 # print 'new_url',new_url if new_url: yield scrapy.Request(new_url,callback=self.parse)
items.py : # -*- coding: utf-8 -*- import scrapy class JiandanItem(scrapy.Item): # define the fields for your item here like: image_urls = scrapy.Field()#圖片的鏈接
pipelines.py: # -*- coding: utf-8 -*- import os import urllib from jiandan import settings class JiandanPipeline(object): def process_item(self, item, spider): dir_path = '%s/%s'%(settings.IMAGES_STORE,spider.name)#存儲路徑 print 'dir_path',dir_path if not os.path.exists(dir_path): os.makedirs(dir_path) for image_url in item['image_urls']: list_name = image_url.split('/') file_name = list_name[len(list_name)-1]#圖片名稱 # print 'filename',file_name file_path = '%s/%s'%(dir_path,file_name) # print 'file_path',file_path if os.path.exists(file_name): continue with open(file_path,'wb') as file_writer: conn = urllib.urlopen(image_url)#下載圖片 file_writer.write(conn.read()) file_writer.close() return item
settings.py: # -*- coding: utf-8 -*- # Scrapy settings for jiandan project # # For simplicity, this file contains only settings considered important or # commonly used. You can find more settings consulting the documentation: # # http://doc.scrapy.org/en/latest/topics/settings.html # http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html # http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html BOT_NAME = 'jiandan' SPIDER_MODULES = ['jiandan.spiders'] NEWSPIDER_MODULE = 'jiandan.spiders' ITEM_PIPELINES = { 'jiandan.pipelines.JiandanPipeline': 1, } IMAGES_STORE='E:' DOWNLOAD_DELAY = 0.25
最后咱們開始運行程序,cmd切換到工程目錄,
輸入scrapy crawl jiandan,啟動爬蟲。。。
大約20分鍾左右,爬蟲工作結束。。。
咱們去看看美女圖吧,居然有1.21G。。。
今天的分享就到這里,如果大家覺得還可以呀,記得打賞呦。
歡迎大家支持我公眾號:
本文章屬於原創作品,歡迎大家轉載分享。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/