【Python3爬蟲】常見反爬蟲措施及解決辦法(二)

来源:https://www.cnblogs.com/TM0831/archive/2019/03/01/10436608.html
-Advertisement-
Play Games

這一篇博客,還是接著說那些常見的反爬蟲措施以及我們的解決辦法。同樣的,如果對你有幫助的話,麻煩點一下推薦啦。 一、防盜鏈 這次我遇到的防盜鏈,除了前面說的Referer防盜鏈,還有Cookie防盜鏈和時間戳防盜鏈。Cookie防盜鏈常見於論壇、社區。當訪客請求一個資源的時候,他會檢查這個訪客的Coo ...


這一篇博客,還是接著說那些常見的反爬蟲措施以及我們的解決辦法。同樣的,如果對你有幫助的話,麻煩點一下推薦啦。

 

一、防盜鏈

這次我遇到的防盜鏈,除了前面說的Referer防盜鏈,還有Cookie防盜鏈和時間戳防盜鏈。Cookie防盜鏈常見於論壇、社區。當訪客請求一個資源的時候,他會檢查這個訪客的Cookie,如果不是他自己的用戶的Cookie,就不會給這個訪客正確的資源,也就達到了防盜的目的。時間戳防盜鏈指的是在他的url後面加上一個時間戳參數,所以如果你直接請求網站的url是無法得到真實的頁面的,只有帶上時間戳才可以。

這次的例子是天涯社區的圖片分社區

這裡我們先打開開發者工具,然後任意選擇一張圖片,得到這個圖片的鏈接,然後用requests來下載一下這張圖片,註意帶上Referer欄位,看結果如何:

import requests

url = "http://img3.laibafile.cn/p/l/305989961.jpg"
headers = {
"Referer": "http://pp.tianya.cn/",
"UserAgent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36"
}
res = requests.get(url)
with open('test.jpg', 'wb') as f:
f.write(res.content)

我們的爬蟲正常運行了,也看到生成了一個test.jpg文件,先別急著高興,打開圖片看一下:

一口老血吐了出來,竟然還有這種套路!怎麼辦呢?往下看!

解決辦法:

既然他說僅供天涯社區用戶分享,那我們也成為他的用戶不就行了嗎?二話不說就去註冊了個賬號,然後登錄,再拿到登錄後的Cookie:

__auc=90d515c116922f9f856bd84dd81; Hm_lvt_80579b57bf1b16bdf88364b13221a8bd=1551070001,1551157745; user=w=EW2QER&id=138991748&f=1; right=web4=n&portal=n; td_cookie=1580546065; __cid=CN; Hm_lvt_bc5755e0609123f78d0e816bf7dee255=1551070006,1551157767,1551162198,1551322367; time=ct=1551322445.235; __asc=9f30fb65169320604c71e2febf6; Hm_lpvt_bc5755e0609123f78d0e816bf7dee255=1551322450; __u_a=v2.2.4; sso=r=349690738&sid=&wsid=71E671BF1DF0B635E4F3E3E41B56BE69; temp=k=674669694&s=&t=1551323217&b=b1eaa77438e37f7f08cbeffc109df957&ct=1551323217&et=1553915217; temp4=rm=ef4c48449946624e9d7d473bc99fc5af; u_tip=138991748=0

註意:Cookie是有時效性的,具體多久就會失效我沒測試。緊接著把Cookie添加到代碼中,然後運行,可以看到成功把圖片下載下來了:

搞了這麼久才下了一張圖片,我們怎麼可能就這麼滿足呢?分析頁面可知一個頁面上有十五張圖片,然後往下拉的時候會看到"正在載入,請稍後":

我們立馬反應過來這是通過AJAX來載入的,於是打開開發者工具查看,可以找到如下內容:

 

可以看到每個鏈接“?”前面的部分都是基本一樣的,“list_”後面跟的數字表示頁數,而“_=”後面這一串數字是什麼呢?有經驗的人很快就能意識到這是一個時間戳,所以我們來測試一下:

import time
import requests

t = time.time()*1000
url = "http://pp.tianya.cn/qt/list_4.shtml?_={}".format(t)
res = requests.get(url)
print(res.text)

 運行之後得到了我們想要的結果。現在我們已經能用代碼構造鏈接了,那我們怎麼知道最多有多少頁呢?我們先繼續拖動滾輪下拉頁面,發現出現第5頁之後就沒有了:

 

