python做反被爬保護(hù)的方法
網(wǎng)絡(luò)爬蟲,是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序,它為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè),是搜索引擎的重要組成。但是當(dāng)網(wǎng)絡(luò)爬蟲被濫用后,互聯(lián)網(wǎng)上就出現(xiàn)太多同質(zhì)的東西,原創(chuàng)得不到保護(hù)。于是,很多網(wǎng)站開始反網(wǎng)絡(luò)爬蟲,想方設(shè)法保護(hù)自己的內(nèi)容。
一: User-Agent +Referer檢測(cè)
User-Agent 是HTTP協(xié)議的中的一個(gè)字段, 其作用是描述發(fā)出HTTP請(qǐng)求的終端的一些信息。
使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語(yǔ)言、瀏覽器插件等。
服務(wù)器通過(guò)這個(gè)字段就可以知道訪問(wèn)網(wǎng)站的是什么人。對(duì)于不是正常瀏覽器的用戶進(jìn)行屏蔽。
解決方案:
偽裝瀏覽器的User-Agent,因?yàn)槊總€(gè)瀏覽器的User-Agent不一樣,并且所有的用戶都能使用瀏覽器。所有每次請(qǐng)求的時(shí)候條件瀏覽器的User-Agent,就能解決UA檢測(cè)
Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的。例如有一些圖片網(wǎng)站在你請(qǐng)求圖片的時(shí)候,就會(huì)檢測(cè)你的Referer值,如果Referer不符合,不會(huì)返回正常的圖片。
解決方案:
在檢測(cè)referer的請(qǐng)求中,攜帶符合的referer值。
二: js混淆和渲染
所謂 JavaScript 混淆,基本就是:
1.去掉一些實(shí)際沒(méi)有調(diào)用的函數(shù)。
2.將零散的變量聲明合并。
3.邏輯函數(shù)的精簡(jiǎn)。
4.變量名的簡(jiǎn)化。具體要看不同的壓縮工具的考慮優(yōu)劣。常見(jiàn)的有UglifyJS、JScrambler等工具。
js渲染其實(shí)就是對(duì)HTML頁(yè)面的修改。比如有一些網(wǎng)頁(yè)本身沒(méi)有返回?cái)?shù)據(jù),數(shù)據(jù)是經(jīng)過(guò)js加載之后添加到HTML當(dāng)中的。當(dāng)遇到這種情況的時(shí)候,我們要知道爬蟲是不會(huì)執(zhí)行JavaScript操作。所以需要用其他的方法處理。
解決方案:
1.通過(guò)閱讀網(wǎng)站js源碼,找到關(guān)鍵的代碼,并用python實(shí)現(xiàn)。
2.通過(guò)閱讀網(wǎng)站js源碼,找到關(guān)鍵的代碼,用PyV8,execjs等庫(kù)直接執(zhí)行js代碼。
3.通過(guò)selenium庫(kù)直接模擬瀏覽器環(huán)境
三:IP限制頻次
WEB系統(tǒng)都是走h(yuǎn)ttp協(xié)議跟WEB容器連通的,每次請(qǐng)求至少會(huì)產(chǎn)生一次客戶端與服務(wù)器的tcp連接。
對(duì)于服務(wù)端來(lái)說(shuō)可以很清楚的查看到,一個(gè)ip地址在單位時(shí)間內(nèi)發(fā)起的請(qǐng)求。
當(dāng)請(qǐng)求數(shù)超過(guò)一定的值之后,就可判斷為非正常的用戶請(qǐng)求。
解決方案:
1.自行設(shè)計(jì)ip代理池,通過(guò)輪換的方式,每次請(qǐng)求攜帶不同的代理地址。
2.ADSL動(dòng)態(tài)撥號(hào)他有個(gè)獨(dú)有的特點(diǎn),每撥一次號(hào),就獲取一個(gè)新的IP。也就是它的IP是不固定的。
四:驗(yàn)證碼
驗(yàn)證碼(CAPTCHA)是“Completely Automated PublicTuring test to tell Computers and HumansApart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序。
可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試。
這個(gè)問(wèn)題可以由計(jì)算機(jī)生成并評(píng)判,但是必須只有人類才能解答。由于計(jì)算機(jī)無(wú)法解答CAPTCHA的問(wèn)題,所以回答出問(wèn)題的用戶就可以被認(rèn)為是人類。
解決方案:
1.手動(dòng)識(shí)別驗(yàn)證碼
2.pytesseract識(shí)別簡(jiǎn)單的驗(yàn)證碼
3.對(duì)接打碼平臺(tái)
4.機(jī)器學(xué)習(xí)
擴(kuò)展知識(shí):
基于反爬的相關(guān)實(shí)例代碼:
#! /usr/bin/env python3.4 #-*- coding:utf-8 -*- #__author__ == "tyomcat" import urllib.request import random import re url='http://www.whatismyip.com.tw' iplist=['121.193.143.249:80','112.126.65.193:80','122.96.59.104:82','115.29.98.139:9999','117.131.216.214:80','116.226.243.166:8118','101.81.22.21:8118','122.96.59.107:843'] proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)}) opener=urllib.request.build_opener(proxy_support) opener.addheaders=[('User-Agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36')] urllib.request.install_opener(opener) response = urllib.request.urlopen(url) html = response.read().decode('utf-8') pattern = re.compile('<h1>(.*?)</h1>.*?<h2>(.*?)</h2>') iterms=re.findall(pattern,html) for item in iterms: print(item[0]+":"+item[1])
#! /usr/bin/env python # -*- coding:utf-8 -*- #__author__ == "tyomcat" from selenium import webdriver import time import re drive = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs') drive.get('https://mm.taobao.com/self/model_info.htm?user_id=189942305&is_coment=false') time.sleep(5) pattern = re.compile(r'<div.*?mm-p-domain-info">.*?class="mm-p-info-cell clearfix">.*?<li>.*?<label>(.*?)</label><span>(.*?)</span>',re.S) html=drive.page_source.encode('utf-8','ignore') items=re.findall(pattern,html) for item in items: print item[0],'http:'+item[1] drive.close()
相關(guān)文章
Python機(jī)器學(xué)習(xí)應(yīng)用之支持向量機(jī)的分類預(yù)測(cè)篇
最近完成的一個(gè)項(xiàng)目用到了SVM,之前也一直有聽說(shuō)支持向量機(jī),知道它是機(jī)器學(xué)習(xí)中一種非常厲害的算法。利用將近一個(gè)星期的時(shí)間學(xué)習(xí)了一下支持向量機(jī),把原理推了一遍,感覺(jué)支持向量機(jī)確實(shí)挺厲害的,這篇文章帶你了解它2022-01-01Python3.5實(shí)現(xiàn)的羅馬數(shù)字轉(zhuǎn)換成整數(shù)功能示例
這篇文章主要介紹了Python3.5實(shí)現(xiàn)的羅馬數(shù)字轉(zhuǎn)換成整數(shù)功能,涉及Python字符串遍歷與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-02-02python監(jiān)控網(wǎng)站運(yùn)行異常并發(fā)送郵件的方法
這篇文章主要介紹了python監(jiān)控網(wǎng)站運(yùn)行異常并發(fā)送郵件的方法,涉及Python操作郵件及服務(wù)器監(jiān)控的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Python3+Selenium+Chrome實(shí)現(xiàn)自動(dòng)填寫WPS表單
本文通過(guò)python3、第三方python庫(kù)Selenium和谷歌瀏覽器Chrome,完成WPS表單的自動(dòng)填寫,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Python實(shí)現(xiàn)保證只能運(yùn)行一個(gè)腳本實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)保證只能運(yùn)行一個(gè)腳本實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06python 實(shí)現(xiàn)對(duì)數(shù)據(jù)集的歸一化的方法(0-1之間)
今天小編就為大家分享一篇python 實(shí)現(xiàn)對(duì)數(shù)據(jù)集的歸一化的方法(0-1之間),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07借助Paramiko通過(guò)Python實(shí)現(xiàn)linux遠(yuǎn)程登陸及sftp的操作
這篇文章主要介紹了借助Paramiko通過(guò)Python實(shí)現(xiàn)linux遠(yuǎn)程登陸及sftp,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03