爬蟲基礎
阿新 • • 發佈:2017-11-06
二進制 font ref 提交 解析json數據 user 網頁代碼 int query
一、爬蟲的原理
用戶獲取網絡數據的方式:
瀏覽器提交請求->下載網頁代碼->解析成頁面。而網頁代碼中便包含了我們想要的數據
爬蟲就是模擬瀏覽器發送請求,然後提取想要的數據,存放於數據庫或文件中
#1、發起請求 使用http庫向目標站點發起請求,即發送一個Request Request包含:請求頭、請求體等 #2、獲取響應內容 如果服務器能正常響應,則會得到一個Response Response包含:html,json,圖片,視頻等 #3、解析內容 解析html數據:正則表達式,第三方解析庫如Beautifulsoup,pyquery等 解析json數據:json模塊 解析二進制數據:以b的方式寫入文件#4、保存數據 數據庫 文件
二、request
1、請求方式
#1、請求方式: 常用的請求方式:GET,POST 其他請求方式:HEAD,PUT,DELETE,OPTHONS ps:用瀏覽器演示get與post的區別,(用登錄演示post) post與get請求最終都會拼接成這種形式:k1=xxx&k2=yyy&k4=zzz post請求的參數放在請求體內: 可用瀏覽器查看,存放於form data內 get請求的參數直接放在url後 #2、請求url url全稱統一資源定位符,如一個網頁文檔,一張圖片 一個視頻等都可以用url唯一來確定 url編碼 https://www.baidu.com/s?wd=圖片 圖片會被編碼(看示例代碼) 網頁的加載過程是: 加載一個網頁,通常都是先加載document文檔, 在解析document文檔的時候,遇到鏈接,則針對超鏈接發起下載圖片的請求 #3、請求頭 User-agent:請求頭中如果沒有user-agent客戶端配置, 服務端可能將你當做一個非法用戶 host cookies:cookie用來保存登錄信息 一般做爬蟲都會加上請求頭 #4、請求體 如果是get方式,請求體沒有內容 如果是post方式,請求體是format data ps: 1、登錄窗口,文件上傳等,信息都會被附加到請求體內 2、登錄,輸入錯誤的用戶名密碼,然後提交,就可以看到post,正確登錄後頁面通常會跳轉,無法捕捉到post
三、response
#1、響應狀態 200:代表成功 301:代表跳轉 404:文件不存在 403:權限 502:服務器錯誤 #2、respone header set-cookie:可能有多個,是來告訴瀏覽器,把cookie保存下來 #3、preview就是網頁源代碼 最主要的部分,包含了請求資源的內容 如網頁html,圖片 二進制數據等
示例:
import requests import re import hashlib,time # def get_index(url): # 獲取當前url的頁面內容# response=requests.get(url) # if response.status_code == 200: # return response.text # # def parse_index(res): # 匹配需要訪問的標簽 # urls=re.findall(r‘class="items".*?href="(.*?)"‘,res,re.S) # return urls # # def get_detail(urls): # 根據需要訪問的標簽匹配需要的內容標簽 # for url in urls: # if not url.startswith(‘http‘): # url=‘http://www.xiaohuar.com%s‘ %url # r1=requests.get(url) # if r1.status_code == 200: # l=re.findall(r‘id="media".*?src="(.*?)"‘,r1.text,re.S) # if l: # mp4_url=l[0] # # print(mp4_url) # save(mp4_url) # # def save(url): # 保存需要訪問的地址內容 # print(‘Download:%s‘ %url) # r2=requests.get(url) # if r2.status_code == 200: # m=hashlib.md5() # m.update(url.encode(‘utf-8‘)) # m.update(str(time.time()).encode(‘utf-8‘)) # filename=‘%s.mp4‘ %m.hexdigest() # file_path=r‘G:\\%s‘ %filename # with open(file_path,‘wb‘) as f: # f.write(r2.content) # # # def main(): # 匹配所有的頁面 # for i in range(5): # res1=get_index(‘http://www.xiaohuar.com/list-3-%s.html‘ %i) # res2=parse_index(res1) # get_detail(res2) # # # if __name__ == ‘__main__‘: # main()
爬蟲基礎