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語句將可能出錯的個別連線排除。大家下去練習的時候記得加異常處理機制,這很重要。