1. 程式人生 > 其它 >爬蟲介紹、requests模組使用、get地址中攜帶引數、請求頭、cookie、傳送post請求模擬登陸、響應物件、編碼問題、獲取二進位制資料、解析json、ssl認證、使用代理

爬蟲介紹、requests模組使用、get地址中攜帶引數、請求頭、cookie、傳送post請求模擬登陸、響應物件、編碼問題、獲取二進位制資料、解析json、ssl認證、使用代理

今日內容概要

  • 爬蟲介紹
  • requests模組介紹,傳送get請求
  • get地址中攜帶引數
  • 攜帶請求頭
  • 攜帶cookie
  • 傳送post請求模擬登陸
  • 響應物件
  • 編碼問題(一般不會有問題)
  • 獲取二進位制資料
  • 解析json
  • ssl認證
  • 使用代理

內容詳細

1、爬蟲介紹

# 寫後臺--->前端展示資料---》瀏覽器傳送http請求,從後端伺服器獲取的--》只能從瀏覽器中看---》看到好看的東西---》儲存到本地---》存到我們自己庫中----》爬蟲


# 百度本質就是一個大爬蟲(搜尋),在輸入框中輸入搜尋內容,實際是從百度的資料庫搜尋出來的

# 百度資料庫的資料是從網際網路爬下來的
	百度這個爬蟲一刻不停的在網際網路爬資料--》爬完就存到它的庫裡(seo優化--》優化我們的網站能夠被搜尋引擎先搜到,排的很靠前)--->儘可能被百度爬蟲,並且容易搜尋到
    
    seo(免費的)和sem(充錢,把你放前面)---百度快照---》當時爬蟲爬取這個網頁這一刻,網頁的樣子---》保留這個網頁地址---》當你點選標題--》跳轉到這個網頁--》完成了你的搜尋   偽靜態


# 爬蟲的本質
	模擬傳送http請求(瀏覽器攜帶什麼,我們也要攜帶什麼)---->伺服器返回資料---》對資料進行清洗---》入庫   後續操作是別的---》分析資料--》資料分析

# 爬蟲協議:君子協議---》大家遵循這個協議,就不違法--》規定了我的網站,什麼能爬,什麼不能爬
	https://www.baidu.com/robots.txt
	https://www.cnblogs.com/robots.txt

# 爬蟲本質跟用瀏覽器訪問沒什麼區別

2、requests模組介紹,傳送get請求

# 所有語言都可以做爬蟲---》python簡單一些---》只是python庫多

# 模擬傳送http請求的庫,requests庫----》大佬基於python內建庫 urllib(麻煩) 封裝--》requests

# 安裝
	pip install requests

# 模擬傳送get請求
import requests

# 1 傳送get請求
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
print(res.text)  # 響應體的內容打印出來了

3、get地址中攜帶引數

# 2 get 請求中攜帶引數
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',
                   params={'name': 'lqz', 'age': 18}  # 會將 ?name=lqz&age=18 拼到路徑後面
                   )
print(res.text)  # 響應體的內容打印出來了



# url編碼和解碼
# https://www.baidu.com/baidu?wd=python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81
# (1)把欄位中文編碼後轉成 name=%E5%88%98%E6%B8%85%E6%94%BF&age=18
from urllib.parse import urlencode

d = {'name': '劉清政', 'age': 18}
res = urlencode(d)
print(res)  # name=%E5%88%98%E6%B8%85%E6%94%BF&age=18

# (2)只想單獨對中文編碼和解碼
from urllib.parse import quote, unquote

# 編碼
name = '劉清政'
res = quote(name)
print(res)  # %E5%88%98%E6%B8%85%E6%94%BF

# 解碼
s = 'python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81'
print(unquote(s))  # python url編碼和解碼

4、攜帶請求頭

