動態解析521響應Cookie失效後,爬蟲如何繼續?
背景
前面章節介紹了爬蟲的目標網站使用了兩次 JS 混淆反爬技術,模擬請求流程得到的動態 Cookie 資訊,遺憾的是,它的有效期是一個小時。Cookie 失效後,WebMagic 後面依舊是 521 響應碼。
本文探討的問題是:動態解析到的 Cookie 失效後,WebMagic 如何動態修改 Cookie 資訊呢?Site 類的 addHeader 和 addCookie ,哪個是決定最終請求頭域的要素呢?跟蹤了一遍 Spider 類的原始碼,找到了答案。
原始碼分析
第一,爬蟲的核心是使用 HttpClient 的 API 發起 HTTP 請求,頁面下載的方法是這個 download
.
第二,它使用 HttpClient 爬蟲時,會快取 HttpClient 物件,看看它的類定義:
public class HttpClientDownloader extends AbstractDownloader {
private Logger logger = LoggerFactory.getLogger(getClass());
private final Map<String, CloseableHttpClient> httpClients = new HashMap<String, CloseableHttpClient>();
private HttpClientGenerator httpClientGenerator = new HttpClientGenerator();
private HttpUriRequestConverter httpUriRequestConverter = new HttpUriRequestConverter();
}
每次執行下載操作時,先從快取中獲取 HttpClient 物件,以 domain 為 Key,也就是說相同 domain 爬蟲時,都是用的同一個 HttpClient 物件:
第三,它通過 HttpClientGenerator 的 getClient 生成包含 Site 的 Cookie 的 HttpClient 物件,Cookie 資訊只在新建時使用一次,後面即使 Site 的 Cookie 資訊發生變化,也不生效:
真正請求時的頭域和 Cookie 來源
下載函式中,使用 HttpClient 傳送請求的程式碼
它的定義是:
convertHttpUrlRequest
方法,會真正使用 Site 的頭域資訊
因此,如果想讓爬蟲請求的頭域資訊動態變化,有兩種方式:
- 修改 Site 物件的 Header ,使用 addHeader(“cookie”,cookie) 修改頭域;這個比較容易。
- new Request 新請求時,為其設定 Cookie ,比較麻煩,所有涉及到新建請求的地方都需要。
對 Spider 重新獲取 Cookie
最後來回答,如何重新設定的 Cookie 的問題。 WebMagic 使用了執行緒池,當 Cookie 過期時,所有執行緒都會再次遭遇 521 ,此時只需要由一個執行緒執行 Cookie 重新獲取操作。
Process 處理 Page 時,判斷響應碼,如果是 521 使用多執行緒同步,保證只有一個執行緒更新 Cookie:
refreshCookie
就是上一節介紹的解析兩次 521 動態 JS 得到新的 Cookie ,然後重新設定到 Site 中:
啟示錄
再總結下動態反扒的核心:
- userAgent 頭域,必須一致,且是某一個固定有效的值
- 使用 Site 的 setHeader 方式設定 Cookie 資訊
- Cookie 失效再次 521 後,控制同步流程,利用 flag 標識和時間保證只重新獲取一次
相關文章
- Python爬蟲教程-13-爬蟲使用cookie爬取登入後的頁面(人人網)(下)Python爬蟲Cookie
- Python爬蟲教程-12-爬蟲使用cookie爬取登入後的頁面(人人網)(上)Python爬蟲Cookie
- python 爬蟲如何爬取動態生成的網頁內容Python爬蟲網頁
- 如何理解Cookie的接收與響應?Cookie
- MySQL·捉蟲動態·唯一鍵約束失效MySql
- 如何應對反爬蟲措施?爬蟲
- 騰訊動漫爬蟲與動態隨機載入反爬爬蟲隨機
- python3.4 獲取cookie後繼續訪問其他頁面PythonCookie
- 如何用python爬蟲分析動態網頁的商品資訊?Python爬蟲網頁
- 如何高效獲取大資料?動態ip代理:用爬蟲!大資料爬蟲
- 爬蟲 | 處理cookie的基本方法——session爬蟲CookieSession
- 動態ip代理教你:如何用爬蟲實現前端頁面渲染爬蟲前端
- 爬蟲---xpath解析(爬取美女圖片)爬蟲
- C# 爬蟲—-Cookies處理(Set-Cookie)C#爬蟲Cookie
- notification後,程式應該如何響應
- Python爬蟲教程-14-爬蟲使用filecookiejar儲存cookie檔案(人人網)Python爬蟲CookieJAR
- 爬蟲動態http代理ip有什麼功能爬蟲HTTP
- 獲取爬蟲動態IP的三種方法爬蟲
- Python爬蟲爬取B站up主所有動態內容Python爬蟲
- 我爬取了爬蟲崗位薪資,分析後發現爬蟲真香爬蟲
- 如何利用Python網路爬蟲抓取微信朋友圈的動態(上)Python爬蟲
- python爬蟲抓取哈爾濱天氣資訊(靜態爬蟲)Python爬蟲
- Python爬蟲動態ip代理防止被封的方法Python爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- 反-反爬蟲:用幾行程式碼寫出和人類一樣的動態爬蟲爬蟲行程
- Python爬蟲怎麼設定動態IP代理,Python爬蟲要注意哪些事項?Python爬蟲
- 「資料分析」2種常見的反爬蟲策略,資訊驗證和動態反爬蟲爬蟲
- 反 反爬蟲:用幾行程式碼寫出和人類一樣的動態爬蟲爬蟲行程
- 動態ip代理:Python爬蟲應用,八仙過海各顯神通Python爬蟲
- 爬蟲框架如何搭建爬蟲框架
- 騰訊動漫爬蟲與動態隨機載入反爬破解技術實戰爬蟲隨機
- 爬蟲的小技巧之–如何尋找爬蟲入口爬蟲
- 如何合理控制爬蟲爬取速度?爬蟲
- C#開發單例項應用程式並響應後續程序啟動引數C#單例
- 爬蟲解析庫:XPath 輕鬆上手爬蟲
- Python爬蟲之路-JS的解析Python爬蟲JS
- python爬蟲之解析連結Python爬蟲
- 爬蟲-使用lxml解析html資料爬蟲XMLHTML