這怎麼辦呢?不急,我們不是已經能自己構造鏈接了嘛,我們可以通過改變“list”後面的數字來得到更多的頁面啊。不過我自己測試的結果是最多只有15頁,之後再怎麼增大數字也沒用了,應該是伺服器做了限制,最多只給15頁的數據。下圖是我把數字改為16後返回的結果:

 

最後編寫程式並運行,就能把圖片下載下來了:

完整代碼已上傳到GitHub

 

二.隨機化網頁源碼

用display:none來隨機化網頁源碼,有網站還會隨機類和id的名字,然後再加點隨機的tr和td,這樣的話就增大了我們解析的難度。比如全網代理IP

解決辦法:

可以看到每個IP都是包含在一個class為“ip”的td里的,所以我們可以先定位到這個td,然後進行下一步解析。雖然這個td裡面包含了很多的span標簽和p標簽,而且也每個標簽的位置也沒有什麼規律,不過還是有辦法解析的。方法就是把這個td里的所有文字提取出來,然後把那些前後重覆的部分去除掉,最後拼接到一起就可以了,代碼如下:

1 et = etree.HTML(html)  # html:網頁源碼
2 for n in range(1, 21):
3     lst = et.xpath('//table/tbody/tr[{}]/td[1]//text()'.format(n))
4     proxy = ""
5     for i in range(len(lst) - 1):
6         if lst[i] != lst[i + 1]:
7             proxy += lst[i]
8     proxy += lst[-1]
9     print(proxy)

最後就能得到我們想要的數據了。不過我們得到的埠數據和網頁上顯示的數據是不一樣的,這是因為埠數據是經過了JS混淆的,至於怎麼破解,下次會分享出來。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、架構 RocketMQ的master broker與master broker沒有任何消息通訊,nameserver之間也同樣沒有消息通信 MQ歷史 由數據結構隊列發展而來 MQ使用場景 非同步處理 解耦 削峰填谷 數據同步 2、隊列 rocketMQ一個主題(topic)包含多個隊列 3、使用 ...
  • 一直都想擁有一個屬於自己的技術博客,今天終於開通了,很激動。第一篇隨筆就分享一下自己今天剛學習和實踐的裝飾者設計模式。 一、設計模式到底是什麼東西,它有對應的物質嗎? 如果我們看不到物質,那麼一切的意識都是站不住腳的。那麼什麼是設計模式呢?它能映射到對應的物質嗎? 以前我剛開始接觸設計模式是在學習j ...
  • 一、業務開發與基礎開發的區別 - 劃分方式 一種將後臺開發細分的方式:前臺開發(業務)、中台開發(中間件、應用基礎服務、PAAS服務、IAAS服務)、後臺開發(運維開發)。一般前臺開發對應於業務開發,中台開發對應基礎開發,後臺開發對應運維。 - 規模 基礎開發的目標是解決業務的公共痛點,所以一般數據 ...
  • 分散式系統是由一組通過網路進行通信、為了完成共同的任務而協調工作的電腦節點組成的系統。分散式系統的出現是為了用廉價的、普通的機器完成單個電腦無法完成的計算、存儲任務。其目的是利用更多的機器,處理更多的數據。 一、第一階段 最初假設的網站中,我們把應用系統網站、文件和資料庫都放在一臺伺服器上,一臺 ...
  • 前言:通過設計器交互來創建流程圖是比較常見的方式,這種方式是比較方便業務人員對流程的操作。然而,在需要流程模板,或者技術開發階段以及一些自動化流程的處理過程中,使用代碼快速創建流程圖也是一種非常有必要的快捷途徑。本文重點說明這種方法的實現過程和具體使用價值。 1. 互動式構建流程圖 圖形互動式一般是 ...
  • LieBrother原文 : "行為型模式:迭代器模式" 十一大行為型模式之六:迭代器模式。 簡介 姓名 :迭代器模式 英文名 :Iterator Pattern 價值觀 :人生沒有回頭路 個人介紹 : Provide a way to access the elements of an aggre ...
  • 定義:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象 原型模式其實就是通過一個對象來創建一個新的可定製(可以是源對象的一個副本也可以有所改變)的對象,而且我們並不需要知道具體創建的細節。在java中使用原型模式是非常簡單的,因為Object類中提供了一個本地方法clone,就是用來拷 ...
  • PHP語言在Linux系統上運行的時候,需要在Linux系統上部署相應的Nginx、MySQL、PHP等環境,只有將這些環境參數都設置好,PHP相關應用程式才可正常運行,部署環境的方法有很多種,可手動模式下一個個軟體環境進行安裝,也可使用工具進行快速部署,此文以阿裡雲的Centos系統為例,介紹在C ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...