最簡單的python爬蟲入門

本文適合從沒有接觸過爬蟲的童鞋,能讓你爬出第一份簡單的作品。

本文基於python2.7,以豆瓣電影top250為例,爬出這250部電影。

技能準備

  • python2.7語法基礎
  • html語法基礎
  • 瀏覽器頁面基本調試(F12)
  • requests基本用法
  • xpath語法

爬蟲思路

簡單來講,爬蟲無非就兩步:

  1. 獲得你需要爬取的網頁源碼(requests);
  2. 在源碼里找到你需要的信息,提取出來(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

上述代碼運行後可以獲得網頁源代碼:

代碼運行在jupyter里,下方的框框即為返回的網頁源碼

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

把爬蟲的結果保存到.txt文檔


文章首發於知乎,禁止轉載。

推薦閱讀:

[15] Python循環語句(二)
量化策略系列教程:13布林強盜系統
學會最簡單的資料庫|看完這7招就夠了
實戰 | 讓機器人替你聊天,還不被人看出破綻?來,手把手教你訓練一個克隆版的你

TAG:网页爬虫 | Python |