零基礎寫Python爬蟲,爬圖片(scrapy入門)
前言:
都說python寫爬蟲凶得很,昨天就花了一天時間寫了一個小爬蟲,感覺還不錯,總共100行代碼不到就可以得到數據。還是分享下哈經驗,如果是大佬可以按ctrl + w了。
之前在Android 上寫過一個爬蟲,封裝了一下,可以爬取學校教務信息的幾乎所有信息。
學生只需要登錄,啥子成績、消費記錄、課表都出來了(想表達的就是爬蟲大到可做大數據,小的也能簡便我們的生活)
longer:自己開發大學App(查成績,一卡通,課表,一鍵評教,正方系統……)好了,廢話不多說了,進入正題吧!
目的:
1:爬取某資源分享網的文章信息
2:保存文章對應的縮略圖
想掛兩張效果圖,免得你門去拉滾動條
對應的圖片:
安裝Python
好了,我們還是先把 2條蟒蛇 安裝起。這裡的步驟寫的很詳細,我就不再重複了,我安裝的環境是:Python2.7
安裝教程:安裝Python
安裝常用的模塊
也是照著步驟,下一步下一步就OK
教程:安裝常用模塊
安裝pywin32
在windows下,必須安裝pywin32,安裝地址:http://sourceforge.net/projects/pywin32/
下載對應版本的pywin32,直接雙擊安裝即可,安裝完畢之後驗證:
在python命令行下輸入import win32com
如果沒有提示錯誤,則證明安裝成功
安裝Pip
在安裝python的時候勾上就可以了
特別要注意選上pip和Add python.exe to Path,然後一路點「Next」即可完成安裝。
安裝Scrapy
最後就是激動人心的時刻啦,上面的鋪墊做好了,我們終於可以享受到勝利的果實啦!
執行:pip install Scrapy(不是在python命令下執行哦)
pip 會另外下載其他依賴的包,這些就不要我們手動安裝啦,等待一會,大功告成!
驗證安裝,輸入 Scrapy
好了,安裝完成Scrapy爬蟲框架,我們就可以開心的寫代碼了
我們還是先附上Scrapy的官方文檔
官方文檔:Scrapy 1.5 documents
英語不好的同學點這裡:Scrapy入門教程中文版
創建項目
在開始爬取之前,您必須創建一個新的Scrapy項目。 進入您打算存儲代碼的目錄中,運行下列命令:
scrapy startproject runkerspider
該命令將會創建包含下列內容的 runkerspider 目錄:
這些文件分別是:
scrapy.cfg
: 項目的配置文件- runkerspider
/
: 該項目的python模塊。之後您將在此加入代碼。 - runkerspider
/items.py
: 項目中的item文件. - runkerspider
/pipelines.py
: 項目中的pipelines文件. - runkerspider
/settings.py
: 項目的設置文件. - runkerspider
/spiders/
: 放置spider代碼的目錄.
編寫爬蟲程序
在spiders文件夾下創建.py文件
代碼中注釋已經很詳細了,就不解釋了,關於解析html內容,使用的是自帶的xpath,之前使用java的jsou
。
對應網站:(已屏蔽)
爬蟲目標:
- 文章Title
- 文章的url
- 圖片的縮略圖
我們先找到需要爬取的網頁
很容易就發現規律了,那麼我們先爬取前10頁的數據吧,簡單寫個循環
在spider目錄下創建爬蟲文件
我們打開對應的網站,用火狐瀏覽器自帶的開發者工具找到需要的內容在 <div id="content">標籤下。但是發現標籤里的第一個和最後一個並不是我們想要的內容,所以直接過濾掉。
我們分析層級結構,通過自帶的xpath 找到對應的內容
好,我們能找到對應的內容了,但是需要將內容存儲下來,平且還要下載圖片,按說明文檔,我們編寫items.py
按照官方的文檔寫就可以了,注意下面2個屬性,是為了下載圖片定義的(文檔寫的)
然後再到爬蟲文件賦值(注意,賦值要下載圖片地址的時候要將整個數組進行複製哦)
好了,可以運行了,我們先進入到項目的根目錄
進入之後直接敲 scrapy crawl runker(剛才我們在runker_spider.py 里定義的name)
哇!哇!哇!哇!,就看見程序再開始跑了,數據一串串的出來
用框架就是好,直接是多線程再運行,一會兒就跑完了,一共180條文章數據。
還是先把 runker_spider.py 問價的代碼貼一下。
# -*- coding: utf-8 -*-import scrapyfrom runkerspider.items import ArticleItemclass RunkerSpider(scrapy.spiders.Spider): # 定義爬蟲名 之後在執行scrapy crawl runker name = "runker" # 允許訪問的域名範圍,規定爬蟲只爬取這個域名下的網頁 allowed_domain = ["runker.net"] # 要爬取的網站 start_urls = [ "http://www.runker.net/page/1", # 自行補齊 "http://www.runker.net/page/10" ] def parse(self, response): print "===========begin======" + response.url for i, art in enumerate(response.xpath(//div[@id="content"]/div)): # 先去除不是文章列的 開頭和結尾 if i == 0 or i == 19: continue item = ArticleItem() art_title = art.xpath(dl/dd/h2/a/text()).extract() art_url = art.xpath(dl/dd/h2/a/@href).extract() art_imgurl = art.xpath(dl/dt//img/@src).extract() print "title:" + art_title[0] print "url:" + art_url[0] if len(art_imgurl): print "img_url:" + art_imgurl[0] item[title] = art_title[0] item[url] = art_url[0] item[image_urls] = art_imgurl print "---------------------" yield item print "===========end==========="
items.py 代碼:
import scrapy# Articleclass ArticleItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() image_urls = scrapy.Field() images = scrapy.Field()
跑數據沒有問題了,之後就是解決圖片的保存了,管道文件 pipelines.py
在這之前我們的先配置一下配置文件
1:設置保存圖片的路徑 IMAGES_STORE = /path/spider_img
2:打開圖片下載配置
ITEM_PIPELINES = { runkerspider.pipelines.ArtImagesPipeline: 1}
注意寫的配置要對應了,寫成自己的項目文件
好了,剩下就是編寫 pipelines.py
先添加這幾個引用:
import scrapyimport osfrom scrapy.pipelines.images import ImagesPipelinefrom scrapy.exceptions import DropItemfrom scrapy.utils.project import get_project_settings
# 獲取配置文件的 IMAGES_STORE 屬性 (就是我們剛才在setttings.py定義的)
IMAGES_STORE = get_project_settings().get(IMAGES_STORE)最後在後面寫2句代碼,我們以文章的標題進行命名,不然默認的好像是以SHA1 命名的
os.rename((self.IMAGES_STORE + "/" + image_paths[0]), self.IMAGES_STORE + "/" + item[title] + ".jpg")item[image_paths] = self.IMAGES_STORE + "/" + item[title] + ".jpg"
OK,還是貼一下 pipelines.py 代碼吧
# -*- coding: utf-8 -*-import scrapyimport osfrom scrapy.pipelines.images import ImagesPipelinefrom scrapy.exceptions import DropItemfrom scrapy.utils.project import get_project_settingsclass ArtImagesPipeline(ImagesPipeline): # 獲取配置文件的 IMAGES_STORE 屬性 IMAGES_STORE = get_project_settings().get(IMAGES_STORE) def get_media_requests(self, item, info): for image_url in item[image_urls]: yield scrapy.Request(image_url) def item_completed(self, results, item, info): # 直接拷貝官方文檔 image_paths = [x[path] for ok, x in results if ok] if not image_paths: raise DropItem("Item contains no images") os.rename((self.IMAGES_STORE + "/" + image_paths[0]), self.IMAGES_STORE + "/" + item[title] + ".jpg") return item
好,我們這次還得把數據保存下來,不然就得去控制台複製了
哇,我們看到官方文檔,可以將數據直接導出,而且還可以是多種格式
直接回車
我的天,心裡默數了一下,13秒就完成了。
再到我們項目的根目錄下發現 多出一個article.json,打開後發現,哇! 亂碼了嗎?
其實沒有,不信我們把數據複製進一個解析器看看(直接百度json在線解析)
看吧,我們需要的東西出來啦~~哈哈
好了就寫到這裡了,我這個渣渣又要去到處水了~
加個SEO外鏈,請無視(6471工作室)
推薦閱讀:
※為什麼網上Python爬蟲教程這麼多,但是做爬蟲的這麼少呢?爬蟲發展又該是如何呢?
※自學python3的爬蟲,但是網上普遍是python2的書,想問下有沒有好的爬蟲的python3書?
※Python網路爬蟲(七)- 深度爬蟲CrawlSpider
※python爬蟲之圖片下載APP1.0
※Python筆記 · 基於72萬知乎用戶信息的數據可視化