摘要:很多人學(xué)習(xí)爬蟲的第一驅(qū)動力就是爬取各大網(wǎng)站的妹子圖片,比如比較有名的。最后我們只需要運行程序,即可執(zhí)行爬取,程序運行命名如下完整代碼我已上傳到微信公眾號后臺,在癡海公眾號后臺回復(fù)即可獲取。本文首發(fā)于公眾號癡海,后臺回復(fù)即可獲取最新編程資源。
閱讀文本大概需要 10 分鐘。
很多人說爬蟲這門技術(shù)非常有趣,但不知道如何入門。其實爬蟲入門非常簡單,難的部分在于各大網(wǎng)站的反爬機制。當然對于一些簡單的網(wǎng)站,還是非常容易爬取。
學(xué)習(xí)爬蟲首先要明確你的驅(qū)動力,是想爬一些知乎的數(shù)據(jù),還是一些電影的資源。驅(qū)動力非常重要,這決定你是否有足夠的興趣繼續(xù)學(xué)下去。
很多人學(xué)習(xí)爬蟲的第一驅(qū)動力就是爬取各大網(wǎng)站的妹子圖片,比如比較有名的 mzitu。在爬這些網(wǎng)站的時候,即可以欣賞漂亮的妹子圖,又能學(xué)習(xí)到技術(shù),非常的 nice。
今天我就結(jié)合非常好用的 scrapy 框架,去抓取一些妹子圖片,并把爬取的數(shù)據(jù)保存到 mongodb 數(shù)據(jù)庫中。本次要爬取的網(wǎng)站是 360 的圖片搜索網(wǎng)站,
地址:http://images.so.com/
360 圖片的妹子質(zhì)量還是非常可以的,我隨意放幾張大家感受下。
清純可愛的
文藝又氣質(zhì)的
仙氣十足的
非常的賞心悅目。
程序思路
本次程序運行的環(huán)境是 windows 10 + python 3.6,運行本次程序前首先確保你已經(jīng)安裝好了 scrapy、pymongo 以及 mongodb 數(shù)據(jù)庫。
簡單的分析了下 360 圖片網(wǎng)站,并沒有很強的反爬措施,并且網(wǎng)站的數(shù)據(jù)是以 Ajax 請求呈現(xiàn)。
我們進一步查看請求的詳情,觀察返回的數(shù)據(jù)結(jié)構(gòu)。
返回的是 JSON 數(shù)據(jù)格式,其中 list 字段把圖片的一些信息都保存在這里面。比如我們需要的圖片地址信息 cover_imgurl。另外觀察 Ajax 請求的參數(shù)信息,還有一個 sn 一直在變化,這個參數(shù)很明顯就是偏移量。當 sn? 為 30 時,返回的是前 30 張圖片,依次類推,我們只需要改變 sn 的值就可以一直獲取圖片的信息。
接下來我們只需要通過?scrapy 高性能的框架,把網(wǎng)站上的圖片保存到本地即可。
新建項目
首先在本地創(chuàng)建一個 scrapy 項目并命名為 images360。通過已下的命名即可創(chuàng)建。
scrapy?startproject?images360
隨后就會有如下的項目結(jié)構(gòu)
接下來就是在 spiders 目錄下新建一個 Spider,命令如下:
scrapy?genspider?images?images.so.com
這樣我們的項目都已創(chuàng)建好,最后項目的結(jié)構(gòu)如下。
程序代碼
settings.py
在 settings.py 里面會先定義一個變量 MAX_PAGE,表示我們需要爬取的最大頁面,比如在此次的程序中我們設(shè)置的是 50,也就是爬取 50 頁,每頁 30 張,一共 1500 張圖片。
MAX_PAGE?=?50
settings.py 文件中我們還設(shè)置一些數(shù)據(jù)庫相關(guān)的配置信息。
MONGO_URI?=?"localhost" MONGO_DB?=?"test" IMAGES_STORE?=?"./images"
并且需要注意的是我們要修改 settings.py 中的 ROBOTSTXT_OBEY 變量,將其設(shè)置為 False,否則無法抓取。
ROBOTSTXT_OBEY?=?False
start_requests()
這個函數(shù)用來構(gòu)造最開始的請求,用來生成 50 次請求。
????def?start_requests(self): ????????data?=?{"ch":?"photogtaphy",?"listtype":?"new"} ????????base_url?=?"https://image.so.com/zj?0" ????????for?page?in?range(1,?self.settings.get("MAX_PAGE")?+?1): ????????????data["sn"]?=?page?*?30 ????????????params?=?urlencode(data) ????????????url?=?base_url?+?params ????????????yield?Request(url,?self.parse
提取信息
我們會在 items.py 文件中定義一個 Images360Item 類,用來定義我們的數(shù)據(jù)結(jié)構(gòu)。
class?Images360Item(Item): ????#?define?the?fields?for?your?item?here?like: ????#?name?=?scrapy.Field() ????collection?=?table?=?"images" ????id?=?Field() ????url?=?Field() ????title?=?Field() ????thumb?=?Field()
其中包括圖片的 ID、鏈接、標題、縮略圖。另外還有兩個屬性 collection 和 table,都定義為 images 字符串,代表 MongoDB 存儲的 Collection 名稱。
接下來我們提取 Spider 里有關(guān)信息,在 parse() 方法改寫成如下所示:
????def?parse(self,?response): ????????result?=?json.loads(response.text) ????????for?image?in?result.get("list"): ????????????item?=?Images360Item() ????????????item["id"]?=?image.get("imageid") ????????????item["url"]?=?image.get("qhimg_url") ????????????item["title"]?=?image.get("group_title") ????????????item["thumb"]?=?image.get("qhimg_thumb_url") ????????????yield?item
這樣我們就完成了信息的提取,接下來就需要把抓取的信息保存到 MongoDB 中。
MongoDB
首先確保你本地已經(jīng)安裝好了 MongoDB,并且已經(jīng)正常啟動。我們用一個 MongoPipeline 將信息保存到 MongoDB 中,在 pipelines.py 里添加如下類的實現(xiàn):
class?MongoPipeline(object): ????def?__init__(self,?mongo_uri,?mongo_db): ????????self.mongo_uri?=?mongo_uri ????????self.mongo_db?=?mongo_db ????@classmethod ????def?from_crawler(cls,?crawler): ????????return?cls( ????????????mongo_uri=crawler.settings.get("MONGO_URI"), ????????????mongo_db=crawler.settings.get("MONGO_DB") ????????) ????def?open_spider(self,?spider): ????????self.client?=?pymongo.MongoClient(self.mongo_uri) ????????self.db?=?self.client[self.mongo_db] ????def?process_item(self,?item,?spider): ????????self.db[item.collection].insert(dict(item)) ????????return?item ????def?close_spider(self,?spider): ????????self.client.close()
Scrapy 提供了專門處理下載的 Pipeline,包括文件下載和圖片下載。下載文件和圖片的原理與抓取頁面的原理一樣,因此下載過程支持異步和多線程,下載十分高效。
我們首先在 settings.py 定義一個 IMAGES_STORE 變量,用來表示圖片存儲的路徑。
IMAGES_STORE?=?"./images"
內(nèi)置的 ImagesPipeline 會默認讀取 Item 的 image_urls 字段,并認為該字段是一個列表形式,它會遍歷 Item 的 image_urls 字段,然后取出每個 URL 進行圖片下載。
但是現(xiàn)在生成的 Item 的圖片鏈接字段并不是 image_urls 字符表示的,也不是列表形式,而是單個的 URL。所以為了實現(xiàn)下載,我們需要重新定義下載的部分邏輯,即要自定義 ImagePipeline,繼承內(nèi)置的 ImagesPipeline,從而實現(xiàn)我們自己的圖片下載邏輯。
class?ImagePipeline(ImagesPipeline): ????def?file_path(self,?request,?response=None,?info=None): ????????url?=?request.url ????????file_name?=?url.split("/")[-1] ????????return?file_name ????def?item_completed(self,?results,?item,?info): ????????image_paths?=?[x["path"]?for?ok,?x?in?results?if?ok] ????????if?not?image_paths: ????????????raise?DropItem("Image?Downloaded?Failed") ????????return?item ????def?get_media_requests(self,?item,?info): ????????yield?Request(item["url"])
最后我們需要在 settings.py 中把我們定義好的 Item Pipeline 打開,修改 settings.py 中的 ITEM_PIPELINES 即可。
ITEM_PIPELINES?=?{ ???"images360.pipelines.ImagePipeline":?300, ???"images360.pipelines.MongoPipeline":?301 }
最后我們只需要運行程序,即可執(zhí)行爬取,程序運行命名如下:
scrapy?crawl?images
完整代碼我已上傳到微信公眾號后臺,在「癡?!构娞柡笈_回復(fù)「360」即可獲取。
本文首發(fā)于公眾號「癡?!?,后臺回復(fù)「1024」即可獲取最新編程資源。
比如這樣的:史上最全 Python 學(xué)習(xí)資料,PDF 電子書大合集
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/44852.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:前言這個文章是延續(xù)之前爬取妹子圖的延續(xù),之前的爬蟲可以爬取一個頁面的圖片,爬取一次大概張圖片的樣子,按照之前的計劃,本次要進一步完善爬蟲,爬取妹子圖全網(wǎng)圖片。做完上述改動后,爬蟲運行基本正常,但是爬取的速度有點慢,個小時大概爬取了張圖片。 0. 前言 這個文章是延續(xù)之前《爬取妹子圖 Lv1》的延續(xù),之前的爬蟲可以爬取一個頁面的圖片,爬取一次大概400張圖片的樣子,按照之前的計劃,本次要...
摘要:學(xué)習(xí)網(wǎng)站爬蟲,整站爬取妹子圖定義爬取的內(nèi)容的編寫提供了一種便捷的方式填充抓取到的是頁面源代碼,載入每個連接,用屬性請求連接,返回請求獲取頁碼集合打印頁碼如果頁碼集合圖片連接讀取頁碼集合的倒數(shù)第二個頁碼圖片連接替換成空返回請求用載 學(xué)習(xí)網(wǎng)站:爬蟲,整站爬取妹子圖 1.item.py(定義爬取的內(nèi)容) import scrapy class MeizituItem(scrapy.Ite...
摘要:爬取妹子圖的實例打算分成三部分來寫,嘗試完善實用性。中的每一個子項都是一個標簽。這個說明的前提是不自定義當爬蟲完成的模型數(shù)據(jù)采集后,會自動將發(fā)送給處理。 0. 前言 這是一個利用python scrapy框架爬取網(wǎng)站圖片的實例,本人也是在學(xué)習(xí)當中,在這做個記錄,也希望能幫到需要的人。爬取妹子圖的實例打算分成三部分來寫,嘗試完善實用性。 系統(tǒng)環(huán)境 System Version:Ubunt...
閱讀 1242·2021-11-23 10:10
閱讀 1649·2021-09-30 09:47
閱讀 983·2021-09-27 14:02
閱讀 3044·2019-08-30 15:45
閱讀 3087·2019-08-30 14:11
閱讀 3681·2019-08-29 14:05
閱讀 1881·2019-08-29 13:51
閱讀 2268·2019-08-29 11:33