【Python實戰】用Scrapy編寫「1024網站種子吞噬爬蟲」,送福利

BOOM! 一天100萬條數據,5G種子文件,EpicScrapy1024輕鬆拿下小草網站所有種子,哈哈哈哈。php

你們好,我是鏟屎官,繼上一篇「Python實戰:用代碼來訪問1024網站」以後,鏟屎官利用鏟屎的休息時間,專門爲你們作了這期Scrapy超級爬蟲實戰! 專門爬取小草網站的各個板塊的帖子,並下載種子文件保存在本地。哎呦,真的刁到起飛哦。廢話很少說,趕忙來看吧。html

咱們此次主要使用的核心技術,是Scrapy爬蟲框架。這是一款Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。框架的結構,相信不少同窗都看過這張圖:python

Scrapy框架結構

那這裏就簡單的說幾句:程序員

  • 引擎(Scrapy):用來處理整個系統的數據流, 觸發事務(框架核心)。
  • 調度器(Scheduler):用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回 。
  • 下載器(Downloader):用於下載網頁內容, 並將網頁內容返回給爬蟲。
  • 爬蟲(Spiders):用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。
  • 項目管道(Pipeline):負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。
  • 下載器中間件(Downloader Middlewares):主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares):主要工做是處理蜘蛛的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middewares):從Scrapy引擎發送到調度的請求和響應。

那這個東西這麼牛逼,還不趕忙拿來快快用。web

EpicScrapy1024開發實戰

在爬取東西以前,咱們須要簡單分析一下小草網站的結構。爬蟲,是依照URL來爬取的,那麼咱們首先來分析一下小草的URL吧。編程

# 不騎馬的日本人板塊
http://bc.ghuws.men/thread0806.php?fid=2&search=&page=2
# 騎馬的日本人板塊
http://bc.ghuws.men/thread0806.php?fid=15&search=&page=2
# 英語老師板塊
http://bc.ghuws.men/thread0806.php?fid=4&search=&page=2
複製代碼

這是挑選了幾個不一樣的板塊之間的URL,咱們發現,他們就是fid=XX這個數字不一樣啊。傳入不一樣的page參數,應該就是第幾頁。這樣,咱們就能連續的爬取不一樣page之間的信息了。
爬到頁面了,咱們接下來就是要找每一個頁面的post了,這就要涉及到html的知識了。因爲這些頁面長的都同樣,他們的結構也都是差很少的,因此,咱們隨便選取一個頁面,來看看他posthtml長什麼樣子。bash

<td class="tal" style="padding-left:8px" id=""> 
	<h3><a href="htm_data/15/1805/3140529.html" target="_blank" id="">[MP4/ 1.53G]&nbsp; SDMU-742 和歌山から來たリアルマゾ女子 [vip1136]</a></h3>  
</td>
複製代碼

找到,關鍵信息在這裏,這個 <a> 標籤裏。咱們看到href="htm_data/15/1805/3140529.html"這個應該就是每個帖子的後半段URL前半段應該是域名。最後的那個數字,應該是帖子的ID,每個帖子都有惟一的ID與之對應。標籤中包裹的文字是帖子的標題,那麼好,咱們就拿到這個URL來拼接出每個帖子的地址,而後在Scrapy的Spider裏面yeild出來。網絡

http://bc.ghuws.men/htm_data/15/1805/3140529.html
複製代碼

由於咱們的目的是要拿到:每一個帖子的標題,帖子的預覽圖,還有帖子的種子文件。 既然咱們已經拿到了帖子的URL,那麼咱們就接着來爬第二層:帖子。 在每一個帖子的html文件中,咱們須要找到兩個東西:一是縮略圖,二是種子的下載地址。通過簡單的點擊右鍵,檢查,發現這兩個東西的html代碼長這個樣子:框架

<!--圖片-->
<br>
    <img src='https://imagizer.imageshack.com/v2/XXX/XXX/XXX.jpg' onclick="XXXXXX" style='cursor:pointer'>&nbsp;
<br>
<!--種子文件-->
<a target="_blank" onmouseover="this.style.background='#DEF5CD';" onmouseout="this.style.background='none';" style="cursor:pointer;color:#008000;" href="http://www.viidii.info/?http://www______rmdown______com/link______php?hash=XXXXXX&z">http://www.rmdown.com/link.php?hash=XXXXXX</a>
複製代碼

這樣,就能夠找了圖片的標籤<img>和種子文件的下載地址的標籤<a>,可是,這裏就有個問題,每個posthtml裏面,若是找<img>標籤的話,會找到不少圖片,好多圖片都不是咱們想要的,這裏就得根據src裏面的值來區分,我這裏只是找了文件格式是非gif圖片,而且只挑選了前三個做爲image_url來存儲起來。而種子文件的下載地址,這就是<a>標籤包裹的內容就能夠。編程語言

在這一層,咱們拿到了post的標題,圖片,還有種子文件的下載URL。那麼咱們下一步就是,去爬取下載種子文件的URL。這就到了爬蟲的第三層。

