1. 程式人生 > >Python:“1024網站種子吞噬爬蟲”

Python:“1024網站種子吞噬爬蟲”

 

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

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

這是挑選了幾個不同的板塊之間的URL,我們發現,他們就是fid=XX這個數字不同啊。傳入不同的page引數,應該就是第幾頁。這樣,我們就能連續的爬取不同page之間的資訊了。

爬到頁面了,我們接下來就是要找每個頁面的post了,這就要涉及到html的知識了。由於這些頁面長的都一樣,他們的結構也都是差不多的,所以,我們隨便選取一個頁面,來看看他post的html長什麼樣子。

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

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

 
1http://bc.ghuws.men/htm_data/15/1805/3140529.html 

因為我們的目的是要拿到:每個帖子的標題,帖子的預覽圖,還有帖子的種子檔案。

既然我們已經拿到了帖子的URL,那麼我們就接著來爬第二層:帖子。

在每個帖子的html檔案中,我們需要找到兩個東西:一是縮圖,二是種子的下載地址。經過簡單的點選右鍵,檢查,發現這兩個東西的html程式碼長這個樣子:

 
1<!--圖片--> 2<br> 3 <img src='https://imagizer.imageshack.com/v2/XXX/XXX/XXX.jpg' onclick="XXXXXX" style='cursor:pointer'> 4<br> 5<!--種子檔案--> 6<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>,但是,這裡就有個問題,每一個post的html裡面,如果找<img>標籤的話,會找到很多圖片,好多圖片都不是我們想要的,這裡就得根據src裡面的值來區分,我這裡只是找了檔案格式是非gif圖片,並且只挑選了前三個作為image_url來儲存起來。而種子檔案的下載地址,這就是<a>標籤包裹的內容就可以。

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

在第三層裡面,這裡只有一個download按鈕,所以,我們只需要看每個種子的下載地址的url就可以了。

 
1http://www.rmdown.com/download.php?reff=495894&ref=182a4da555f6935e11ff2ba0300733c9769a104d51c 

這個URL很有意思,裡面最關鍵的資訊,就是reff和ref,然而,這兩個值的位置,在網頁的html檔案中是可以找到的:

 
1<INPUT TYPE="hidden" NAME="reff" value="495894"> 2<INPUT TYPE="hidden" name="ref" value="182a4da555f6935e11ff2ba0300733c9769a104d51c"> 

在這個檔案裡面,name的值為reff和ref是唯一的兩個標籤,這樣就炒雞好找,然後拿到他們的value值,拼湊一下,就成了電影種子檔案的的下載地址。

拿到下載地址,我們就只需要用python進行網路請求,然後,將返回資料儲存成torrent檔案就可以了。這裡有個小插曲:本來我嘗試著用urllib3來做的,但是發現urllib3在網路請求的時候,會卡頓,這樣很不爽,我google,發現這個問題還是很普遍的,有一個人就建議用“人類最偉大的庫”requests來做請求。果然,名頭不是蓋的,requests輕鬆解決了我的煩惱,以後就粉requests了,太強大了。

OK,走到這裡,我們就算是爬完了一個post,那麼將爬取的資訊,yield出來一個Scrapy的Item,再在pipeline中,我們將item儲存到MongoDB中,就完成啦。當這一步做完,爬蟲會接著爬取下一個post或者page,直到爬取結束。

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

執行效果

 

記錄結果的txt檔案

 

本地儲存的種子檔案113MB

 

MongoDB中的資料

 

技術要點

  • Python 3.6
  • Scrapy
  • 在Scrapy發起網路請求的時候,為了避免被網站封殺,我們這在request裡添加了Cookie和User-Agent。
  • 用BeautifulSoup4來做html的解析,因為我發現,Scrapy提供的selector不是很好用,不如bs4強大。
  • settings.py中的DOWNLOAD_DELAY需要設定一下。
  • 存入MongoDB的時候,按照不同的板塊存到不同的表裡。
  • 在本地建一個txt檔案,將結果按照csv格式寫入,這樣做是為了將爬取結果實時的記錄下來,而不是等待爬蟲執行完之後,再將結果寫成csv檔案。方便為其他程式提供資料。
  • torrent檔案的名字需要做處理,因為帖子的標題裡面有些非法字元是不能做檔案路徑的,所以要對名字做一下處理。