python爬蟲實戰:利用pyquery爬取貓眼電影TOP100榜單內容-2
阿新 • • 發佈:2019-02-17
上次利用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))