A Semalt的教程:Python中的Web爬取

我最近訪問了KinoPoisk(IMDB的俄語版本),發現多年來我為超過1000部電影評分。我認為對這些數據進行更詳細的研究會很有趣:我的電影口味隨著時間變化了嗎?在一年中的哪個季節裡我看更多的電影?

但是在分析和構建漂亮的圖形之前,我們需要獲取數據。不幸的是,許多服務沒有公共API,因此您必須袖手旁觀並解析html頁面。

本文適用於那些一直想學習如何使用Web Scrapping但又不懂得如何使用Web Scrapping的人。開始。

任務

我們的任務是提取有關已經看過的電影的數據:電影的標題,觀看日期和時間,用戶的評分。

實際上,我們的工作將分兩個階段完成:

第1階段1:下載並保存html頁面

階段2:以適合進一步分析的格式(csv,json,pandas數據框等)解析html

儀器

有很多用於發送http請求的python庫。最著名且最方便的是請求。

還需要選擇一個用於HTML解析的庫。

BeatifulSoup,lxml

這是兩個最流行的用於解析html的庫,選擇其中一個只是個人喜好。而且,這些庫彼此緊密相連:BeautifulSoup開始使用lxml作為內部解析器來進行加速,並在lxml中添加了湯解析器模塊。為了比較這些方法,我將使用BeautifulSoup並使用模塊lxml.html中的XPath選擇器來解析數據。

下載數據

讓我們開始下載數據。首先,讓我們嘗試通過url獲取頁面並將其保存到本地文件中。

我們打開生成的文件,發現它不是那麼簡單:該站點將我們視為機器人,並且不會顯示數據。

讓我們來了解網站的工作原理

瀏覽器從網站獲取信息沒有問題。讓我們看看它如何發送請求。為此,我們使用瀏覽器“開發人員工具”中的“網絡”面板(為此,我使用Firebug),通常,我們需要的請求是最長的。

如我們所見,瀏覽器還向標頭UserAgent,cookie和其他一些參數發送。首先,我們將嘗試將正確的UserAgent發送到標頭。

這次我們成功了,現在我們已經獲得了必要的數據。值得注意的是,有時站點還會檢查cookie的有效性,在這種情況下,請求庫中的會話會有所幫助。

下載所有房價

現在,我們可以保存帶有費率的一頁。但是通常用戶的費率很高,因此有必要遍歷所有頁面。我們感興趣的頁碼很容易直接轉移到url。

從HTML收集數據

現在,讓我們直接開始從html收集數據。了解html頁面結構的最簡單方法是使用瀏覽器中的“檢查元素”功能。在這種情況下,一切都非常簡單:帶有費率的整個表格都在標記中。選擇此節點:

從bs4導入BeautifulSoup

從lxml導入html

#美麗的湯

湯= BeautifulSoup(文本)

film_list=soup.find('div',('class':'profileFilmsList'))

#lxml

tree=html.fromstring(text)

film_list_lxml=tree.xpath('// div [@class =``profileFilmList'']')[0]

讓我們學習如何提取電影的俄語標題和電影頁面的鏈接(以及如何獲取文本和屬性值) )。

如果您需要提取英文標題,只需將“ nameRus”更改為“ nameEng”即可。

結果

我們學習瞭如何解析網站,熟悉庫Requests,BeautifulSoup和lxml以及所接收的適合進一步分析已看電影的數據在KinoPoisk上。