1. 程式人生 > >python爬蟲實戰:利用pyquery爬取貓眼電影TOP100榜單內容-2

python爬蟲實戰:利用pyquery爬取貓眼電影TOP100榜單內容-2

上次利用pyquery爬取貓眼電影TOP100榜單內容的爬蟲程式碼中點選開啟連結 存在幾個不合理點。

1. 第一個就是自定義的create_file(檔案存在判斷及建立)函式。

我在後來的python檔案功能相關學習中,發現這個自定義函式屬於重複造輪子功能。因為 for data in page.items()這個頁面內容提取的迴圈體中包含的下面程式碼中with open方法即存在檔案存在判斷和建立功能。所有沒有必要單獨自定義create_file函式的必要。

for data in page.items():  #  遍歷該頁所有node的內容,並獲取對應的目標值,然後寫入本地
		# print(data,type(data)) #  檢驗data型別
		# print('1'*50)
		index = data.children('i').text()
		name = data.find('.name').text()
		star = data.find('.star').text()
		releasetime = data.find('.releasetime').text()
		score = data.find('.score').text()
		
		dict['index']=index
		dict['name']=name
		dict['star']=star
		dict['releasetime']=releasetime
		dict['score']=score
		
		with open(file, 'a+', encoding='utf-8') as f: # 開啟目標file檔案
			f.write(str(dict)+'\n')   # 注意新增 換行符 '\n',實現每個dict自動換行寫入txt中		

原始碼create_file函式參考:

def create_file(file_path,file):   # 定義 檢查和建立目標資料夾和檔案的函式  
      
    if os.path.exists(file_path)== False: # check資料夾不存在  
        os.makedirs(file_path)   # 建立新的自定義資料夾  
        fp = open(file,'w')   # 建立新的自定義檔案  
    # "w" 以寫方式開啟,只能寫檔案,如果檔案不存在,建立該檔案;如果檔案已存在,先清空,再開啟檔案  
      
    elif os.path.exists(file_path)== True: # check資料夾存在  
        with open(file, 'w', encoding='utf-8') as f: # 開啟目標資料夾中的檔案  
            f.seek(0)  
    # f.seek(offset[,where])把檔案指標移動到相對於where的offset位置。where為0表示檔案開始處,這是預設值 ;1表示當前位置;2表示檔案結尾  
            f.truncate()  
    #清空檔案內容,注意:僅當以 "r+" "rb+" "w" "wb" "wb+"等以可寫模式開啟的檔案才可以執行該功能  
  
create_file(file_path,file)  

優化方法: 取消create_file函式,僅保留f.truncate() 清空原始檔功能。

2. 在 for data in page.items() 迴圈體中的電影資訊字典新增程式碼寫得有點囉嗦,可以直接進行dict賦值。

優化後代碼參考如下:

from pyquery import PyQuery as pq
import requests
import os 
import time

begin = time.clock()  # 新增程式執行計時功能。

file_path = 'D:\python3.6\scrapy\貓眼'   # 定義資料夾,方便後續check資料夾是否存在
file_name = 'maoyan.txt'   # 自定義命名檔名稱,
file = file_path+'\\'+file_name     # 建立檔案全地址,方便後續引用

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
	
start = "http://maoyan.com/board/4"  # 獲取url的開始頁
flage='?offset='   # url 變化的標誌
node='dd'  # 目標url  對應html 中目標節點
step=10  # url 變化的步進長度
length=100  # url 變化的max


if os.path.exists(file):
	with open(file, 'w', encoding='utf-8') as f: # 開啟目標資料夾中的檔案
			f.truncate() #清空檔案內容,注意:僅當以 "r+" "rb+" "w" "wb" "wb+"等以可寫模式開啟的檔案才可以執行該功能


for n in range(0,length,step): #安裝url步進變化爬取每頁目標內容, 並存儲到本地
	dict ={}	 #建立空字典,用於儲存爬取的內容
	if n==0:  #  獲取首頁url 
		url=start 
		i=n+1  # 自定義 i 表示爬取頁數頁
	else : #  首頁以外url定義 
		url=start+flage+str(n)
		i=(n/10)+1
	r = requests.get(url,headers=headers) #  獲取每頁的html
	doc=pq(r.text)  #  利用ququery類進行解析
	page=doc.find(node)  #  查詢所有node的內容
				
	for data in page.items():  #  遍歷該頁所有node的內容,並獲取對應的目標值,然後寫入本地
		# print(data,type(data)) #  檢驗data型別
		# print('1'*50)
		index = data.children('i').text()
		name = data.find('.name').text()
		star = data.find('.star').text()
		releasetime = data.find('.releasetime').text()
		score = data.find('.score').text()
		
		dict['index']=index
		dict['name']=name
		dict['star']=star
		dict['releasetime']=releasetime
		dict['score']=score
		
		with open(file, 'a+', encoding='utf-8') as f: # 開啟目標file檔案
			f.write(str(dict)+'\n')   # 注意新增 換行符 '\n',實現每個dict自動換行寫入txt中		
	print('第%d頁爬取完畢!'%(i))
	
end = time.clock() # 新增程式執行計時功能。
print("爬取完畢,耗時:%f"%(end-begin))