scrapy設置"請求池"
引言
相信大家有時候爬蟲發出請求的時候會被ban,返回的是403錯誤,這個就是請求頭的問題,其實在python發出請求時,使用的是默認的自己的請求頭,網站管理者肯定會不允許機器訪問的,但是有些比較low的網站還是可以訪問的,有時候網站管理者看到同一個請求頭在一秒內請求多次,傻子都知道這是機器在訪問,因此會被ban掉,這時就需要設置請求池了,這個和ip代理池是一個概念
爬蟲請求常見的錯誤
- 200:請求成功 處理方式:獲得響應的內容,進行處理
- 201:請求完成,結果是創建了新資源。新創建資源的 URI 可在響應的實體中得到 處理方式:爬蟲中不會遇到
- 202:請求被接受,但處理尚未完成 處理方式:阻塞等待
- 204:服務器端已經實現了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。 處理方式:丟棄
- 300:該狀態碼不被 HTTP/1.0 的應用程序直接使用, 只是作為 3XX 類型回應的默認解釋。存在多個可用的被請求資源。 處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄
- 301:請求到的資源都會分配一個永久的 URL,這樣就可以在將來通過該 URL 來訪問此資源 處理方式:重定向到分配的 URL
- 302:請求到的資源在一個不同的 URL 處臨時保存 處理方式:重定向到臨時的 URL
- 304 請求的資源未更新 處理方式:丟棄
- 400 非法請求 處理方式:丟棄
- 401 未授權 處理方式:丟棄
- 403 禁止 處理方式:丟棄
- 404 沒有找到 處理方式:丟棄
- 5XX 回應代碼以“5”開頭的狀態碼表示服務器端發現自己出現錯誤,不能繼續執行請求 處理方式:丟棄
話不多說直接擼代碼
from scrapy import log
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
class RotateUserAgentMiddleware(UserAgentMiddleware):
# for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
def process_request(self, request, spider):
ua = random.choice(self.user_agent_list)
if ua:
# 顯示當前使用的useragent
print "********Current UserAgent:%s************" % ua
# 記錄
log.msg('Current UserAgent: ' + ua)
request.headers.setdefault('User-Agent', ua)
說明
這里的思路就是在下載器中間件中對request設置請求,這里是使用
request.headers.setdefault("User-Agent",user_agent)
這個函數設置請求頭,對于下載器中間件在我博客前面的文章已經有說明,想要了解的請點擊
注意
這里還要說明的是設置了請求池還要在配置文件settins中設置一下,具體設置方法和設置代理ip一樣,詳情請看scrapy代理ip的設置