# 3 攜帶請求頭
# 攜帶請求頭-->重要的key:
#   User-Agent:客戶端瀏覽器的型別版本資訊,作業系統版本---》django中如何取出請求頭--》META---》中介軟體--》存到資料庫--》餅形圖--》統計你們網站近一個月客戶端型別
#   referer:圖片防盜鏈 Referer: https://www.lagou.com/wn/zhaopin
# 記錄的是上一個訪問的地址---》反扒:如果上一個訪問的地址不是自己的地址,認為不是正常請求就禁止

header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
    # 'Accept-Encoding': 'gzip, deflate, br',
}
res = requests.get('https://dig.chouti.com/', headers=header)
with open('chouti.html', 'wb') as f:
    f.write(res.content)  # 將爬取的頁面資料寫入chouti.html檔案
print(res.text)

5、攜帶cookie

# 4 攜帶cookie
# 本身cookie是請求頭中的值,那麼就可以執行放在請求頭中,但是cookie經常用,也可以單獨是一個引數
# 模擬點贊
header = {
    # 請求頭
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
    # 攜帶cookie方式一:
    # 'Cookie': "_9755xjdesxxd_=32; YD00000980905869%3AWM_TID=l96GLAwE45lAEUFERRI7FydL3O2PRnm8; deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiIxN2NjOTI3Yy01ZTk5LTQ4ZTItYjcxYy1jNGYzZjRlNzQ0YWUiLCJleHBpcmUiOiIxNjI0MDMzMzQ4MzU3In0.A_zoDMD9dl-DWTHQHvqaqfETjWrtTOIaaTbSEsMXmWA; __snaker__id=Q5EBZZDnY6PYW8XM; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1650937205,1651805845; gdxidpyhxdE=lPBeo3vIhlgODippQ8rLyp1mN9%2F9dN0Bh%2Fd1YAHHmqKPAL7eIo5dGhT%5C6Bs%2BbdeDj0Bmm%2Fsu5rmAKC%5CqZc2Ru3J%2FyswELA5l6drG8SDCc4gLZ1vkkaE%2Fh0nA%5CJUhy2apWM%2Bnez3%2BaQNLB0hbmTGhvU%2Fq7mkRxpWk7fT7uj4KquGOeyjA%3A1651808005585; YD00000980905869%3AWM_NI=7ath5ozFgWjeycGOnrWcCCFiL3SFzKPqqqXWXjLZ95ZUSG8bIOdcrbZIeG9opeqMKc46feYlaXfMiJdxu91sxSZqIKyhLJU6CQN4cX9p2eqP7rYpiszlQM%2BU61%2BcofTaejE%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eeacd23cafae8e94b374abb88ba3c44b868f8fadd54f9a96e583d54f9095ad92dc2af0fea7c3b92af5bfbc89b865ba9aa9b8e96fbbbd89b0ed7a95bd8da4c56390ed9da7f94194afbf92db5d9cb684bbbc3f9a8b9da8bb6a8b91ac84f16a9a97aba8bc65b4bbbfaeca69f8eaaa86dc68a388aaaeec42a8a8bbdab479bc8d9692cc41bbb884abd83e818f82d5e254fbb0fe86f45cf5ae9791ec79bab49faeaa5ff6efe584ee6e98bfab8bc837e2a3; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNTMyMDcwNzg0NjAiLCJleHBpcmUiOiIxNjU0Mzk5MjE5NTgzIn0.ReQWb6UHc3ldnj13w5rSAWdbSrPORHQtNSyc0yKk2Ac; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1651807221"
}

data = {
    'linkId': '34934736'
}
# res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header)
# 攜帶cookie方式二:
res = requests.post('https://dig.chouti.com/link/vote', data=data, headers=header, cookies={'key': 'value'})
print(res.text)

6、傳送post請求模擬登陸

# 5  模擬登陸某網站
# data = {
#     'username': '[email protected]',
#     'password': 'lqz123',
#     'captcha': 'kyca',
#     '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就可以模擬登陸後操作
#
# res2 = requests.get('http://www.aa7a.cn/', cookies=res.cookies)
# print('[email protected]' in res2.text)  # True


