重試機制的實現(Guava Retry)
阿新 • • 發佈:2022-12-02
目錄
- 一、爬蟲介紹
- 二、requests模組傳送get請求
- 三、get請求攜帶引數
- 四、url編碼和解碼
- 五、攜帶請求頭
- 六、攜帶cookie
- 七、傳送post請求
- 八、響應Response
- 九、獲取二進位制資料
- 十、解析解析json
一、爬蟲介紹
1.名字解釋
爬蟲:spider,網路蜘蛛
2.本質原理
- 現在的所有軟體原理:大部分都是
基於http請求傳送和獲取請求
- pc端的網頁
- 移動端的app
-
模擬傳送http請求
,從別人的服務端獲取資料 - 怎麼繞開反扒:不同程式的反扒措施不一樣,比較複雜,具體情況具體分析
3.爬蟲原理
- 傳送http請求【requests,selenium】
- 》》》 第三方服務端
- 》》》服務端響應的資料解析出想要的資料【selenium,b64】
- 》》》 入庫(檔案、資料庫、Excel、Redis、MongoDB等等)
- scrapy:專業的爬蟲框架
4.爬蟲是否合法
-
爬蟲其實算是擦邊的行為,遵守規則的爬,不會違法。(在這裡忠告各位玩家,一定要做遵紀守法的好公民,牢飯不香,縫紉機不好踩。)
-
那麼爬蟲的規則是什麼呢?>>> 爬蟲協議
-
爬蟲協議:每個網站的根路徑下都有
robots.txt
,這個檔案規定了:該網站能爬的和不能爬的資料
5.百度其實就是個大爬蟲
- 在百度的搜尋框中輸入搜尋內容,回車後返回的資料,是百度資料庫中的資料
- 而百度,其實在一刻不停的在網際網路中爬取各個頁面,連結地址>>>爬到的資料儲存到自己的資料庫
- 點選之後,跳轉到真正的地址上去
- 核心:搜尋,在海量資料中搜索出想要的資料
-
SEO:免費的搜尋,排名靠前
- 也叫:搜尋引擎優化、關鍵詞自然排名。
-
通過對站內和站外的優化
來提高搜尋引擎對網站的友好度,並提高網站的排名
-
SEM:花錢買關鍵字
- 也叫:搜尋引擎營銷
- 除了對網站做優化以外,也可以用便捷的途徑來更快的讓客戶找到你的網站,這種便捷的方式就是
通過付費的手段
。
二、requests模組傳送get請求
1.requests模組
-
模擬傳送http請求的模組
-
不僅爬蟲用它,後期呼叫第三方介面,也會用到它
-
可以做長連結短連結的轉換
2.下載requests模組
-
pip3 install requests
-
本質是封裝了內建模組urlib3
-
import requests res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html') print(res.text) # 響應體中的文字內容 print(res.__dict__.keys()) ''' dict_keys([ '_content', '_content_consumed', '_next', 'status_code', 'headers', 'raw', 'url', 'encoding','history', 'reason', 'cookies', 'elapsed', 'request', 'connection' ]) '''
三、get請求攜帶引數
1.位址列中拼接
-
res=requests.get('https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3') print(res.text)
2.使用params引數攜帶
-
res = requests.get('https://www.baidu.com/s', params={ 'wd': '美女', 'name': 'lqz' }) print(res.text)
四、url編碼和解碼
-
‘美女’被編碼後 >>> E7%BE%8E%E5%A5%B3
-
from urllib import parse res = parse.quote('美女') print(res) # E7%BE%8E%E5%A5%B3 res = parse.unquote('%E7%BE%8E%E5%A5%B3') print(res) # 美女
五、攜帶請求頭
1.前提
http請求,有請求頭,有些網站就是通過請求頭來做反扒
2.情況:爬取某個網站,不能正常返回 >>> 說明請求模擬的不像
-
User-Agent:
- 客戶端型別:瀏覽器,手機端瀏覽器,爬蟲類型,程式,scrapy。一般偽造成瀏覽器。
-
referer:上次訪問的地址
- Referer:https://www.lagou.com/gongsi/
- 如果要登入,模擬向登入介面傳送請求
- 正常操作:必須在登入頁面上才能幹這事
- 如果沒有攜帶referer,網站就會認為你是惡意的,拒絕掉
- 圖片防盜鏈
-
cookie:認證後的cookie,就相當於登入了
-
header
# header={ # # 客戶端型別 # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' # } # res=requests.get('https://dig.chouti.com/',headers=header) # print(res.text
六、攜帶cookie
# 4 請求中攜帶cookie#
## 方式一:直接帶在請求頭中
#模擬點贊
# data={
# 'linkId':'36996038'
# }
# header={
# # 客戶端型別
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
# #攜帶cookie
# 'Cookie':'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiI3MzAyZDQ5Yy1mMmUwLTRkZGItOTZlZi1hZGFmZTkwMDBhMTEiLCJleHBpcmUiOiIxNjYxNjU0MjYwNDk4In0.4Y4LLlAEWzBuPRK2_z7mBqz4Tw5h1WeqibvkBG6GM3I; __snaker__id=ozS67xizRqJGq819; YD00000980905869%3AWM_TID=M%2BzgJgGYDW5FVFVAVQbFGXQ654xCRHj8; _9755xjdesxxd_=32; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1666756750,1669172745; gdxidpyhxdE=W7WrUDABQTf1nd8a6mtt5TQ1fz0brhRweB%5CEJfQeiU61%5C1WnXIUkZH%2FrE4GnKkGDX767Jhco%2B7xUMCiiSlj4h%2BRqcaNohAkeHsmj3GCp2%2Fcj4HmXsMVPPGClgf5AbhAiztHgnbAz1Xt%5CIW9DMZ6nLg9QSBQbbeJSBiUGK1RxzomMYSU5%3A1669174630494; YD00000980905869%3AWM_NI=OP403nvDkmWQPgvYedeJvYJTN18%2FWgzQ2wM3g3aA3Xov4UKwq1bx3njEg2pVCcbCfP9dl1RnAZm5b9KL2cYY9eA0DkeJo1zfCWViwVZUm303JyNdJVAEOJ1%2FH%2BJFZxYgMVI%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee92bb45a398f8d1b34ab5a88bb7c54e839b8aacc1528bb8ad89d45cb48ae1aac22af0fea7c3b92a8d90fcd1b266b69ca58ed65b94b9babae870a796babac9608eeff8d0d66dba8ffe98d039a5edafa2b254adaafcb6ca7db3efae99b266aa9ba9d3f35e81bdaea4e55cfbbca4d2d1668386a3d6e1338994fe84dc53fbbb8fd1c761a796a1d2f96e81899a8af65e9a8ba3d4b3398aa78285c95e839b81abb4258cf586a7d9749bb983b7cc37e2a3; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNTMyMDcwNzg0NjAiLCJleHBpcmUiOiIxNjcxNzY1NzQ3NjczIn0.50e-ROweqV0uSd3-Og9L7eY5sAemPZOK_hRhmAzsQUk; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1669173865'
# }
# res=requests.post('https://dig.chouti.com/link/vote',data=data,headers=header)
# print(res.text)
## 方式二:通過cookie引數:因為cookie很特殊,一般都需要攜帶,模組把cookie單獨抽取成一個引數,是字典型別,以後可以通過引數傳入
data={
'linkId':'36996038'
}
header={
# 客戶端型別
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
}
res=requests.post('https://dig.chouti.com/link/vote',data=data,headers=header,cookies={'key':'value'})
print(res.text)
# 部署專案出現的可能的問題
-路徑問題:ngxin,uwsgi。。。
-資料庫使用者名稱密碼問題
-前端傳送ajax請求問題
-瀏覽器中訪問一下banner介面
-nginx 8080
-安全組 80 8080 3306
-轉到uwsgi的8888,檢視類
-虛擬環境真實環境都要裝uwsgi
-啟動uwsgi是在虛擬環境中啟動的
七、傳送post請求
###6 傳送post請求
# data = {
# 'username': '[email protected]',
# 'password': 'lqz123',
# 'captcha': 'cccc',
# 'remember': 1,
# 'ref': 'http://www.aa7a.cn/',
# 'act': 'act_login'
# }
# res = requests.post('http://www.aa7a.cn/user.php', data=data)
# print(res.text)
# print(res.cookies) # 響應頭中得cookie,如果正常登入,這個cookie 就是登入後的cookie RequestsCookieJar:當成字典
#
# # 訪問首頁,攜帶cookie,
# # res2 = requests.get('http://www.aa7a.cn/', cookies=res.cookies)
# res2 = requests.get('http://www.aa7a.cn/')
# print('[email protected]' in res2.text)
## 6.2 post請求攜帶資料 data={} ,json={} drf後端,列印 request.data
# data=字典是使用預設編碼格式:urlencoded
# json=字典是使用json 編碼格式
# res = requests.post('http://www.aa7a.cn/user.php', json={})
## 6.4 request.session的使用:當request使用,但是它能自動維護cookie
# session=requests.session()
# data = {
# 'username': '[email protected]',
# 'password': 'lqz123',
# 'captcha': 'cccc',
# 'remember': 1,
# 'ref': 'http://www.aa7a.cn/',
# 'act': 'act_login'
# }
# res = session.post('http://www.aa7a.cn/user.php', data=data)
# res2 = session.get('http://www.aa7a.cn/')
# print('[email protected]' in res2.text)
八、響應Response
# Response物件,有很多屬性和方法
-text
-cookies
import requests
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
}
respone = requests.get('https://www.jianshu.com', params={'name': 'lqz', 'age': 19},headers=header)
# respone屬性
print(respone.text) # 響應體的文字內容
print(respone.content) # 響應體的二進位制內容
print(respone.status_code) # 響應狀態碼
print(respone.headers) # 響應頭
print(respone.cookies) # 響應cookie
print(respone.cookies.get_dict()) # cookieJar物件,獲得到真正的欄位
print(respone.cookies.items()) # 獲得cookie的所有key和value值
print(respone.url) # 請求地址
print(respone.history) # 訪問這個地址,可能會重定向,放了它衝定向的地址
print(respone.encoding) # 頁面編碼
九、獲取二進位制資料
###8 獲取二進位制資料 :圖片,視訊
#
# res = requests.get(
# 'https://upload.jianshu.io/admin_banners/web_images/5067/5c739c1fd87cbe1352a16f575d2df32a43bea438.jpg')
# with open('美女.jpg', 'wb') as f:
# f.write(res.content)
# 一段一段寫
res=requests.get('https://vd3.bdstatic.com/mda-mk21ctb1n2ke6m6m/sc/cae_h264/1635901956459502309/mda-mk21ctb1n2ke6m6m.mp4')
with open('美女.mp4', 'wb') as f:
for line in res.iter_content():
f.write(line)
十、解析解析json
# 前後分離後,後端給的資料,都是json格式,
# 解析json格式
res = requests.get(
'https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json')
print(res.text)
print(type(res.text))
print(res.json()['results'][0]['name'])
print(type(res.json()))