目錄
爬蟲是什麼?;爬蟲就是程式--->從網際網路中,各個網站上,爬取資料【前提是:你能瀏覽的頁面才能爬】,做資料清洗,儲存到資料庫的過程。
爬蟲本質:模擬方式傳送http請求、然後獲取資料、再做資料清洗、最後儲存到資料庫
爬蟲的重點:如何傳送http請求?如何解析資料?
本篇爬蟲知識主要包括(不會一次性寫完,分好幾篇文章寫完):
- 模擬傳送http請求(requests模組、selenium)
- 反扒(封IP:IP代理、封賬號:cookie池)
- 解析資料(bs4)
- 入庫(儲存到MySQL、Redis等資料庫以及普通檔案)
- 爬蟲框架(scrapy)
一、requests模組
使用python為什麼能傳送http請求,原因是該模組封裝了Python內建模組urllib(起之前用到的urllib,requests模組的api更加便捷,本質就是封裝了urllib3)
安裝模組
pip install requests
基本使用
import requests
res = requests.get('網址') # 獲取資料傳送get請求
print(res.text) # text 引數可以列印出頁面HTML程式碼
二、requests攜帶引數的方式
第一:直接在URL後面英文問號拼引數
res = requests.get('網址')
第二:使用params引數(其實最後效果跟第一種方式一樣)
res = requests.get('網址',params={'name':'mire','age':18})
三、get請求URL解碼編碼
import requests
from urllib.parse import quote, unquote
res = requests.get('網址', params={'name': '阿麗米熱', 'age': 18})
print(res.url) # https://www.cnblogs.com/almira998/p/17208674.html?name=%E9%98%BF%E4%B8%BD%E7%B1%B3%E7%83%AD&age=18
"""
我們平時在瀏覽器上搜關鍵字,有時候當前網址後面拼搜尋關鍵字但是其已經url編碼的具體樣子如下
https://www.cnblogs.com/almira998/p/17208674.html?name=%E9%98%BF%E4%B8%BD%E7%B1%B3%E7%83%AD&age=18
怎麼樣?是不是很眼熟啊,這就是url編碼後的效果
"""
'''
那麼我們可以研究下如編碼和解碼
首先要匯入模組 from urllib.parse import quote, unquote
quote:代表編碼
unquote:代表解碼
'''
# 演示一下編碼和解碼
res = quote('阿麗米熱')
print(res) # %E9%98%BF%E4%B8%BD%E7%B1%B3%E7%83%AD
res1 = unquote('%E9%98%BF%E4%B8%BD%E7%B1%B3%E7%83%AD')
print(res1) # 阿麗米熱
四、post請求攜帶資料編碼格式
import requests
# data對應字典,這樣寫,編碼方式是urlencoded
requests.post(url='xxxxxxxx',data={'xxx':'yyy'})
# json對應字典,這樣寫,編碼方式是json格式
requests.post(url='xxxxxxxx',json={'xxx':'yyy'})
# 終極方案,編碼就是json格式
requests.post(url='',
data={'':1,},
headers={
'content-type':'application/json'
})
五、get請求攜帶請求頭
# (反爬蟲措施之一)
Connection: keep-alive # 該引數的作用保持連結狀態,因為http協議本質是基於TCP協議的(無連線、無狀態)
Cookie: 很長的字串刪掉; # 帶著cookie就可以信任為登入狀態,請求比較容易成功
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.3 # 表示客戶端的型別 比如作業系統瀏覽器型別等等
import requests
# 先用字典的形式包裝好
headers = {
'Connection':'keep-alive',
'Cookie':'一堆字串',
'User-Agent':''
'Referer':'上一個瀏覽的網址'
}
res = requests.get('網址', headers=headers) # headers=headers表明攜帶請求頭
print(res.text)
六、post請求攜帶引數
# 傳送post請求需要以下引數
"""
1、攜帶登入資訊(使用者名稱、密碼、驗證碼)
2、攜帶cookie
3、攜帶請求頭headers
"""
import requests
data = {
'username': '',
'password': '',
'captcha': '3456',
'remember': 1,
'ref': '網址',
'act': 'act_login'
}
headers = {
'Connection':'keep-alive',
'Cookie':'一堆字串',
'User-Agent':''
}
res = requests.get('網址', data=data, headers=headers)
print(res.text)
"""
登入一般都是post請求,需要細帶cookie
但是有些網站啊有雙token認證 嚴重影響了爬蟲的效率
requests.session() 意思就是保持對話
使用requests.session就不用帶cookie
"""
# 使用方法
session = requests.session()
res = session.post('網址', data=data)
res1 = session.get('網址') # 自動保持登入狀態,自動攜帶cookie
七、requests.session的使用(可以不用帶cookie)
import requests
# 在data引數裡需要攜帶使用者名稱密碼驗證碼等基本資訊
data = {
'username': '3014885197@qq.com',
'password': 'almira10054X',
'referer': '網址'
}
# 發post請求,引數裡面傳data引數
session = requests.session()
res = session.post('網址, data=data)
print(res.text)
八、response物件
# Response相應物件的屬性和方法
import requests
headers = {
'User-Agent': '一些pc和瀏覽器配置資訊'
}
respone=requests.get('網址',headers=headers)
# respone屬性
print(respone.text) # 響應體轉成了字串
print(respone.content) # 響應體的二進位制內容
print(respone.status_code) # 響應狀態碼
print(respone.headers) # 響應頭
print(respone.cookies) # cookie是在響應頭,cookie很重要,它單獨做成了一個屬性
print(respone.cookies.get_dict()) # cookieJar物件---》轉成欄位
print(respone.cookies.items()) # cookie的鍵值對
print(respone.url) # 請求地址
print(respone.history) # 不用關注
print(respone.encoding) # 響應編碼格式
九、爬取圖片和影片
如果帶reference引數就不用擔心爬不下來
(簡單操作有前提:沒有做防盜鏈)
import requests
url = '網址'
res = requests.get(url)
with open('狗.jpg', 'wb') as f:
for line in res.iter_content():
f.write(line)
url = '網址'
res1 = requests.get(url)
with open('影片.mp4', 'wb') as f:
for line in res1.iter_content():
f.write(line)