一、Requests框架:自動爬取HTML頁面與自動網絡請求提交html
二、robots.txt:網絡爬蟲排除標準python
三、BeautifulSoup框架:解析HTML頁面json
四、Re框架:正則框架,提取頁面關鍵信息小程序
五、Scrapy框架:網絡爬蟲原理介紹,專業爬蟲框架介紹服務器
#抓取百度頁面 import requests r = requests.get('http://www.baidu.com') print(r.status_code) #狀態碼,抓取成功200 r.encoding = 'utf-8' #把編碼改成utf-8 print(r.text) #輸出抓取內容
method:請求方式,對應GET\POST\PUT\HEAD\PATCH\delete\OPTIONS7種cookie
url:獲取的頁面的URL鏈接網絡
**kwargs:控制訪問的參數,共13個(可選):app
一、params:字典或字節序列,做爲參數增長到url中框架
import requests url = 'http://httpbin.org/post' payload = {'key1':'value1','key2':'value2'} r = requests.get(url, params = payload) print(r.url) #http://httpbin.org/post?key1=value1&key2=value2
二、data:字典、字節序列或文件對象,做爲Request的內容函數
三、json:JSON格式數據,做爲Request的內容
四、headers:字典,HTTP定製頭
import requests url = 'http://httpbin.org/post' payload = {'user-agent':'Chrome/10'} r = requests.request('POST',url,headers=payload) #修改agent
五、cookies:字典或CookieJar,Request中的cookie
六、auth:元組,支持HTTP認證功能
七、files:字典類型,傳輸文件
import requests url = 'http://httpbin.org/post' fs = {'file':open('data.xls','rb')} r = requests.request('POST',url,files=fs) #向頁面傳輸文件
八、timeout:設定超時時間,秒爲單位
import requests url = 'http://httpbin.org/post' r = requests.request('GET',url,timeout = 10)
九、proxies:字典類型,設定訪問代理服務器,能夠增長登陸認證
import requests url = 'http://httpbin.org/post' pxs = {'http':'http://user:pass@10.10.10.1:1234','http':'http://10.10.10.1:1234'} #設置兩個代理服務器 r = requests.request('GET',url,proxies=pxs)
十、allow_redirects:True/False,默認爲True,重定向開關
十一、stream:True/False,默認爲True,獲取內容當即下載開關
十二、verify:True/False,默認爲True,認證SSL證書開關
1三、cert:本在SSL證書路徑
url:獲取頁面的url連接
params:url中額外參數,字典或字節流格式,可選
**kwargs:12控制訪問參數,可選
一、構造一個向服務器請求資源的Request對象
二、函數返回一個包含服務器資源的Response對象
說明:Response對象
import requests response = requests.get('http://www.baidu.com') print(response.status_code) #200 print(response.encoding) #ISO-8859-1 print(response.apparent_encoding) #utf-8 response.encoding = response.apparent_encoding print(response.headers)
Response對象屬性
一、r.status_code:HTTP請求的返回狀態,200表示鏈接成功,404表示失敗或者其餘
二、r.text:HTTP響應內容的字符串形式,即url對應的頁面內容
三、r.encoding:從HTTP header中猜想的響應內容編碼方式
四、r.apparent_encoding:從內容中分析出的響應內容編碼方式(備選編碼方式)
五、r.content:HTTP響應內容的二進制形式
import requests url = 'http://www.baidu.com' r = requests.head(url) print(r.headers) print(r.text) #無輸出內容
import requests url = 'http://httpbin.org/post' payload = {'key1':'value1','key2':'value2'} r = requests.post(url, data = payload) #向URL POST一個字典,自動編碼爲form表單 print(r.text)
import requests url = 'http://httpbin.org/post' r = requests.post(url, data = 'abc') #向URL POST一個字符串,自動編碼爲data
print(r.text)
put方法與post方法同樣,區別在於put方法會把原有數據覆蓋
異常 | 說明 |
requests.ConnectionError | 網絡鏈接錯誤異常,如DNS查詢失敗、拒絕鏈接等 |
requests.HTTPError | HTTP錯誤異常 |
requests.URLRequired | URL缺失異常 |
requests.TooManyRedirects | 超過最大重定向次數,產生重定向異常 |
requests.ConnectTimeout | 鏈接運程服務超時異常 |
requests.Timeout | 請滶URL起時,產生超時異常 |
r.raise_for_status():Requests異常方法,返回200則抓取正常,若是不是200,產生異常requests.HTTPError
import requests def getHTMLText(url): try: response = requests.get(url,timeout=30) #返回Response對象 response.raise_for_status() #若是狀態不是200,則產生HTTPError異常,跳轉運行except處代碼 response.encoding = response.apparent_encoding #保證頁面編碼正確 return response.text #返回抓取內容 except: return '產生異常!' if __name__ == '__main__': url = 'http://www.baidu.com' print(getHTMLText(url))
HTTP是一個基於'請求與響應'模式的、無狀態的應用層協議;通常採用URL用爲定位網絡資源的標識。
URL格式: http:host[:port][path]
host:合法的Internet主機域名或IP地址
port:端口號,可省略,默認爲80
path:請求資源的路徑
HTTP協議對資源的操做方法
方法 | 說明 |
GET | 請求獲取URL位置資源 |
HEAD | 請求獲取URL位置資源的頭部信息 |
POST | 請求向URL位置資源後附加新的數據 |
PUT | 請求向URL位置存儲一個資源,覆蓋原URL位置資源 |
PATCH | 請求局部更新URL位置資源 |
DELETE | 請求刪除URL位置存儲的資源 |
儘管Requests庫功能很友好、開發簡單(其實除了import外只需一行主要代碼),但其性能與專業爬蟲相比仍是有必定差距的。請編寫一個小程序,「任意」找個url,測試一下成功爬取100次網頁的時間。(某些網站對於連續爬取頁面將採起屏蔽IP的策略,因此,要避開這類網站。)
import requests import time def getHTMLText(url): try: r = requests.get(url, timeout = 10) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return 'Error'
if __name__ == '__main__': url = 'http://www.bilibili.com' print('start the test:') start_time = time.clock() for i in range(100): getHTMLText(url) end_time = time.clock() print('Total runing time:%s' %(end_time-start_time)) #Total runing time:114.73649717934875
#做業 #一、爬蟲京東 import requests url = 'https://item.jd.com/2357091.html' try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding print(r.text[:1000]) print(r.request.headers) #{'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} except: print('Error') #二、爬蟲amzon import requests url = 'https://www.amazon.cn/dp/B004DCV1FO' try: kv = {'User-Agent':'Mozilla/5.0'} r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding print(r.status_code) print(r.request.headers) r = requests.get(url,headers = kv) print(r.status_code) print(r.request.headers) except: print(r.status_code) /* 200 {'User-Agent': 'python-requests/2.13.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} 200 {'User-Agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} */ #三、向百度與其360提交搜索關鍵字 import requests try: r = requests.get('http://www.baidu.com/s',params={'wd':'Python'}) print(r.request.url) #http://www.baidu.com/s?wd=Python r.raise_for_status() r.encoding = r.apparent_encoding print(len(r.text)) except: print('Error') import requests try: keyword = 'Python' kv = {'q':keyword} r = requests.get('https://www.so.com/s',params=kv) print(r.request.url) #https://www.so.com/s?q=Python r.raise_for_status() r.encoding = r.apparent_encoding print(len(r.text)) except: print('error')
#做業5查ip歸屬 import requests url = 'http://www.ip138.com/ips138.asp?ip=' try: r = requests.get(url + '114.116.113.46') r.raise_for_status() r.encoding = r.apparent_encoding print(r.text) except: print('error')
#4爬取保存圖片 import requests import os url = 'http://p1.so.qhimgs1.com/bdr/326__/t01d9dff613f7d05381.jpg' root = 'D://pics//' path = root + os.path.basename(url) #os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 #path = root + url.split('/')[-1] try: if not os.path.exists(root): #os.path.exists(path) 若是path存在,返回True;若是path不存在,返回False os.mkdir(root) if not os.path.exists(path): r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding with open(path,'wb') as f: f.write(r.content) print('文件保存成功') else: print('文件存在') except: print('爬取失敗')