標籤:

case1_sup: 爬取豆瓣電影top250的所有分頁的網頁鏈接,並寫入txt文檔中(自定義函數)

註:使用到的points[ ] 常規的urllib.request, def函數打包,涵蓋了chardet模塊檢測網頁編碼和編碼自動轉換[ ] re[ ] try: ……… except: ……[ ] os模塊: [ ] 獲取當前和上一級路徑 [ ] def函數。創建新的文件夾 [ ] def函數,創建絕對路徑下的新文件 [ ] 絕對路徑的分割,得到路徑和文件名[ ] 追加寫入文件內容(a), w是寫入, a是追加寫入# 爬取電影天堂的所有分頁的網頁鏈接# -*- coding:utf-8 -*-from urllib.request import urlopenimport itertoolsimport chardet # 編碼模塊import reimport os# 自定義函數,自動獲取網站編碼格式並按相應格式解碼賦值給request# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~def download(html): urlorgs = urlopen(html).read() # 檢測url的編碼格式 char_url = chardet.detect(urlorgs) print(char_url[encoding]) # print(char_url) # {encoding: GB2312, confidence: 0.99, language: Chinese} # url按照對應的編碼格式進行解碼輸出, chardet.detect()內容為key-value字典 request = urlorgs.decode(char_url[encoding]) return request# 傳參 html,獲得正確編碼後的網頁內容request = download("http://www.dytt8.net/html/gndy/dyzz/index.html")# print(request)# 方法1:# 獲取所有分頁面的數字,並把分頁數作為一個List存儲在urls_num中用於迭代urls_num = re.findall(r"<option value=list_23_(.*).html", request)# print(urls) # [1, 2, 3, 4……,165]# 利用urls_num遍歷來獲得網址page_total = 0 # 分頁總數listurls = [] # 存儲所有分頁網址的listfor page_num in range(1, len(urls_num)+1): # range(1,166), 從1開始,步進默認為1,第166不包含在內 try: listurl = "http://www.dytt8.net/html/gndy/dyzz/list_23_%d.html" % page_num print("獲取第%d頁網址:" %page_num, listurl) page_total +=1 listurls.append(listurl) # listurls中自動添加分頁鏈接 except: print("分頁鏈接獲取出現異常!!") breakprint("該分類下的影片分頁一共有%d頁" % page_total)print(listurls) # [http://www.dytt8.net/html/gndy/dyzz/list_23_1.html, http://www.dytt8.net/html/gndy/dyzz/list_23_2.html……]# # 方法2:# # 獲取所有分頁的網頁鏈接# urlorgs = re.findall(r"<option value=.*.html", request)# # ["<option value=list_23_1.html", "<option value=list_23_2.html",…… ]# # 將urlorgs轉化為http開頭的網址# listurl = []# for list in urlorgs:# url = list.replace("<option value=", "http://www.dytt8.net/html/gndy/dyzz/") # 去掉網址前面的 <option value= 字元串# listurl.append(url)# # print(listurl[10]) # http://www.dytt8.net/html/gndy/dyzz/list_23_11.html# 自定義函數,在創建新的文件夾# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~def mkdir(path): # 去除首位空格 path = path.strip() # 去除尾部符號 『\』 path = path.rstrip("") # 判斷路徑是否存在 isExists = os.path.exists(path) if not isExists: # 如果不存在,則創建目錄 os.makedirs(path) os.makedirs(path) print(path + 創建成功) return True else: # 如果目錄存在則不創建 print(path + 目錄已存在) return False# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# 判斷文件(絕對路徑)是否存在,若不存在則新建def mkfp(fp_abs): # fp_name一定要是絕對路徑 isexists = os.path.exists(fp_abs) p, f = os.path.split(fp_abs) # os模塊的split獲得文件名f; 另一種方法: f = fp_abs.split("")[-1] if not isexists: fp = open(fp_abs, "w") # 下載圖片不適合用def mkfp, 圖片需重新解析網址,這裡只創建txt,並未寫入內容 # 分割路徑和文件名 print(f + ":已創建完成") return True else: print(f + ":已存在") return False# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# 獲取當前路徑dir_path = os.path.abspath(".") # . 當前路徑; .. 上一級路徑# print(dir_path) # E:KLAUSNewPythonspiderspid_txt xt_1# print(type(dir_path)) # <class str># 新目錄路徑及目錄名,作為mkdir函數的傳參dir_new = dir_path + "\urltxts" # E:KLAUSNewPythonspiderspid_txt xt_1urltxtsmkdir(dir_new)# 新建txt文件,作為mkfp的傳參f_new = "\moviestop250_ruls.txt"fp_abs = dir_new + f_new # 絕對路徑,傳入的參數mkfp(fp_abs) # 創建f_name名字的txt文件,絕對路徑創建# # 將獲得的網頁鏈接寫入新建txt文本中,兩個def函數對圖片不管用,圖片需要再重新解析網址並寫入for url in listurls: fp = open(fp_abs, "a") # "a" 追加寫入; "w" 或wb 清空再寫入") 打開已經創建的文件 fp.write(url+"
") # 向文件中寫入內容fp.close()

推薦閱讀:

用Python爬取網易雲音樂歌曲
Python 插件式的信息爬蟲 Beehive
爬蟲 get 請求返回的內容是byte類型,如何轉為漢字?在線等
Python爬取拉勾網所有的職位信息(一)
基於cookie登錄爬取豆瓣舌尖短評信息並做詞雲分析

TAG:python爬蟲 |