# # 每次都要手動攜帶cookie,麻煩,使用requests提供的session 方法
session = requests.session()

# 以後需所有請求都用session物件傳送,不需要手動處理cookie
data = {
    'username': '[email protected]',
    'password': 'lqz123',
    'captcha': 'kyca',
    'remember': 1,
    'ref': 'http://www.aa7a.cn/',
    'act': 'act_login',
}
res = session.post('http://www.aa7a.cn/user.php', data=data)
print(res.text)
print(res.cookies)  # 登陸成功返回的cookie,這個cookie是登陸過後的,以後拿著這個cookie就可以模擬登陸後操作

res2 = session.get('http://www.aa7a.cn/')
print('[email protected]' in res2.text)  # True

7、響應物件

# 6 響應物件
import requests

respone = requests.get('http://www.jianshu.com')
# respone屬性
print(respone.text)  # 返回響應體的文字內容
print(respone.content)  # 返回響應體的二進位制內容

print(respone.status_code)  # 響應狀態碼
print(respone.headers)  # 響應頭
print(respone.cookies)  # 響應的cookie
print(respone.cookies.get_dict())  # 響應的cookie轉成字典
print(respone.cookies.items())

print(respone.url)  # 請求地址
print(respone.history)  # 瞭解---》如果有重定向,列表,放著重定向之前的地址

print(respone.encoding)  # 頁面的編碼方式:utf-8   gbk
# response.iter_content()  # content迭代取出content二進位制內容,一般用它存檔案

8、編碼問題(一般不會有問題)

# 請求回來的資料,res.text 列印的時候亂碼 ,因為沒有指定編碼,預設用utf-8 編碼

# 解決
	response.encoding='gbk'

9、獲取二進位制資料

# 7 下載二進位制
header = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}

res = requests.get('https://tva1.sinaimg.cn/mw2000/9d52c073gy1h1v6lmny8nj20j60pjtdh.jpg', headers=header)
with open('mv.jpg', 'wb') as f:
    # f.write(res.content)  小檔案情況可以
    for line in res.iter_content(100):
        f.write(line)  # 大檔案情況 節省記憶體

10、解析json格式資料

# 8 json格式解析
# 爬取的地址 返回的資料是json格式
import json

data = {
    'cname': '',
    'pid': '',
    'keyword': '上海',
    'pageIndex': 1,
    'pageSize': 10,
}

# res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword', data=data)
# j = json.loads(res.text)
# print(j['Table'][0]['rowcount'])  # 返回值是列表套字典 索引取值

res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword', data=data).json()
print(res['Table'][0]['rowcount'])  # 結果一樣 程式碼更簡潔

11、ssl認證

# 之前網站,有些沒有認證過的ssl證書,我們訪問需要手動攜帶證書

# 跳過證書直接訪問
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不驗證證書,報警告,返回200
print(respone.status_code)
# 手動攜帶
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

12、使用代理

# 爬蟲,速度很快,超過頻率限制---》使用代理,切換ip---》封ip封的也是代理的ip,我的ip沒問題


# 9 使用代理
# 收費的(花錢),免費的(不穩定)
# 也自己搭建代理池---》爬一堆免費代理,放到你的本地,每次隨機出一個代理用

# 透明和高匿--》透明是否能夠看到哪個ip地址使用了代理

proxies = {
    'http': '39.103.217.44:59886',  # http或https代理
}
respone = requests.get('https://www.baidu.com', proxies=proxies)

print(respone.status_code)  # 200 返回200 代表代理成功




# 作業:網上有一個python開源的代理池---》自己搭建起來https://github.com/jhao104/proxy_pool
# 作業:寫個django,使用者訪問就返回使用者的ip地址--》放到公網上,用manage.py跑起來---》訪問
# 客戶端使用request加代理訪問你的django,驗證代理是否使用成功