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

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

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

20160923162204107.png

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

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

20160923162204108.png

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

①解析首頁地址 提取分類信息

#解析首頁

def CrawIndexPage(starturl):

print "正在爬取首頁"

page = __getpage(starturl)

if page=="error":

return

page = 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):

pass

else:

try:

catalog = node.xpath("text()")[0].encode("utf-8")

newdir = "E:/電影資源/" + catalog

os.makedirs(newdir.decode("utf-8"))

print "創建分類目錄成功------"+newdir

thread = myThread(host + url, newdir,CrawledURLs)

thread.start()

except:

pass

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

②解析每個分類的主頁

# 解析分類文件

def CrawListPage(indexurl,filedir,CrawledURLs):

print "正在解析分類主頁資源"

print indexurl

page = __getpage(indexurl)

if page=="error":

return

CrawledURLs.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):

pass

else:

#文件命名是不能出現以下特殊符號

filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\

.replace("\\"," ")\

.replace(":"," ")\

.replace("*"," ")\

.replace("?"," ")\

.replace("\""," ")\

.replace("<", " ") \

.replace(">", " ")\

.replace("|", " ")

CrawlSourcePage(host + url,filedir,filename,CrawledURLs)

pass

else:

# 分頁地址 從中嵌套再次解析

print "分頁地址 從中嵌套再次解析",url

index = indexurl.rfind("/")

baseurl = indexurl[0:index + 1]

pageurl = baseurl + url

if __isexit(pageurl,CrawledURLs):

pass

else:

print "分頁地址 從中嵌套再次解析", pageurl

CrawListPage(pageurl,filedir,CrawledURLs)

pass

pass

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

③解析資源地址保存到文件中

#處理資源頁面 爬取資源地址

def CrawlSourcePage(url,filedir,filename,CrawledURLs):

print url

page = __getpage(url)

if page=="error":

return

CrawledURLs.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.Thread

def __init__(self, url, newdir,CrawledURLs):

threading.Thread.__init__(self)

self.url = url

self.newdir = newdir

self.CrawledURLs=CrawledURLs

def run(self): #把要執行的代碼寫到run函數里面 線程在創建后會直接運行run函數

CrawListPage(self.url, self.newdir,self.CrawledURLs)

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

最后爬取的結果如下。

20160923162204109.png

20160923162204110.png

20160923162204111.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打不開磁盤配額linux,九度OJ 1455 珍惜現在,感恩生活 -- 動態規劃(背包問題)...

題目描述&#xff1a;為了挽救災區同胞的生命&#xff0c;心系災區同胞的你準備自己采購一些糧食支援災區&#xff0c;現在假設你一共有資金n元&#xff0c;而市場有m種大米&#xff0c;每種大米都是袋裝產品&#xff0c;其價格不等&#xff0c;并且只能整袋購買。請問&#xf…

erp 維護費 要交嗎_ERP系統維護費

今年8月&#xff0c;SAP中國公司宣布2009年1月1日前將由傳統支持服務轉向企業級支持服務(SAP Enterprise Support)。同時將開始實施漸進式定價方案&#xff0c;并預計在2012年之前&#xff0c;逐漸將所有客戶從現行的SAP Standard/Premium Support的定價協議過渡為SAP Enterpri…

sentinel 端口_Sentinel原理:控制臺是如何獲取到實時數據的

Sentinel 系列教程&#xff0c;現已上傳到 github 和 gitee 中&#xff1a;GitHub&#xff1a;https://github.com/all4you/sentinel-tutorialGitee&#xff1a;https://gitee.com/all_4_you/sentinel-tutorialSentinel 能夠被大家所認可&#xff0c;除了他自身的輕量級&#x…

linux桌面時區設置,如何在Ubuntu 20.04上設置或更改時區

對于許多與系統相關的任務和進程&#xff0c;使用正確的時區至關重要。 例如&#xff0c;cron守護程序使用系統的時區執行cron作業&#xff0c;而日志文件中的時間戳基于系統的同一時區。在Ubuntu上&#xff0c;系統的時區是在安裝過程中設置的&#xff0c;但以后可以輕松更改。…

ironpython2.7.9_IronPython下載

IronPython是一種在 .NET 及 Mono上的 Python 實現&#xff0c;由微軟的 Jim Hugunin所發起&#xff0c;是一個開源的項目&#xff0c;基于微軟的DLR引擎&#xff1b;托管于微軟的開源網站 CodePlex。IronPython 的官方并未實現 Python通用類庫&#xff0c;僅實現了部分核心類。…

python 最小二乘回歸 高斯核_「機器學習」一文讀懂線性回歸、嶺回歸和Lasso回歸...

點擊上方藍色字體&#xff0c;關注AI小白入門喲作者 | 文杰編輯 | yuquanle本文介紹線性回歸模型&#xff0c;從梯度下降和最小二乘的角度來求解線性回歸問題&#xff0c;以概率的方式解釋了線性回歸為什么采用平方損失&#xff0c;然后介紹了線性回歸中常用的兩種范數來解決過…

天宮初級認證答案_跨境電商人才初級認證試題以及答案

跨境電商人才初級認證試題以及答案跨境電商人才初級認證試題一&#xff0c;單選題(共40題,每題1分,共40分)1.在拍攝反光性產品時,就是從哪個角度進行拍攝的A、正面B、側面參考答案:B2.信用證就是一種( )信用A、商業B、銀行C、民間D、企業參考答案:B3、阿里巴巴專業術語中,MA的全…

Linux打包軟件版本帶時間,帶你寫一個 linux 下的打包軟件 tar

