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
外掛下載地址:
- https://extfans.com/
- 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
作用:
- 使用retrying模組提供的retry模組
- 透過裝飾器的方式使用,讓被裝飾的函式反覆執行
- 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)