在第三層裏面,這裏只有一個download按鈕,因此,咱們只須要看每一個種子的下載地址的url就能夠了。

http://www.rmdown.com/download.php?reff=495894&ref=182a4da555f6935e11ff2ba0300733c9769a104d51c
複製代碼

這個URL頗有意思,裏面最關鍵的信息,就是reffref,然而,這兩個值的位置,在網頁的html文件中是能夠找到的:

<INPUT TYPE="hidden" NAME="reff" value="495894">
<INPUT TYPE="hidden" name="ref" value="182a4da555f6935e11ff2ba0300733c9769a104d51c">
複製代碼

在這個文件裏面,name的值爲reffref是惟一的兩個標籤,這樣就炒雞好找,而後拿到他們的value值,拼湊一下,就成了電影種子文件的的下載地址。

拿到下載地址,咱們就只須要用python進行網絡請求,而後,將返回數據保存成torrent文件就能夠了。這裏有個小插曲:原本我嘗試着用urllib3來作的,可是發現urllib3在網絡請求的時候,會卡頓,這樣很不爽,我google,發現這個問題仍是很廣泛的,有一我的就建議用「人類最偉大的庫」requests來作請求。果真,名頭不是蓋的,requests輕鬆解決了個人煩惱,之後就粉requests了,太強大了

OK,走到這裏,咱們就算是爬完了一個post,那麼將爬取的信息,yield出來一個ScrapyItem,再在pipeline中,咱們將item存儲到MongoDB中,就完成啦。當這一步作完,爬蟲會接着爬取下一個post或者page,直到爬取結束。

過程就是這麼簡單,光說不練是不行滴,尤爲是我們 程序員,既得會紙上談兵,又得會實戰操練。那麼咱們就看一下運行時的效果,絕對震撼:

EpicScrapy1024運行效果

就看到一條一條的item在產生,一個一個的torrent文件在本地磁盤保存,console裏面一行一行的打印log。心裏那個,酸爽。果然是,有了爬蟲,簡直就是有了天下。哈哈哈哈哈

好了,下面是運行了30分鐘,爬取小草網站5個板塊的戰果:

記錄結果的txt文件

本地保存的種子文件113MB

種子文件(部分)

MongoDB中的數據

看到這裏是否是心動了啊?想不想看代碼啊?我認爲學習一門編程語言,最簡潔的方式就是去看別人寫的好的源碼,這樣進步最快。想要獲取EpicScrapy1024的源碼,只須要關注公衆號「皮克啪的鏟屎官」,回覆「1024爬蟲」就能夠得到驚喜!源碼 + 使用說明。並且,多試幾回,公衆號裏面有彩蛋,可能有意外驚喜哦~

至於下載的速度,這個根據你我的網絡情況來定。網絡若是好的話,能夠多開一些請求進程。這樣下載速度更瘋狂。最後來扯一點這個項目中用到的關鍵技術吧。

技術要點

  • Python 3.6
  • Scrapy
  • Scrapy發起網絡請求的時候,爲了不被網站封殺,咱們這在request裏添加了CookieUser-Agent
  • BeautifulSoup4來作html的解析,由於我發現,Scrapy提供的selector不是很好用,不如bs4強大。
  • settings.py中的DOWNLOAD_DELAY須要設置一下。
  • 存入MongoDB的時候,按照不一樣的板塊存到不一樣的表裏。
  • 在本地建一個txt文件,將結果按照csv格式寫入,這樣作是爲了將爬取結果實時的記錄下來,而不是等待爬蟲運行完以後,再將結果寫成csv文件。方便爲其餘程序提供數據。
  • torrent文件的名字須要作處理,由於帖子的標題裏面有些非法字符是不能作文件路徑的,因此要對名字作一下處理。
  • 大概就是這些了。。。

我的感受,Python的意義就是簡單,方便,好玩。並且,要拿Python來幹可以提高本身效率的事兒。好比下載種子,整合網站信息,爲的都是節約本身寶貴的時間。如今這個年代,時間就是成本,時間就是金錢,作程序員的,就要發揮出程序員的優點,用程序,代碼,來爲本身節省時間,賺錢

最後來一波福利:喜歡文章的朋友,鏟屎官想請您幫忙分享一下,讓更多的人來了解Python,學習Python,體會Python帶來的樂趣。您也能夠留言評論,分享您學習Python的感覺。您的分享,就是對我最大的支持

關注公衆號「皮克啪的鏟屎官」,回覆「1024爬蟲」就能夠得到驚喜!或者回復「1024」也能夠試試哦~

Python並無結束,隨之而來的,是一大波Pyton項目,關注公衆號,盡請期待。

推薦閱讀:

【Python實戰】用代碼來訪問1024網站,送福利

![關注公衆號「皮克啪的鏟屎官」,回覆「1024爬蟲」就能夠得到驚喜](底部二維碼.png

)
相關文章
相關標籤/搜索