1. 程式人生 > >[爬蟲小記] 優秀的requests模組

[爬蟲小記] 優秀的requests模組

前言

    除了當初學習爬蟲的時候用過urllib、urllib2,後來再沒用過了。都是使用的requests,本文將記錄一直以來個人使用  requests的經驗總結。

正文

    import requests
    r = requests.get('http://www.baidu.com')

    print(r.status_code)  #200  獲取狀態碼

    print(r.text)     #常用,獲取Unicode形式的response,預設以utf8解碼為Unicode

    print(r.content)    #獲取位元組形式的response,可供編碼檢測

    print(chardet.detect(r.content))  #編碼由原網頁決定,這裡的檢測只是一定概率正確

    # 如果r.text輸出有亂碼,說明網站非utf8編碼,需修改response編碼
    r.encoding = 'gbk'  # gbk , gb18030 等

    myparams = {'name': 'lei', 'age': 222}
    #這個引數會以明文方式直接填充到url中:http://www.baidu.com/?age=222&name=lei
    #它是http請求中的QueryString
    requests.get('http://www.baidu.com',params=myparams)

    #data引數在post中傳遞表單,不會填充在url中,是http請求的body
    requests.post('http://www.baidu.com', data={'name': 'lei', 'age': 222})

    #上傳檔案
    with open(r'c:\words_v1.txt')as f:
        _file = {'file': f}
        requests.post('http://www.baidu.com', files=_file)

    #傳入cookie (官方的寫法較複雜,不必採用)
    requests.get('http://www.baidu.com',headers={'Cookie':'PSTM=1525659528;
                                                    BD_UPN=12314753;'})

    #取消ssl驗證以訪問https站點
    requests.get('https://www.baidu.com', verify=False)

    #代理使用
    _list = ["http://41.118.132.69:4433", "http://51.228.12.69:4423"]
    for i in _list:
        p = {'http': i}
        r = requests.get('https://www.baidu.com', proxies=p)
        if r.status_code == 200:
            # do something
            break

    #下載檔案 ,iter_count 限制每次下載的位元組數,逐塊寫入
    with open(r'xx.png', 'wb')as f:
        for c in requests.get('http://xxx.com', stream=True).iter_content(1024):
            f.write(c)

    #保持會話 ,常用在模擬登入、登入以訪問資源等情況
    s = requests.session()  #Session() 一樣
    #s 與直接用requests的大部分用法一致,如get post

    UA = {'User-Agent':'xxx'}
    s.headers = UA    #或  s.headers.update(UA)

    #傳入cookie
    dict_cookie = dict(a='123', b='321')
    requests.utils.add_dict_to_cookiejar(s.cookies, dict_cookie)
    # 實際操作時這種方式也複雜,我們想要的是從瀏覽器中複製整個cookie字串
    # 到python程式碼中直接使用,而無需修改為字典形式,參見下面的方式

    #傳入cookie 方式二
    s.get('http://www.baidu.com', headers={'Cookie': 'PSTM=1525659528;
                                            BD_UPN=12314753;'})

    #持久化cookie
    import json
    with open('cookie.txt', 'wb') as f:
        cookie = s.cookies.get_dict()
        json.dump(cookie, f)

    #從檔案載入cookie
    with open('cookie.txt') as f:
        cookie = json.load(f)
        s.cookies.update(cookie)

有高見請留言。

 

宣告:本文章為個人對技術的理解與總結,不能保證毫無瑕疵,接收網友的斧正。