Response響應css
import requests response = requests.get('https://baidu.com') # response響應 print(response.status_code) # 獲取響應狀態碼 print(response.url) # 獲取url地址 print(response.encoding) # 字符編碼 response.encoding = 'utf-8' print(response.text) # 獲取文本 print(response.content) # 獲取二進制流 print(response.headers) # 獲取頁面請求頭信息 print(response.history) # 上一次跳轉的地址 # 一、返回cookie字典 二、返回cookies對象 print(response.cookies) # 獲取cookies信息, print(response.cookies.get_dict()) # 獲取cookies信息轉換成字典 print(response.cookies.items()) # 獲取cookies信息轉換成字典 print(response.encoding) print(response.elapsed) # 訪問時間
import requests # 往音頻地址發送get請求 url = 'https://vd3.bdstatic.com/mda-ic4pfhh3ex32svqi/hd/mda-ic4pfhh3ex32svqi.mp4?auth_key=1557973824-0-0-bfb2e69bb5198ff65e18065d91b2b8c8&bcevod_channel=searchbox_feed&pd=wisenatural&abtest=all.mp4' response = requests.get(url, stream=True) # stream=True 把content設置爲一個迭代器對象 print(response.content) with open('love_for_GD.mp4', 'wb') as f: for content in response.iter_content(): f.write(content)
證書驗證(大部分網站都是https)python
import urllib3 import requests # 若是是ssl請求,首先檢查證書是否合法,不合法則報錯,程序終端 response = requests.get('https://www.xiaohuar.com') print(response.status_code) # 改進1:去掉報錯,可是會報警告 response = requests.get('https://www.xiaohuar.com', verify=False) # 不驗證證書,報警告,返回200 print(response.status_code) # 改進2:去掉報錯,而且去掉警報信息 urllib3.disable_warnings() # 關閉警告 response = requests.get('https://www.xiaohuar.com', verify=False) print(response.status_code) # 改進3:加上證書 # 不少網站都是https,可是不用證書也能夠訪問,大多數狀況都是能夠攜帶也能夠不攜帶證書 # 知乎\百度等都是可帶可不帶 # 有硬性要求的,則必須帶,好比對於定向的用戶,拿到證書後纔有權限訪問某個特定網站 urllib3.disable_warnings() # 關閉警告 # 僞代碼 response = requests.get( 'https://www.xiaohuar.com', # verify=False, # /path/server.crt證書的存放目錄, /path/key cert=('/path/server.crt', '/path/key')) print(response.status_code)
超時設置git
#兩種超時:float or tuple timeout=0.1 # 表明接收數據的超時時間 timeout=(0.1,0.2) # 0.1表明連接超時 0.2表明接收數據的超時時間 import requests response = requests.get('https://www.baidu.com', timeout=0.0001) print(response.elapsed) print(response.status_code)
代理設置:先發送請求給代理,而後由代理幫忙發送(封ip是常見的事情)github
import requests proxies={ # 帶用戶名密碼的代理,@符號前是用戶名與密碼 'http':'http://tank:123@localhost:9527', 'http':'http://localhost:9527', 'https':'https://localhost:9527', } response=requests.get('https://www.12306.cn', proxies=proxies) print(response.status_code)
認證設置web
import requests # 經過訪問github的api來測試 url = 'https://api.github.com/user' HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } # 測試1,失敗返回401 response = requests.get(url, headers=HEADERS) print(response.status_code) # 401 print(response.text)
打印結果:
{
"message": "Requires authentication",
"documentation_url": "https://developer.github.com/v3/users/#get-the-authenticated-user"
}chrome
#測試2,經過requests.auth內的HTTPBasicAuth進行認證,認證成功返回用戶信息 from requests.auth import HTTPBasicAuth response = requests.get(url, headers=HEADERS, auth=HTTPBasicAuth('tankjam', 'kermit46709394')) print(response.text) # # 測試3,經過requests.get請求內的auth參數默認就是HTTPBasicAuth,認證成功返回用戶信息 response = requests.get(url, headers=HEADERS, auth=('tankjam', 'kermit46709394')) print(response.text)
上傳文件api
#上傳文本文件 files1 = {'file': open('user.txt', 'rb')} # # files參數是POST請求固定參數 response = requests.post('http://httpbin.org/post', files=files1) print(response.status_code) # 200 print(response.text) # 200 # 上傳圖片文件 files2 = {'jpg': open('一拳.jpg', 'rb')} response = requests.post('http://httpbin.org/post', files=files2) print(response.status_code) # 200 print(response.text) # 200 # # 上傳視頻文件 files3 = {'movie': open('love_for_GD.mp4', 'rb')} response = requests.post('http://httpbin.org/post', files=files3) print(response.status_code) # 200 print(response.text) # 200
selenium模塊講解
一 什麼是selenium?
最初是一個自動化測試工具。可使用它幫咱們驅動瀏覽器,自動去執行某些自定義好的操做。例如在頁面中執行JS代碼、跳過登陸驗證。可使用selenium幫咱們實現爬蟲。
二 爲何要使用selenium?
一、優勢:
使用requests模塊登陸須要分析大量的複雜通訊流程,使用selenium能夠輕鬆跳過登陸驗證。
二、缺點:
瀏覽器會加載css、js、圖片、視頻...數據,爬蟲效率相比requests模塊要低。瀏覽器
# selenium之第一次 from selenium import webdriver # 用來驅動瀏覽器的 # 調用獲得一個動做鏈對象,破解滑動驗證碼的時候用的,能夠拖動圖片 from selenium.webdriver import ActionChains # 按照什麼方式查找屬性,By.ID, By.CSS_SELECTOR, By.Class from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 鍵盤按鍵操做 # 和下面WebDriverWait一塊兒用的,EC是expected_conditions的別名 from selenium.webdriver.support import expected_conditions as EC # 等待頁面加載某些元素 from selenium.webdriver.support.wait import WebDriverWait import time # 經過谷歌瀏覽器驅動打開谷歌瀏覽器 # webdriver.Chrome(r'chromedriver.exe的絕對路徑') # chrome = webdriver.Chrome(r'D:\BaiduNetdiskDownload\chromedriver_win32\chromedriver.exe') # 括號內輸入chromedriver.exe的絕對路徑 # chromedriver.exe存放於python解釋器的Scripts文件夾中 # chrome是一個驅動對象 chrome = webdriver.Chrome()
實例1cookie
# 若try出現異常 try: # 往tank博客主頁發送get請求 # chrome.get('https://www.cnblogs.com/kermitjam/') # 參數1: 驅動對象 參數2: 等待時間 wait = WebDriverWait(chrome, 10) # 一、訪問百度 chrome.get('https://www.baidu.com/') # 二、查找input輸入框 input_tag = wait.until( # 調用EC的presence_of_element_located() EC.presence_of_element_located( # 此處能夠寫一個元組 # 參數1: 查找屬性的方式 # 參數2: 屬性的名字 (By.ID, "kw") ) ) input_tag = wait.until(EC.presence_of_element_located((By.ID, "kw"))) # 三、搜索一拳超人 input_tag.send_keys('一拳超人') # 四、按鍵盤迴車鍵 input_tag.send_keys(Keys.ENTER) time.sleep(3) # 不管發生什麼都會關閉瀏覽器 finally: # 關閉瀏覽器 chrome.close()
示例二工具
try: wait = WebDriverWait(chrome, 10) chrome.get('https://www.jd.com/') input_tag = wait.until(EC.presence_of_element_located((By.ID, "key"))) input_tag.send_keys('唐詩三百首') # 根據class屬性名稱查找標籤 search_button = wait.until( EC.presence_of_element_located((By.CLASS_NAME, 'button'))) # 五、點擊搜索按鈕 search_button.click() time.sleep(3) finally: chrome.close()
隱式等待
driver = webdriver.Chrome() try: # 顯式等待: 等待某個元素加載 # 參數1: 驅動對象 參數2: 等待時間 # wait = WebDriverWait(chrome, 10) driver.get('https://china.nba.com/') # 隱式等待: 等待頁面全部元素加載 driver.implicitly_wait(10) news_tag = driver.find_element_by_class_name('nav-news') # 獲取標籤對象 print(news_tag) # 獲取標籤的名字 print(news_tag.tag_name) time.sleep(10) finally: driver.close()
基本選擇器
from selenium import webdriver # 用來驅動瀏覽器的 import time ''' ===============全部方法=================== element是查找一個標籤 elements是查找全部標籤 一、find_element_by_link_text 經過連接文本去找 二、find_element_by_id 經過id去找 三、find_element_by_class_name 四、find_element_by_partial_link_text 五、find_element_by_name 六、find_element_by_css_selector 七、find_element_by_tag_name ''' # 獲取驅動對象、 driver = webdriver.Chrome() try: # 往百度發送請求 driver.get('https://www.baidu.com/') driver.implicitly_wait(10) # 一、find_element_by_link_text 經過連接文本去找 # 根據登陸 # send_tag = driver.find_element_by_link_text('登陸') # send_tag.click() # 二、find_element_by_partial_link_text 經過局部文本查找a標籤 login_button = driver.find_element_by_partial_link_text('登') login_button.click() time.sleep(1) # 三、find_element_by_class_name 根據class屬性名查找 login_tag = driver.find_element_by_class_name('tang-pass-footerBarULogin') login_tag.click() time.sleep(1) # 四、find_element_by_name 根據name屬性查找 username = driver.find_element_by_name('userName') username.send_keys('15622792660') time.sleep(1) # 五、find_element_by_id 經過id屬性名查找 password = driver.find_element_by_id('TANGRAM__PSP_10__password') password.send_keys('*******') time.sleep(1) # 六、find_element_by_css_selector 根據屬性選擇器查找 # 根據id查找登陸按鈕 login_submit = driver.find_element_by_css_selector('#TANGRAM__PSP_10__submit') # driver.find_element_by_css_selector('.pass-button-submit') login_submit.click() # 七、find_element_by_tag_name 根據標籤名稱查找標籤 div = driver.find_element_by_tag_name('div') print(div.tag_name) time.sleep(10) finally: driver.close()