爬蟲基礎知識

2023-03-16 06:01:08


爬蟲是什麼?;爬蟲就是程式--->從網際網路中,各個網站上,爬取資料[前提是:你能瀏覽的頁面才能爬],做資料淨化,儲存到資料庫的過程。

爬蟲本質:模擬方式傳送http請求、然後獲取資料、再做資料淨化、最後儲存到資料庫

本篇爬蟲知識主要包括(不會一次性寫完,分好幾篇文章寫完):

  1. 模擬傳送http請求(requests模組、selenium)
  2. 反扒(封IP:IP代理、封賬號:cookie池)
  3. 解析資料(bs4)
  4. 入庫(儲存到MySQL、Redis等資料庫以及普通檔案)
  5. 爬蟲框架(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':''
}

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就不用帶cookie
"""
# 使用方法
session = requests.session()
res = session.post('網址', data=data)
res1 = session.get('網址')  # 自動保持登入狀態,自動攜帶cookie

六、requests.session的使用(可以不用帶cookie)

import requests


# 在data引數裡需要攜帶使用者名稱密碼驗證碼等基本資訊
data = {
    'username': '[email protected]',
    '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)  # 響應編碼格式

八、爬取圖片和視訊(前提是沒有做防盜鏈)

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)