最簡單的python爬蟲入門
本文適合從沒有接觸過爬蟲的童鞋,能讓你爬出第一份簡單的作品。
本文基於python2.7,以豆瓣電影top250為例,爬出這250部電影。
技能準備
- python2.7語法基礎
- html語法基礎
- 瀏覽器頁面基本調試(F12)
- requests基本用法
- xpath語法
爬蟲思路
簡單來講,爬蟲無非就兩步:
- 獲得你需要爬取的網頁源碼(requests);
- 在源碼里找到你需要的信息,提取出來(xpath)。
requests安裝與使用
安裝requests很簡單,在cmd或powershell里用pip安裝即可。
pip install requestsn
requests發送網路請求,用於獲取網頁源碼。
# coding:utf-8nimport requests # 導入requests模塊n nurl = https://movie.douban.com/top250 # 以豆瓣電影top250網頁為例nr = requests.get(url) # 使用get請求獲得名為r的response對象,可以從這對象獲取我們要的信息nweb_code = r.content # 也可以用.text方法,但如果需要處理視頻、圖片等二進位內容,需要用.contentnnprint web_coden
上述代碼運行後可以獲得網頁源代碼:
xpath語法基礎
拿到網頁源碼後,如何處理呢?我們要找到所需信息的元素節點,用xpath獲取這些節點。
比較常用的xpath表達式有用到以下幾種:
- nodename:選取此節點的所有子節點;
- / : 從根節點選取;
- // : 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置;
- . : 選取當前節點;
- .. : 選取當前節點的父節點;
- @ : 選取屬性。
接下來,把滑鼠移動到需要獲取的網頁信息處,右擊->審查元素,即可快速定位到該信息的元素節點。例如我們定位電影名稱的元素節點。
通過觀察元素規律,不難發現,我們需要的信息節點都在class屬性值為「info」的元素里,換言之,每一頁有25部電影,每部電影分布在每一個li元素里,那麼想提取出該頁面所有電影的信息,可循環讀取所有li元素的信息。
# coding:utf-8nnimport requestsnfrom lxml import html # 導入lxml.html模塊nnurl = https://movie.douban.com/top250nr = requests.get(url).contentnr_tree = html.fromstring(r) # 將獲取的response對象r轉化可讀取的元素樹nnfor i in r_tree.xpath(//div[@class="info"]): # 用xpath選取節點n # 電影名稱n movie_title = i.xpath(div[@class="hd"]/a/span[@class="title"]/text())[0]n print movie_title n
接著我們還可以獲取其他的影片信息,如上映日期、評論情況等。
for i in r_tree.xpath(//div[@class="info"]):n # 電影名稱n movie_title = i.xpath(div[@class="hd"]/a/span[@class="title"]/text())[0]n n # 影片整體信息n all_info = i.xpath(div[@class="bd"]/p[1]/text())nn # 導演演員n cast_info = all_info[0].replace(" ", "").replace("n", "") n # 上映日期 n run_date = all_info[1].replace(" ", "").replace("n", "").split("/")[0] n # 國家 n country = all_info[1].replace(" ", "").replace("n", "").split("/")[1] n # 類型 n geners = all_info[1].replace(" ", "").replace("n", "").split("/")[2] n # 評分n score = i.xpath(div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text())[0] n # 評論人數 n comment_num = i.xpath(div[@class="bd"]/div[@class="star"]/span[4]/text())[0] nn print movie_title, cast_info, run_date, country, geners, score, comment_numn
但每頁只有25部電影,有250部,即有25頁,那麼就需要獲取其他分頁的鏈接。觀察每頁的鏈接地址,很容易得到規律。每一頁的數據請求也用循環完成。
for i in range(10): # 有10頁,需要循環10次n url = https://movie.douban.com/top250?start={}&filter=.format(i*25)n
把兩個循環嵌套,就可獲得250部的影片信息。
保存
最後一步便是將獲得的信息保存為文件,這裡我們存為.txt文件。用python的with...as...。
# 寫入文件 nwith open("E:/python/douban_top250.txt", "a") as f: n f.write("top%sn電影名稱:%sn上映日期:%sn導演演員:%sn上映國家:%sn類型:%sn評分:%sn評論人數:%sn" % (k, movie_title, cast_info, run_date, country, geners, score, comment_num))n f.write("====================================================n")n
附完整源代碼:
# coding:utf-8nnimport requests # 導入requests模塊nfrom lxml import html # 導入lxml.html模塊nimport sysnreload(sys) nsys.setdefaultencoding( "utf-8" ) nnk = 1nfor i in range(10): # 有10頁,需要循環10次n url = https://movie.douban.com/top250?start={}&filter=.format(i*25)n r = requests.get(url).content # 使用get請求獲得名為r的response對象,對象里有我們要的信息。也可以用.text方法,但如果需要處理視頻、圖片等二進位內容,需要用.contentn r_tree = html.fromstring(r) # 將獲取的response對象r轉化可讀取的元素樹n n for i in r_tree.xpath(//div[@class="info"]): # 用xpath選取節點n # 電影名稱n movie_title = i.xpath(div[@class="hd"]/a/span[@class="title"]/text())[0]nn # 影片整體信息n all_info = i.xpath(div[@class="bd"]/p[1]/text())nn # 導演演員n cast_info = all_info[0].replace(" ", "").replace("n", "") n # 上映日期 n run_date = all_info[1].replace(" ", "").replace("n", "").split("/")[0] n # 國家 n country = all_info[1].replace(" ", "").replace("n", "").split("/")[1] n # 類型 n geners = all_info[1].replace(" ", "").replace("n", "").split("/")[2] n # 評分n score = i.xpath(div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text())[0] n # 評論人數 n comment_num = i.xpath(div[@class="bd"]/div[@class="star"]/span[4]/text())[0] n n # 保存到文件n with open("E:/python/douban_top250.txt", "a") as f: n f.write("top%sn電影名稱:%sn上映日期:%sn導演演員:%sn上映國家:%sn類型:%sn評分:%sn評論人數:%sn" % (k, movie_title, cast_info, run_date, country, geners, score, comment_num))n f.write("====================================================n") n n k += 1n
文章首發於知乎,禁止轉載。
推薦閱讀:
※[15] Python循環語句(二)
※量化策略系列教程:13布林強盜系統
※學會最簡單的資料庫|看完這7招就夠了
※實戰 | 讓機器人替你聊天,還不被人看出破綻?來,手把手教你訓練一個克隆版的你