1. 程式人生 > >python 爬取簡單靜態網站之電影天堂

python 爬取簡單靜態網站之電影天堂

    大家好。今天我在這裡與大家分享一下簡單的網頁抓取。

    一、準備工作:下載並安裝好python3.x,並且配置好環境變數。

   二、 檢查安裝的軟體是否可用:在cmd視窗下分別輸入python -V  命令 與 pip -V命令(注意大小寫)若出現版本資訊即表示安裝成功。然後用管理員身份開啟cmd視窗,輸入指令:pip install requests , 下載模組成功後即可開始打程式碼。

    三、常識介紹:

        1、URL:統一資源定位符,是網際網路上標準資源的地址,網際網路上的每個檔案都有一個唯一的URL。你可以理解為檔案在網路上的儲存地址,可以通過URL去訪問網路上的資源。

        2、requests庫:通常使用requests中的get函式進行網頁訪問。其中requests中有7個可使用的方法,分別是request、get、head、post、put、patch、delete。但是,事實上,由於網路安全的限制,我們很難有機會去使用後面4個方法,而request又是基本方法,也就是說,對於爬蟲來說,我們一般都是使用get方法,而對於一些特別大的url連結,我們使用head方法來獲得頭部資訊即資源概要。

        3、爬取網頁的通用程式碼框架:用requests.get方法可以獲取網頁的資訊。但是,這不是一定會成功的,因為網路連線有風險,異常處理很重要。

所以我們用到一個爬取網頁的通用程式碼框架來保證網路連線的異常能得到處理

try:
  r = requests.get(url, timeout=30)
  r.raise_for_status()
  return r.text
except:
  return "產生異常"

response的raise_for_status:若獲得的相應為非200響應,我們可以通過 r.raise_for_status() 來丟擲異常

    四、robots協議:大部分網站會有這個協議,而爬蟲理應遵守這個協議。檢視方式為在網站後面新增程式碼/robots.txt即可,協議中可以有多條內容,但每一條都包含兩項資訊,以百度為例

Disallow: /link?
Disallow: /home/news/data/

User-agent: *
Disallow: /

User-agent(使用者代理):表示爬蟲的名稱,Disallow(不允許):表示爬取的排除規則

第一條規則表示:名字符合正則表示式(link?)命名規則的爬蟲不能爬取目錄/home/news/data/下的檔案

第二條規則表示:名字符合正則表示式(*)命名規則的爬蟲(即所有爬蟲)都不能爬取根目錄下的資訊

    五、程式碼實現

import re,requests
for n in range(1,80):
  url = "http://www.ygdy8.net/html/gndy/china/list_4_"+str(n)+".html"  #觀察網頁換頁規則,發現修改其中一項數字即可換頁
  html = requests.get(url)  #用get函式對url進行訪問請求
  # html.raise_for_status()  呼叫變數html作為response物件的raise_for_status方法,若響應值為200則表示請求訪問成功
  html.encoding = html.apparent_encoding  #encoding是直接獲取網頁頭部宣告的編碼方式,apparent_encoding為網頁實際編碼格式
  # print(html.text)
  # print(html.status_code)  if shuchu 200 qingqiuwuwu
  html_list = re.findall('<a href="(.*?)" class="ulink">',html.text)  #用正則表示式,匹配並提取符合規則的資訊
  # print(html_list)
  print("%d\n"%(n))
  for a in html_list:
    # html_list[a] ="http://www.ygdy8.net" + html_list[a]#[:25] + str(eval(html_list[a][25:30])+21) + html_list[a][30:]  #
    a = "http://www.ygdy8.net" + a +"?userid=0"  #d
    print(a)
    b = requests.get(a)
    b.raise_for_status()
    b.encoding = b.apparent_encoding
    # print(b.text)
    ftp = re.findall('><a href="(.*?)">ftp',b.text)
    # print(ftp)
    # print('\n')
    if ftp:  #用if過濾掉提取失敗的網頁,替代上文提到的try except 風險處理機制,然後將獲取的資料儲存起來即可
      with open(r'E:\py\dytt.txt','a',encoding ='utf-8') as cw:
        cw.write(ftp[0]+'\n'+"%d"%(n))

注:程式碼正文中並沒有加入try except異常處理機制,只在最後用if語句將可能出錯的個別連線排除。大家下去練習的時候記得加異常處理機制,這很重要。