python_爬蟲基礎

字母一哥發表於2024-07-30

python爬蟲基礎

1、初識爬蟲

1.rebots協議

網站透過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取,但它僅僅是網際網路中的約定而已,可以不用遵守。例如:https://www.taobao.com/robots.txt

2.谷歌瀏覽器外掛

● XPath Helper
● Web Scraper
● Toggle JavaScript
● User-Agent Switcher for Chrome
● EditThisCookie
● SwitchySharp

外掛下載地址:

  1. https://extfans.com/
  2. https://chrome.zzzmh.cn/#/index
    安裝步驟:
    1、在應用商店下載好外掛後解壓縮,直接拖進去就可以啦:

3.requests傳送網路請求以及常用屬性

需求:透過requests向百度首頁傳送請求,獲取百度首頁資料

import requests

url = "https://www.baidu.com"

response = requests.get(url=url)

print("---狀態碼如下---")
print(response.status_code)

print("---bytes型別資料:---")
print(response.content)

print("---str型別資料---")
print(response.text)

print("---str型別資料(utf-8)---")
print(response.content.decode("utf-8"))

常用屬性如下:
● response.text 響應體str型別
● respones.content 響應體bytes型別
● response.status_code 響應狀態碼
● response.request.headers 響應對應的請求頭
● response.headers 響應頭
● response.request.headers.get('cookies') 響應對應請求的cookie
● response.cookies 響應的cookie(經過了set-cookie動作)
● response.url請求的URL

4、iter_content方法

如果下載一個較大的資源,例如一個影片,可能需要的下載時間較長,在這個較長的下載過程中程式是不能做別的事情的(當然可以使用多工來解決),如果在不是多工的情況下,想要知道下載的進度,此時就可以透過類似迭代的方式下載部分資源。

使用iter_content

r = requests.get('https://www.baidu.com', stream=True)

with open('test.html', 'wb') as f:
    for chunk in r.iter_content(chunk_size=100):
        f.write(chunk)

在獲取資料時,設定屬性stream=True
● 如果設定了stream=True,那麼在呼叫iter_content方法時才會真正下載內容
● 如果沒設定stream屬性則呼叫requests.get就會耗費時間下載

5、重定向與歷史請求

思考:為什麼列印出來的url不是請求的url呢?
想要搞清楚這個問題,就要知道requests的重定向問題。

requersts的預設情況
預設情況下,requests傳送的請求除了方式為HEAD之外,其餘的請求例如GET、POST等都是能自動進行重 定向的
這也就是為什麼上面明明訪問的是http://www.baidu.com而列印出來之後是https://m.baidu.com/?from=844b&vit=fps的原因

取消自動重定向
在傳送請求的時候,可以透過如下的設定,取消requests模組的自動重定向功能

requests.get(url, allow_redirects=False)

6、SSL證書問題

在瀏覽網頁時,可能會遇到以下這種情況:

出現這個問題的原因是:ssl證書不安全導致的。

7、retrying模組的使用

使用超時引數能夠加快我們整體的執行速度。但是在普通的生活中當我們使用瀏覽器訪問網頁時,如果發生速度很慢的情況,我們會做的選擇是重新整理頁面。那麼在程式碼中,我們是否也可以重新整理請求呢?
在本小節中我們使用retrying模組來完成需求。

# 安裝指令如下:
pip install retrying -i https://pypi.tuna.tsinghua.edu.cn/simple

作用:

  1. 使用retrying模組提供的retry模組
  2. 透過裝飾器的方式使用,讓被裝飾的函式反覆執行
  3. retry中可以傳入引數stop_max_attempt_number,讓函式報錯後繼續重新執行,達到最大執行次數的上限,如果每次都報錯,整個函式報錯,如果中間有一個成功,程式繼續往後執行
import requests
from retrying import retry

num = 1


@retry(stop_max_attempt_number=3)
def _parse_url(url):
    global num
    print("第%d次嘗試" % num)
    num += 1
    headers = {
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
    }
    # 超時的時候會報錯並重試
    response = requests.get(url, headers=headers, timeout=3)
    # 狀態碼不是200,也會報錯並重試
    assert response.status_code == 200  # 此語句是"斷言",如果assert後面的條件為True則呈現繼續執行,否則丟擲異常
    return response


def parse_url(url):
    # 進行異常捕獲
    try:
        response = _parse_url(url)
    except Exception as e:
        print("產生異常:", e)
        # 報錯返回None
        response = None
    return response


if __name__ == '__main__':
    url = "https://chinasoftinc.com/owa"
    # url = "https://www.baidu.com"
    print("----開始----")
    r = parse_url(url=url)
    print("----結束----", "響應內容為:", r)

相關文章