使用Python多線程爬蟲爬取電影天堂資源,python多線程

來源:互聯網
上載者:User

使用Python多線程爬蟲爬取電影天堂資源,python多線程

最近花些時間學習了一下Python,並寫了一個多線程的爬蟲程式來擷取電影天堂上資源的迅雷,代碼已經上傳到GitHub上了,需要的同學可以自行下載。剛開始學習python希望可以獲得寶貴的意見。

  先來簡單介紹一下,網路爬蟲的基本實現原理吧。一個爬蟲首先要給它一個起點,所以需要精心選取一些URL作為起點,然後我們的爬蟲從這些起點出發,抓取並解析所抓取到的頁面,將所需要的資訊提取出來,同時獲得的新的URL插入到隊列中作為下一次爬取的起點。這樣不斷地迴圈,一直到獲得你想得到的所有的資訊爬蟲的任務就算結束了。我們通過一張圖片來看一下。

  好的 下面進入正題,來講解下程式的實現。

  首先要分析一下電影天堂網站的首頁結構。

  從上面的功能表列中我們可以看到整個網站資源的總體分類情況。剛剛好我們可以利用到它的這個分類,將每一個分類地址作為爬蟲的起點。

  ①解析首頁地址 提取分類資訊

#解析首頁def CrawIndexPage(starturl):print "正在爬取首頁"page = __getpage(starturl)if page=="error":returnpage = page.decode('gbk', 'ignore')tree = etree.HTML(page)Nodes = tree.xpath("//div[@id='menu']//a")print "首頁解析出地址",len(Nodes),"條"for node in Nodes:CrawledURLs = []CrawledURLs.append(starturl)url=node.xpath("@href")[0]if re.match(r'/html/[A-Za-z0-9_/]+/index.html', url):if __isexit(host + url,CrawledURLs):passelse:try:catalog = node.xpath("text()")[0].encode("utf-8")newdir = "E:/電影資源/" + catalogos.makedirs(newdir.decode("utf-8"))print "建立分類目錄成功------"+newdirthread = myThread(host + url, newdir,CrawledURLs)thread.start()except:pass 

在這個函數中,首先將網頁的源碼下載下來,通過XPath解析出其中的菜單分類資訊。並建立相應的檔案目錄。有一個需要注意的地方就是編碼問題,但是也是被這個編碼糾纏了好久,通過查看網頁的原始碼,我們可以發現,網頁的編碼採用的是GB2312,這裡通過XPath構造Tree對象是需要對文本資訊進行解碼操作,將gb2312變成Unicode編碼,這樣DOM樹結構才是正確的,要不然在後面解析的時候就會出現問題。

  ②解析每個分類的首頁

# 解析分類檔案def CrawListPage(indexurl,filedir,CrawledURLs):print "正在解析分類首頁資源"print indexurlpage = __getpage(indexurl)if page=="error":returnCrawledURLs.append(indexurl)page = page.decode('gbk', 'ignore')tree = etree.HTML(page)Nodes = tree.xpath("//div[@class='co_content8']//a")for node in Nodes:url=node.xpath("@href")[0]if re.match(r'/', url):# 非分頁地址 可以從中解析出視頻資源地址if __isexit(host + url,CrawledURLs):passelse:#檔案命名是不能出現以下特殊符號filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\.replace("\\"," ")\.replace(":"," ")\.replace("*"," ")\.replace("?"," ")\.replace("\""," ")\.replace("<", " ") \.replace(">", " ")\.replace("|", " ")CrawlSourcePage(host + url,filedir,filename,CrawledURLs)passelse:# 分頁地址 從中嵌套再次解析print "分頁地址 從中嵌套再次解析",urlindex = indexurl.rfind("/")baseurl = indexurl[0:index + 1]pageurl = baseurl + urlif __isexit(pageurl,CrawledURLs):passelse:print "分頁地址 從中嵌套再次解析", pageurlCrawListPage(pageurl,filedir,CrawledURLs)passpass 

開啟每一個分類的首頁會發現都有一個相同的結構(點擊開啟樣本)首先解析出包含資源URL的節點,然後將名稱和URL提取出來。這一部分有兩個需要注意的地方。一是因為最終想要把資源儲存到一個txt檔案中,但是在命名時不能出現一些特殊符號,所以需要處理掉。二是一定要對分頁進行處理,網站中的資料都是通過分頁這種形式展示的,所以如何識別並抓取分頁也是很重要的。通過觀察發現,分頁的地址前面沒有“/”,所以只需要通過Regex找出分頁地址連結,然後嵌套調用即可解決分頁問題。

③解析資源地址儲存到檔案中

#處理資源頁面 爬取資源地址def CrawlSourcePage(url,filedir,filename,CrawledURLs):print urlpage = __getpage(url)if page=="error":returnCrawledURLs.append(url)page = page.decode('gbk', 'ignore')tree = etree.HTML(page)Nodes = tree.xpath("//div[@align='left']//table//a")try:source = filedir + "/" + filename + ".txt"f = open(source.decode("utf-8"), 'w')for node in Nodes:sourceurl = node.xpath("text()")[0]f.write(sourceurl.encode("utf-8")+"\n")f.close()except:print "!!!!!!!!!!!!!!!!!" 

這段就比較簡單了,將提取出來的內容寫到一個檔案中就行了

  為了能夠提高程式的運行效率,使用了多線程進行抓取,在這裡我是為每一個分類的首頁都開闢了一個線程,這樣極大地加快了爬蟲的效率。想當初,只是用單線程去跑,結果等了一下午最後因為一個異常沒處理到結果一下午都白跑了!!!!心累

class myThread (threading.Thread): #繼承父類threading.Threaddef __init__(self, url, newdir,CrawledURLs):threading.Thread.__init__(self)self.url = urlself.newdir = newdirself.CrawledURLs=CrawledURLsdef run(self): #把要執行的代碼寫到run函數裡面 線程在建立後會直接運行run函數CrawListPage(self.url, self.newdir,self.CrawledURLs) 

以上只是部分代碼,全部代碼可以到GitHub上面去下載(點我跳轉)

最後爬取的結果如下。

以上所述是小編給大家介紹的使用Python多線程爬蟲爬取電影天堂資源 ,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.