相信你對 linux 的 .tar.gz 有點熟悉&#xff0c;這就是先 tar 打包(.tar 后綴)&#xff0c;再對此 tar 文件用 gzip 壓縮(.tar.gz)的后綴名。值得注意的是&#xff0c; tar 不是壓縮軟件&#xff0c;它只做把一堆文件/文件夾打包到一個文件(tar 文件)里的事情&#xff0c;而文…

優先隊列默認是小頂堆嗎_一分鐘帶你讀懂什么是堆?

堆其實就是一種特殊的隊列——優先隊列。 普通的隊列游戲規則很簡單&#xff1a;就是先進先出&#xff1b;但這種優先隊列搞特殊&#xff0c;不是按照進隊列的時間順序&#xff0c;而是按照每個元素的優先級來比拼&#xff0c;優先級高的在堆頂。 這也很容易理解吧&#xff0c;…

螺旋測微器b類不確定度_物理實驗直測量不確定度評估.ppt

物理實驗直測量不確定度評估直接測量不確定度評估 Gauss分布 測量列的平均值、標準差 A類不確定度 t分布 B類不確定度 直接測量的合成不確定度 Gauss分布 也稱正態分布。 δ的平均值等于0、方差為σ。 特征&#xff1a; 對稱性——大于平均值與小于平均值的概率相等&#xff1b…

python 執行shell_python執行shell命令的方法

python執行shell命令的方法 os模塊 os.system方式&#xff1a; import os os.system(top) os.system(cat /proc/cpuinfo) 說明 這個調用相當直接&#xff0c;且是同步進行的&#xff0c;程序需要阻塞并等待返回。 返回值是依賴于系統的&#xff0c;直接返回系統的調用返回值&am…

linux下c語言讀取roed文件,如何在Linux系統上安裝Android4.4.docx

Android (x86)項目致力于移植 Android系統到X86處理器上&#xff0c;使用戶可以更容易的在任何電腦上安裝Android。他們通過使用android源碼&#xff0c;增加補丁來使 Android能夠在X86處理器&#xff0c;筆記本電腦和平板 電腦下工作。前一段時間&#xff0c;項目組發布了最新…

微信小程序setinterval_簡單談談setTimeout與setInterval

感謝踩過的坑sf社區的第一篇文章。最近在做一個拍賣的微信小程序&#xff0c;用到了定時器setTimout和setInterval,簡單談談這兩個api。setTimeout最常見的用法就是第二種(第三種mdn文檔不推薦)&#xff0c;如:var timeoutId setTimeout(function() {console.log(hello world!…

python 注釋一段話_Python快速入門(一)

引言Python作為一個&#xff0c;目前最火的編程語言之一&#xff0c;已經滲透到了各行各業。它易學好懂&#xff0c;擁有著豐富的庫&#xff0c;功能齊全。人生苦短&#xff0c;就用Python。這個快速入門系列分為六篇&#xff0c;包含了Python大部分基礎知識&#xff0c;每篇閱…

linux ibus獲取窗體位置,Ubuntu 12.04 顯示ibus 的輸入框

在虛擬機中安裝了Ubuntu 12.04&#xff0c;系統是英文版本的&#xff0c;我能接受&#xff0c;但是苦于沒有中文輸入法。起先&#xff0c;我是安裝SCIM&#xff0c;結果我折騰了半天&#xff0c;發現其只能在lib-office下使用。firefox,文字編輯器中都不能調出SCIM。無奈將其卸…

transporter上傳卡正在交付_【iOS】Xcode11使用Transporter將APP上傳到App Store,卡在正在驗證APP...

問題&#xff1a;在使用Transporter時&#xff0c;會卡主&#xff0c;一直顯示正在驗證APP在這里插入圖片描述解決方案一&#xff1a;利用V-P-N在這里插入圖片描述使用安全上網(V-P-N)&#xff0c;雙擊打開iTMSTransporter&#xff0c;等待幾分鐘lichuangMacBook-Pro-3 ~ % /Ap…

python練手經典100例微盤_20個Python練手經典案例,能全做對的人確實很少!

100個Python練手小程序&#xff0c;學習python的很好的資料&#xff0c;覆蓋了python中的每一部分&#xff0c;可以邊學習邊練習&#xff0c;更容易掌握python。 如果你感覺學不會&#xff1f;莫慌&#xff0c;小編推薦大家加入群&#xff0c; 前面548中間377后面875&#xff0…

小紅帽linux各功能中英,英文短劇《小紅帽》劇本臺詞完整版---中英對照文本版...

大灰狼和小紅帽的故事紅帽第一場&#xff1a;小紅帽家 媽媽&#xff1a; (媽媽拿著一個籃子&#xff0c;把桌子上的水果放在籃子里) 小紅帽唱著歌&#xff0c;歡快地跑進來)Hi,mummy, what are you doing? 嘿&#xff0c;媽媽 你在什么&#xff1f; 媽媽&#xff1a; (一邊把水…

uipath循環datatable_UiPath之DataTable轉換為List和Array

今天給大家分享一下&#xff0c;如何將DataTable轉為List和Array&#xff0c;為此小U也花了不少時間研究&#xff0c;最后發現沒有那么復雜。先來說說List和Array的區別&#xff1a;List&#xff1a;就像一個鏈條&#xff0c;存儲數據的空間可以不連續。Array&#xff1a;就像一…

python批量下載文件教程_Python抓包菜鳥教程:批量下載圖片的方法,電腦和手機都能用...

筆者看上了一組圖集&#xff0c;然后準備一張一張下載時&#xff0c;瞄了一眼&#xff0c;這組圖集還有100&#xff0c;好吧&#xff0c;我酸了。 筆者就是試試工具&#xff0c;你們別像我這樣用&#xff0c;這么好的工具&#xff0c;做自媒體&#xff0c;那絕對了那如何批量下…