? ? ?有半個月沒有更新了,最近確實有點忙。先是華為的比賽,接著實驗室又有項目,然后又學習了一些新的知識,所以沒有更新文章。為了表達我的歉意,我給大家來一波福利。。。(我的新書《Python爬蟲開發(fā)與項目實戰(zhàn)》發(fā)布了,大家在這里可以看到樣章)

? ? ? 今天咱們說的是爬蟲框架。之前我使用python爬取慕課網的視頻,是根據(jù)爬蟲的機制,自己手工定制的,感覺沒有那么高大上,所以我最近玩了玩 python中強大的爬蟲框架Scrapy。
? ? ? ?Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,并且非常方便。Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通訊,架構清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:

? ? ? 綠線是數(shù)據(jù)流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的“下一頁”的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數(shù)據(jù),它們則被送到 Item Pipeline 那里,那是對數(shù)據(jù)進行后期處理(詳細分析、過濾、存儲等)的地方。另外,在數(shù)據(jù)流動的通道里還可以安裝各種中間件,進行必要的處理。
? ? ?簡要介紹了Scrapy的工作流程,咱們開始直奔主題,使用Scrapy爬取美女圖片。
? ? ?大家注意今天不是講Scrapy基礎教程,咱們在之后的七夜音樂臺開發(fā)的時候會講解。所以咱們今天直接上手。
? ? ?以煎蛋網(http://jandan.net)為例子:

咱們來到煎蛋網首頁,其中有一個欄目是妹子,今天的目標就是它。

圖片的分類是按頁進行排列,咱們要爬取所有的圖片需要模擬翻頁。

打開火狐中的firebug,審查元素。

這是咱們需要的圖片鏈接,只要獲取這個鏈接,進行下載就可以了。
咱們看看翻頁后的鏈接是什么???

咱們只要解析出紅線圈出的這個標簽,就可以知道下一頁的鏈接了,就是這么簡單。好了,這時候就可以寫代碼了。。。
打開cmd,輸入scrapy startproject jiandan,這時候會生成一個工程,然后我把整個工程復制到pycharm中(還是使用IDE開發(fā)快)。

上圖就是工程的結構。
jiandanSpider.py ------Spider 蜘蛛
items.py -----------------對要爬取數(shù)據(jù)的模型定義
pipelines.py-------------咱們最終要存儲的數(shù)據(jù)
settings.py----------------對Scrapy的配置
接下來我把代碼貼一下:
jiandanSpider.py:
#coding:utf-8
import scrapy
from jiandan.items ? import ?JiandanItem
fromscrapy.crawler ?import ?CrawlerProcess
class ?jiandanSpider(scrapy.Spider):
name ='jiandan'
allowed_domains = []
start_urls = ["http://jandan.net/ooxx"]
defparse(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 -*-
importos
importurllib
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。。。


今天的分享就到這里,如果大家覺得還可以呀,記得打賞呦。

感謝大家的關注,加我的微信,咱們進行交流。