天天看點

python爬蟲實戰:利用beautiful soup爬取貓眼電影TOP100榜單内容-2

最近學習了 html5 相關的網頁标簽的基礎知識,這個對beautiful soup的應用了解有很多的幫助,于是重新整理了之前的代碼。

有興趣的可以參考。

import os
import requests
from bs4 import BeautifulSoup


file_path = 'D:\python3.6\scrapy\maoyan' 
# 定義檔案夾,友善後續check檔案夾是否存在
file_name = 'maoyan.txt'  
# 自定義檔案名稱
file = file_path+'\\'+file_name 
# 建立檔案全位址,友善後續引用

url = "http://maoyan.com/board/4"
# 擷取url的開始頁
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

if os.path.exists(file):
# 如果檔案存在,就在程式運作開始頭指針開始編輯,即清空原有内容;
# 如果檔案不存在,就建立一個新檔案
	with open(file, 'w', encoding='utf-8') as f: 
	# 打開目标檔案夾中的檔案
			f.truncate()
			#清空檔案内容,注意:僅當以 "r+" "rb+" "w" "wb" "wb+"等以可寫模式打開的檔案才可以執行該功能

def get_all_pages(start):
# 自定義擷取所有目标pages頁的内容的函數
	
	pages=[]
	#定義空清單,加載擷取的page内容
	for n in range(0,100,10):
	# 确認offset的步進值,注意把int的n轉換為str
	# 周遊所有的url,并擷取每一頁page的目标内容
		if n==0:
			url=start
		else:
			url=start+'?offset='+str(n)			
		r = requests.get(url, headers=headers) 
		soup = BeautifulSoup(r.content, 'lxml')
		page= soup.find_all(name='dd')	
		# 将取該gage的所有dd節點的内容轉換為soup屬性		
		pages.extend(page)
		# 利用extend方法擴充pages list内容		
	return pages
	# 傳回所有pages list内容
	
text = get_all_pages(url)

for film in text:
# 周遊清單 text中的所有元素,也就是每個dd節點内容
# 這個for循環應該優化成 自定義函數形式;
	dict ={}
	# 建立空dict,用來存放film資訊	
	dict['Index']=film.i.string
	# 選取第1個i節點标簽的的string值,即film的排行值,并存入字典dict中
	dict['name']=film.a.attrs['title']
	# 選取第1個a節點标簽的title屬性的名稱,即film的名稱,并存入字典dict中
	dict['star']=film.find(name='p',attrs={'class': 'star'}).string.strip()
	# 選取第1個節點标簽名稱為p,且class屬性名稱為star的string值,并利用strip方法去除文本的前後的空格或者換行,并存入字典dict中

	time=film.find(name='p',attrs={'class': 'releasetime'}).string.strip()
	dict['releasetime']=time[5:15]
	
	# 選取第1個節點标簽名稱為p,且class屬性名稱為releasetime的string值,
	# 并利用strip方法去除文本的前後的空格或者換行,并存入字典dict中
	
	
	sco1=film.find(name='i',attrs={'class': 'integer'}).string
	sco2=film.find(name='i',attrs={'class': 'fraction'}).string
	# 選取第1個節點标簽名稱為i,且class屬性名稱為integer或者fraction的string值

	dict['score']=sco1+sco2
	# 存入score值
	
	print(dict)
	# 檢查dict是否為目标輸出内容
	
	with open(file, 'a+', encoding='utf-8') as f: 
	# 以 a+ 方式打開目标file檔案,
	# 如果該檔案已存在,檔案指針将會放在檔案的結尾。
	# 檔案打開時會是追加模式。如果該檔案不存在,建立新檔案用于讀寫。
		f.write(str(dict)+'\n') 
		# 注意添加 換行符 '\n',實作每個dict自動換行寫入txt中
		
print('抓取完畢') 
           

貓眼電影TOP100榜單中的抓取目标dd節點内容樣式參考:

<dd>
                        <i class="board-index board-index-1">1</i>
    <a href="/films/1203" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
      <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
      <img src="http://p1.meituan.net/movie/[email protected]_220h_1e_1c" alt="霸王别姬" class="board-img" />
    </a>
    <div class="board-item-main">
      <div class="board-item-content">
              <div class="movie-item-info">
        <p class="name"><a href="/films/1203" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
        <p class="star">
                主演:張國榮,張豐毅,鞏俐
        </p>
<p class="releasetime">上映時間:1993-01-01(中國香港)</p>    </div>
    <div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>        
    </div>

      </div>
    </div>

                </dd>
           

繼續閱讀