大家是不是常常會在爬蟲中,發現某些網站怎樣就是爬不下來呢?
沒錯,這是非常常見的問題!
一、網站server端的loading不足
這是啥意思呢?也就是指可承載的流量很低,
導致如果爬蟲一次要很多資料,他就爆炸overload(超載),
於是你的爬蟲就失敗了…
這狀況雖然現在比較少見,但如證交所的證券清單,
那頁的loading量就很低,很常掉封包或失敗呢!
二、有防爬蟲的設置
但多數時候都是狀況 2 ,只要是這狀況,就會讓爬蟲爬失敗,
那這時候該怎麼辦呢?
首先我們先區別幾種可能:
- 一秒太多次requests
- 一定時間內太多有規律、同IP的爬蟲
- 特殊渲染的網頁
- 直接判定送來的requests有沒有headers
1、2 的解決方案:
其實防爬蟲並不是因為他們不想讓你取得資料,
而是為了保護伺服器(server),
因為對於爬取方很簡單,就是我全都要~!
但對於網站方,如果人人都用程式來把網站當吃到飽(buffet)
那網站隨之而來的就是大量的loading,
這樣不只對網站增加負擔,還會讓網站管理費用扶搖直上呢!
那因為防爬蟲的最基本就是找出那些定期登入網站的對象,
或是瘋狂按F5重新整理的狂人….
當你用while每秒都爬一次時,你就是那個狂按F5的狂人…
那這時候當然得對這些人下點限制,否則就侵占了其他人使用這個網站的權益啦!
所以我們得加上 schedule 與 time.sleep() ,並在相關函式內加上隨機,
讓爬蟲週期產生隨機性,
例如:
schedule:
import schedule
import time
import random
import datetime
def job():
t = datetime.datetime.now().replace(microsecond=0)
print(str(t) + " Here is QP, Hello")
i = 0
for i in range(10):
delay = random.randrange(1, 5)
print(delay)
schedule.every(delay).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(.01)
time.sleep:
from random import randint
from time import sleep
sleep(randint(10,100))
3 的解決方案:
得靠 Selenium 去解決,這個會很依照網頁需求去討論。
4 的解決方案:
也就是今天的主題囉!
在任何爬蟲開始之前,加入以下CODE:
headers = {
'content-type': 'text/html; charset=UTF-8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
上面那個就是告訴爬蟲以什麼方式執行:
- Mozilla
- AppleWebKit
- Chrome
以及用甚麼解析這個網頁:
- ‘text/html; charset=UTF-8’
小備註:上面的意思就是用text/html的方式,以UTF-8的格式去做解析,UTF-8通常就是指中文字型哦!
最後就是把 headers 加入我們的爬蟲設定囉!
res = requests.get(你要爬的url, headers=headers)
這樣一來,我們想要的爬蟲就可以被認為是正常的登入,
進而就可以取得想要的資料囉!