1. 程式人生 > 其它 >重試機制的實現(Guava Retry)

重試機制的實現(Guava Retry)

目錄

一、爬蟲介紹

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&region=%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()))