零基礎寫Python爬蟲,爬圖片(scrapy入門)

前言:

都說python寫爬蟲凶得很,昨天就花了一天時間寫了一個小爬蟲,感覺還不錯,總共100行代碼不到就可以得到數據。還是分享下哈經驗,如果是大佬可以按ctrl + w了。

之前在Android 上寫過一個爬蟲,封裝了一下,可以爬取學校教務信息的幾乎所有信息。

學生只需要登錄,啥子成績、消費記錄、課表都出來了(想表達的就是爬蟲大到可做大數據,小的也能簡便我們的生活)

longer:自己開發大學App(查成績,一卡通,課表,一鍵評教,正方系統……)zhuanlan.zhihu.com圖標

好了,廢話不多說了,進入正題吧!

目的:

1:爬取某資源分享網的文章信息

2:保存文章對應的縮略圖

想掛兩張效果圖,免得你門去拉滾動條

www.v6471.com

對應的圖片:

抓取到的圖片

安裝Python

好了,我們還是先把 2條蟒蛇 安裝起。這裡的步驟寫的很詳細,我就不再重複了,我安裝的環境是:Python2.7

安裝教程:安裝Python

安裝常用的模塊

也是照著步驟,下一步下一步就OK

教程:安裝常用模塊

安裝pywin32

在windows下,必須安裝pywin32,安裝地址:sourceforge.net/project

下載對應版本的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

對應網站:(已屏蔽)

爬蟲目標:

  1. 文章Title
  2. 文章的url
  3. 圖片的縮略圖

我們先找到需要爬取的網頁

很容易就發現規律了,那麼我們先爬取前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萬知乎用戶信息的數據可視化

TAG:scrapy | 爬虫计算机网络 | python爬虫 |