(一)爬蟲需要的庫和框架:
(二)爬蟲的限制:
1,Robots協議概述:
網站擁有者可以在網站根目錄下建立robots.txt文件,User-agent:定義不能訪問者;Disallow定義不可以爬取的目錄
例如:http://www.baidu.com/robots.txt的部分內容:
//不允許Baiduspider訪問如下目錄 User-agent: Baiduspider Disallow: /baidu Disallow: /s? Disallow: /ulink? Disallow: /link? Disallow: /home/news/data/ Disallow: /bh //不允許Googlebot訪問如下目錄 User-agent: Googlebot Disallow: /baidu Disallow: /s? Disallow: /shifen/ Disallow: /homepage/ Disallow: /cpro Disallow: /ulink? Disallow: /link? Disallow: /home/news/data/ Disallow: /bh
2,Robots協議的使用:爬蟲要求,類人行為爬蟲可以不用遵守robots協議
(三)使用Requests庫:
1,安裝命令:pip install requests
2,測試
import requests; r=requests.get("http://www.baidu.com") print(r.status_code)
#如果requests庫安裝成功,則打印200
r.encoding='utf-8'
r.text #打印網頁內容
常見方法:
1,requests.request()方法:
1, 第三個參數使用params=xx,將數據添加到url后面
2,第三個參數使用data=xxx,將數據賦值到內容
3,第三個參數使用json=xx,將內容賦值到json
4,第三個參數使用headers=字典類型數據;可以修改網頁headers的屬性值
5,第三個參數使用timeout=n,設置訪問時間,當訪問超時則報異常
6,第三個參數使用proxies=xx,設置訪問的代理服務器(xx為字典數據,可以存放http或https代理),可以有效隱藏爬蟲原IP,可以有效防止爬蟲逆追蹤
例一:
例二:第三參數使用data=xxx,將數據賦值到內容
import requests; from _socket import timeout #from aifc import data def getHTMLText(url): try: r=requests.get(url,timeout=30) r.raise_for_status() #如果連接狀態不是200,則引發HTTPError異常 r.encoding=r.apparent_encoding #使返回的編碼正常 print("連接成功") return r.status_code except: print("連接異常") return r.status_code url="http://httpbin.org/" if getHTMLText(url)==200: payData={'name;':'zs',"sex":"man"}; r=requests.request("POST",url+"post",data=payData) #第一個參數賦什么值,第二個參數在url后就添加什么參數 print(r.text)
運行截圖:
2,requests.get()方法:**kwargs是request方法中除了params外的其他12個參數(最常用的方法)
r.encoding:當連接的網頁的<head>標簽沒有charset屬性,則認為編碼為ISO-8859-1
當連接失敗時:
拋出異常方法:
#判斷url是否可以正常連接的通用方法: def getHTMLText(url): try: r=requests.get(url,timeout=30) r.raise_for_status() #如果連接狀態不是200,則引發HTTPError異常 r.encoding=r.apparent_encoding #使返回的編碼正常 return r.text except: return "連接異常"
3,requests.head()方法:
4,requests.post()方法:
5,requests.put()方法:
6,requests.patch()方法:
7,requests.delete()方法:
8,HTTP協議:
(四)爬取網站數據案例;
例一:爬取起點某小說某章節
import requests; from _socket import timeout #from aifc import data def getHTMLText(url): try: r=requests.get(url,timeout=30) r.raise_for_status() #如果連接狀態不是200,則引發HTTPError異常 r.encoding=r.apparent_encoding #使返回的編碼正常 print("連接成功") return r.status_code except: print("連接異常") return r.status_code url="https://read.qidian.com/chapter/z4HnwebpkxdqqtWmhQLkJA2/pYlct39tiiVOBDFlr9quQA2" access={"user-agent":"Mozilla/5.0"} #設置訪問網站為瀏覽器Mozilla5.0 if getHTMLText(url)==200: #pst={"http":"http://user:pass@10.10.10.1:1234","https":"https://10.10.10.1:4321"} #設置代理 r=requests.get(url,headers=access) #訪問網站設置代理服務器 #r.encoding="utf-8" print(r.request.headers) #獲取頭部信息
print(r.text[2050:3000])
截圖:
例二:保存網上各種格式文件到本地:
import os import requests url="http://a3.att.hudong.com/53/88/01200000023787136831885695277.jpg" #可以是圖片,音樂,視頻等的網上地址 access={"user-agent":"Mozilla/5.0"} file="D://picture//" #定義圖片保存的本地文件 path=file+url.split("/")[-1] print(path) try: if not os.path.exists(file): #如果不存在目錄D://picture就新建 os.mkdir(file) if not os.path.exists(path): r=requests.get(url,headers=access) with open(path,"wb") as f: #打開文件path作為f; f.write(r.content) #r.content:爬取的文件的二進制形式 f.close() print("圖片保存成功") else: print("文件已保存") except: print("爬取失敗")
例三: