利用Requests+正則表達式爬取貓眼電影,學習全過程記錄與體會。

聲 明

本文章為爬蟲學習的實戰項目——貓眼電影爬蟲,總結筆記。

學習資料,來自於Python3爬蟲三大案例實戰分享 - 網易雲課堂

視頻作者——崔慶才,崔大神。 @靜覓

作者博客地址:靜覓丨崔慶才的個人博客

目 的:

數據分析師,學習作為生存原料的數據的採集工作。

學習python語法的運用,爬蟲原理的理解

參考學習資料:

Python3爬蟲三大案例實戰分享 - 網易雲課堂

Python正則表達式 | 菜鳥教程

Python3 教程 | 菜鳥教程

快速上手 - Requests 2.18.1 文檔

環境配置:

1.系統環境:WIN8

2.編譯環境:Python3.5

3.所需庫:requests、re、json、multiprocessing

4.IDE:Pycharm

學前疑惑:

1.如何獲取網站源代碼?

2.如何從網頁源代碼中獲取想要的信息?

3.如何將獲取的信息進行保存?

具體代碼:

如下所示,代碼中有些部分有加入個人解釋。

import requestsfrom requests.exceptions import RequestExceptionimport reimport jsonfrom multiprocessing import Pooldef get_one_page(url):#獲取網頁源代碼,為了防止程序中斷,需要設計獲取錯誤,返回None。 try: user_agent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" headers = {"User-Agent": user_agent}#設置請求頭,不然無法正常獲取網頁信息。視頻中無需採用請求頭,但是實際操作中需要。 response=requests.get(url,headers=headers) if response.status_code==200: return response.text return None except RequestException: return Nonedef parse_one_page(html):#解析網頁代碼,利用正則獲取需要的信息,再通過生成器,生成item字典。 pattern=re.compile("<dd>.*?board-index.*?">(d+)</i>.*?src="(.*?)".*?<a.*?>" +"(.*?)</a>.*?<p.*?star">(.*?)</p>.*?releasetime">(.*?)" +"</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>",re.S)#依次獲取電影的序列,圖片地址,標題,主演,時間,得分。 items=re.findall(pattern,html) for item in items: yield { "index":item[0], "image":item[1], "title":item[2], "actor":item[3].strip()[3:],#strip()可以去除換行符 "time":item[4].strip()[5:], "score":item[5]+item[6] }def write_to_file(content):#將獲取的信息,字典形式,轉換為JSON格式寫入TXT。 with open("result.txt","a",encoding="utf-8") as f:#"a"方法為添加進入,enecoding設置編碼格式以防亂碼 f.write(json.dumps(content,ensure_ascii=False) +"
")#將字典轉化為JS格式 f.close()def main(offset):#主程序,調用各個函數。 url="http://maoyan.com/board/4?offset+" + str(offset) html=get_one_page(url) for item in parse_one_page(html): print(item) write_to_file(item)if __name__ == "__main__":#暫時不清楚具體作用,但是可以用來調用主程序,並且加入進程池功能。 pool=Pool() pool.map(main,[i*10 for i in range(10)])

項目結果:

{"index": "1", "time": "1993-01-01(中國香港)", "score": "9.6", "image": "//ms0.meituan.net/mywww/i", "title": "霸王別姬", "actor": "張國榮,張豐毅,鞏俐"}

{"index": "2", "time": "1994-10-14(美國)", "score": "9.5", "image": "//ms0.meituan.net/mywww/i", "title": "肖申克的救贖", "actor": "蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓"}

{"index": "3", "time": "1953-09-02(美國)", "score": "9.1", "image": "//ms0.meituan.net/mywww/i", "title": "羅馬假日", "actor": "格利高利·派克,奧黛麗·赫本,埃迪·艾伯特"}

.....

.....

......

{"image": "//ms0.meituan.net/mywww/i", "index": "8", "time": "1993-07-01(中國香港)", "actor": "周星馳,鞏俐,鄭佩佩", "title": "唐伯虎點秋香", "score": "9.2"}

