1. 程式人生 > >爬蟲基礎

爬蟲基礎

二進制 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()

爬蟲基礎