1. 程式人生 > >爬蟲(二)—— 爬蟲常見操作

爬蟲(二)—— 爬蟲常見操作

改進 .cn cti 終端 ram redirect arch tuple 格式

目錄

  • 爬蟲中常見操作
    • 一、requests的用法
      • 1、常見方法
      • 2、session方法
      • 3、其他方法
    • 二、指定響應體編碼
    • 三、分段獲取數據
    • 四、SSL Cert Verification
    • 五、使用代理
    • 六、超時設置
    • 七、捕獲異常
    • 八、上傳文件

爬蟲中常見操作

一、requests的用法

1、常見方法

(1)params

直接將參數放在 params中 會自動進行url編碼

response =  requests.get(url,headers=headers,params={"wd":kwd})

# 添加數據到請求頭中
 response =  requests.get(url,headers={
     # 把數據加在這裏
 },params={"wd":kwd})

(2)post方法

其他參數與get一致,請求體放在data中

 # 返回值的處理
 response =  requests.get(url,headers=headers,params={"wd":kwd})
 print(response.status_code) # 狀態碼
 print(response.text) # 將結果以文本的形式返回
 response.content # 將結果以二進制的方式返回
 response.json() # 將數據直接反序列化得到字典或是列表

2、session方法

該方法自動保存和提交 cookie

import requests
# 創建session對象
session = requests.session()
res = session.get("https://github.com/login",headers={
    "Referer": "https://github.com/",
    "User-Agent": user_agent
})

token = re.search(‘name="authenticity_token" value="(.*?)"‘,res.text).group(1)

res2 = session.post("https://github.com/session",
                     headers = {
                         "Referer": "https://github.com/login",
                         "User-Agent": user_agent},
                     data={
                         "commit": "Sign in",
                         "utf8": "?",
                         "authenticity_token": token,
                         "login": "xxxxxx",
                         "password": "xxxxxxxxx"},
                     allow_redirects = False
                     )

3、其他方法

response = requests.get(‘https://www.baidu.com‘)
print(response.text)   # 返回文本內容
print(response.content)   # 返回二進制數據
print(response.json())    # 反序列化,只能在返回數據為json格式時使用
print(response.history)  # 獲取 重定向的所有連接歷史
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.url)
print(respone.history) # 重定向歷史
print(respone.encoding) # 響應體編碼方式

二、指定響應體編碼

import requests
response=requests.get(‘http://www.autohome.com/news‘)
response.encoding = "GBK"
print(response.text)
print(response.encoding)

三、分段獲取數據

# 當響應體數據太大的時候一次性獲取所有可能造成內存溢出
# 可以使用iter_content 分段獲取數據,
# chunk_size指定每次獲取的長度,
# decode_unicode 是否進行解碼 通常為false

from contextlib import closing
with closing(requests.get(‘xxx‘,stream=True)) as response:
    for line in response.iter_content(chunk_size=1024,decode_unicode=False):
        print(line)

四、SSL Cert Verification

# 證書驗證(大部分網站都是https)
import requests
respone=requests.get(‘https://www.12306.cn‘) # 如果是ssl請求,首先檢查證書是否合法,不合法則報錯,程序終端


# 改進1:去掉報錯,但是會報警告
import requests
respone=requests.get(‘https://www.12306.cn‘,verify=False) #不驗證證書,報警告,返回200
print(respone.status_code)


# 改進2:去掉報錯,並且去掉警報信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #關閉警告
respone=requests.get(‘https://www.12306.cn‘,verify=False)
print(respone.status_code)

# 改進3:加上證書
# 很多網站都是https,但是不用證書也可以訪問,大多數情況都是可以攜帶也可以不攜帶證書
# 知乎\百度等都是可帶可不帶
# 有硬性要求的,則必須帶,比如對於定向的用戶,拿到證書後才有權限訪問某個特定網站
import requests
respone=requests.get(‘https://www.12306.cn‘,
                     cert=(‘/path/server.crt‘,
                           ‘/path/key‘))
print(respone.status_code)

五、使用代理

# 官網鏈接: http://docs.python-requests.org/en/master/user/advanced/#proxies

# 代理設置:先發送請求給代理,然後由代理幫忙發送(封ip是常見的事情)
import requests
proxies={
    ‘http‘:‘http://112.98.126.100:8118‘,#帶用戶名密碼的代理,@符號前是用戶名與密碼
    ‘https‘:‘https://124.42.68.152:90‘,
}
respone=requests.get(‘https://www.baidu.com‘,proxies=proxies)

print(respone.status_code)



# 支持socks代理,安裝:pip install requests[socks]
import requests
proxies = {
    ‘http‘: ‘socks5://user:pass@host:port‘,
    ‘https‘: ‘socks5://user:pass@host:port‘
}
respone=requests.get(‘https://www.12306.cn‘,
                     proxies=proxies)

print(respone.status_code)

六、超時設置

# 超時設置
# 兩種超時:float or tuple
# timeout=0.1 #代表接收數據的超時時間
# timeout=(0.1,0.2)#0.1代表鏈接超時  0.2代表接收數據的超時時間

import requests
respone=requests.get(‘https://www.baidu.com‘,timeout=0.0001)

七、捕獲異常

#異常處理
import requests
from requests.exceptions import * #可以查看requests.exceptions獲取異常類型

try:
    r=requests.get(‘http://www.baidu.com‘,timeout=0.00001)
except ReadTimeout:
    print(‘===:‘)
# except ConnectionError: # 鏈接失敗
#     print(‘-----‘)
# except Timeout: # 超時
#     print(‘aaaaa‘)

except RequestException: # 其他異常
    print(‘Error‘)

八、上傳文件

import requests
files={‘file‘:open(‘a.jpg‘,‘rb‘)} # value為文件對象
respone=requests.post(‘http://httpbin.org/post‘,files=files)
print(respone.status_code)

爬蟲(二)—— 爬蟲常見操作