{"image": "//ms0.meituan.net/mywww/i", "index": "9", "time": "2001-07-20(日本)", "actor": "柊瑠美,入野自由,夏木真理", "title": "千與千尋", "score": "9.3"}

{"image": "//ms0.meituan.net/mywww/i", "index": "10", "time": "1940-05-17(美國)", "actor": "費雯·麗,羅伯特·泰勒,露塞爾·沃特森", "title": "魂斷藍橋", "score": "9.2"}

TXT文件中共有一百行數據,運行成功。

學習思路回顧:

打開視頻以後,了解了這次爬蟲的目標是TOP100榜 - 貓眼電影 - 一網打盡好電影。首先,對網站代碼進行獲取。用的是最方便的requests庫,get用法。但是,發現,無法正常獲取到信息,百度相關問題後,使用加入請求頭的辦法,網站數據正常獲取。為了防止程序中斷,第一個獲取網頁數據的函數get_one_page,加入了兩個進程錯誤處理。一個是請求狀態碼不為200時,另一個是獲取網頁代碼失敗時的錯誤處理。

第二部分,是網頁代碼解析部分。主要辦法是利用正則表達式,從網頁源代碼中找出符合正則的代碼部分,再利用正則中(.*?)的用法,對關鍵信息提取,再利用re.findall方法進行搜索。最後對搜索結果進行遍歷,用yield——生成器,生成了一個字典item。

第三部分,將獲取的數據——字典item,用json.dumps方法,將字典轉化為 JSON格式以便用來存儲。但是,結果是亂碼,需要再進行字元編碼處理。寫入時,聲明encoding="utf-8",json.dumps方法調用時,聲明ensure_ascii=False。

第四部分,main()程序調用各個函數。並且通過觀察不用頁的網站地址規律,加入多頁爬取的辦法。if __name__ == "__main__",使用這行代碼調用main()程序,但是搜索之後對他的具體作用還不是很清楚,暫時先擱置。同時,使用下面這兩行代碼,嘗試使用進程池辦法。速度有提升,但是不明顯。

pool=Pool()

pool.map(main,[i*10 for i in range(10)])

課外思考:

為什麼需要用不同函數的組合來完成程序呢?個人想法,一個是,邏輯清楚明確,一個函數對應一個功能,出現問題後找錯誤的速度很快,而且不會影響其他函數的進行,是個好習慣,以後需要多去以函數形式完成程序。第二個,如果我這次完成了這個爬蟲,那我下次其他爬蟲程序,當我需要一部分功能時,是不是直接從原先的代碼直接複製相應函數進行修改就能使用了?非常方便。

正則表達式爬蟲非常好用!有什麼使用範圍嗎?通過網頁代碼獲取的數據,可以是可以看到的文字形式。所以,文字類的採集應該都能適用,不過知乎好像不行。還有,視頻的採集,個人想法是先採集視頻的地址,再用過其他庫去下載相應文件,以後再進行相關學習實踐。圖片信息的採集,怎樣能直接保存?還沒學習,個人猜想需要利用資料庫保存數據,以後再另外學習。

對於資料庫的使用很感興趣,但是卻還沒觸及,下一部分需要好好學習相關用法。

下一部分學習目標:

Python3爬蟲三大案例實戰分享 - 網易雲課堂

這周內完成。

第二篇爬蟲實戰筆記已經完成了!

零基礎爬蟲學習全記錄2:今日頭條指定搜索內容下的所有圖集圖片保存——圖片採集小程序

完成時也更加用心,質量也更高一些,希望大家能給予一些指導。

這一篇的爬蟲,更有爬蟲的思維,特別推薦,歡迎持續關注。

歡迎各位私信,關注,共同學習交流進步!


推薦閱讀:

Hello World!
《機器學習實戰》學習總結(六)——支持向量機SVM(一)
用Python實現貝葉斯定理
跟黃哥學習python第二章
可能是最全面的75個Python爬蟲資源

TAG:数据分析 | 爬虫计算机网络 | Python |