Python爬取電影天堂最新發布影片訊息
從今天開始我會把我學習python爬蟲的一些心得體會和程式碼釋出在我現在的部落格,好記性不如爛筆頭,以便以後的我進行復習。
雖然我現在的爬蟲還很幼小,希望有一天她能長得非常非常的強大。
--------------------2018.11.22---------------------------------------------------------------------------------------------------------------------------------
OK,廢話少說。今天爬取的是電影天堂網站左邊框的一個container。
環境我準備好了,所以我就開始了。
首先,為了我測試時的速度和不影響人家網站的伺服器,我決定把電影天堂頁面的html下載到本地
程式碼如下:
1 #下載網頁 2 def downloadhtml(): 3 url = 'https://www.dytt8.net' 4 headers = {'User-Agent':'Mozilla/5.0'} 5 r = requests.get(url,headers=headers) 6 with open('C:/Code/newhtml1.html','wb') as f: 7 f.write(r.content) 8 downloadhtml()
這裡值得一提的是,抓取下來的HTML格式是二進位制的,所以儲存檔案時要用wb。
儲存好HTML檔案,我就可以盡情地調戲,不對,除錯這個網站了的資料。
第一步:分析資料
開啟網頁的原始碼,我們發現我們需要的資料被裝在一個ul標籤裡。
Ctrl+F在原始碼裡檢視<ul>標籤,發現我們需要的ul標籤是第三個標籤。
這樣我們就知道該爬哪裡了。
第二步:解析資料
剛才下載的網頁現在可以用上了,定義一個函式讓BeautifulSoup能用上這個HTML網頁
如:soup = BeautifulSoup(html,'html.parser')裡面的html引數就可以用htmlhandle這個變數填上。
1 def send_html(): 2 path = 'C:/Code/newhtml1.html' 3 htmlfile=open(path,'r') 4 htmlhandle = htmlfile.read() 5 return htmlhandle
開始分析資料,
先貼程式碼吧:
1 def get_pages(html): 2 soup = BeautifulSoup(html,'html.parser') 3 for ul in soup.find_all('ul')[2]: 4 if isinstance(ul,bs4.Tag): 5 Tag_name=ul.get_text() 6 Tag_href=ul.get('href') 7 if Tag_name!= '': 8 print('名稱:{},地址:{}'.format(Tag_name,Tag_href))
解釋下程式碼
先用BeautifulSoup的find_all()函式找到所有ul標籤,因為後面加了[2],所以找到是第三個ul標籤。
在這裡我們離我們的目標很近了。
但這裡我們能發現find_all()遍歷返回的值的型別是不同的,我們利用type(ul)就能發現,它其中參雜兩種型別:
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.Tag'>
字串和Tag,測試一下就能知道字串型別是空的,我們需要的Tag型別。
所以用isinstance來判斷是否是Tag型別,如果不是,就不要了。輸出如下:
我們發現,中間還參雜了一些無效的條目,仔細看上面就能發現它返回是有兩個Tag型別的,其中一個是什麼都沒有裝的,是導致這個無效條目的原因。
所以把這條無效的條目給過濾掉吧
if Tag_name!= '': print('名稱:{},地址:{}'.format(Tag_name,Tag_href))
到這裡,我們就完成了本次抓取。
下面附上總程式碼:
1 import requests 2 import re 3 from bs4 import BeautifulSoup 4 import bs4 5 6 def send_html(): 7 path = 'C:/Code/newhtml1.html' 8 htmlfile=open(path,'r') 9 htmlhandle = htmlfile.read() 10 return htmlhandle 11 12 def get_pages(html): 13 soup = BeautifulSoup(html,'html.parser') 14 for ul in soup.find_all('ul')[2]: 15 #print(type(ul)) 16 if isinstance(ul,bs4.Tag): 17 Tag_name=ul.get_text() 18 Tag_href=ul.get('href') 19 if Tag_name!= '': 20 print('名稱:{},地址:{}'.format(Tag_name,Tag_href)) 21 22 get_pages(send_html())