python作反被爬保護的方法

python作反被爬保護的方法

網絡爬蟲,是一個自動提取網頁的程序,它爲搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。可是當網絡爬蟲被濫用後,互聯網上就出現太多同質的東西,原創得不到保護。因而,不少網站開始反網絡爬蟲,千方百計保護本身的內容。html

一: User-Agent +Referer檢測python

User-Agent 是HTTP協議的中的一個字段, 其做用是描述發出HTTP請求的終端的一些信息。linux

使得服務器可以識別客戶使用的操做系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。web

服務器經過這個字段就能夠知道訪問網站的是什麼人。對於不是正常瀏覽器的用戶進行屏蔽。瀏覽器

解決方案:服務器

假裝瀏覽器的User-Agent,由於每一個瀏覽器的User-Agent不同,而且全部的用戶都能使用瀏覽器。全部每次請求的時候條件瀏覽器的User-Agent,就能解決UA檢測網絡

Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的。例若有一些圖片網站在你請求圖片的時候,就會檢測你的Referer值,若是Referer不符合,不會返回正常的圖片。dom

解決方案:機器學習

在檢測referer的請求中,攜帶符合的referer值。tcp

二: js混淆和渲染

所謂 JavaScript 混淆,基本就是:

1.去掉一些實際沒有調用的函數。

2.將零散的變量聲明合併。

3.邏輯函數的精簡。

4.變量名的簡化。具體要看不一樣的壓縮工具的考慮優劣。常見的有UglifyJS、JScrambler等工具。

js渲染其實就是對HTML頁面的修改。好比有一些網頁自己沒有返回數據,數據是通過js加載以後添加到HTML當中的。當遇到這種狀況的時候,咱們要知道爬蟲是不會執行JavaScript操做。因此須要用其餘的方法處理。

解決方案:

1.經過閱讀網站js源碼,找到關鍵的代碼,並用python實現。

2.經過閱讀網站js源碼,找到關鍵的代碼,用PyV8,execjs等庫直接執行js代碼。

3.經過selenium庫直接模擬瀏覽器環境

三:IP限制頻次

WEB系統都是走http協議跟WEB容器連通的,每次請求至少會產生一次客戶端與服務器的tcp鏈接。

對於服務端來講能夠很清楚的查看到,一個ip地址在單位時間內發起的請求。

當請求數超過必定的值以後,就可判斷爲非正常的用戶請求。

解決方案:

1.自行設計ip代理池,經過輪換的方式,每次請求攜帶不一樣的代理地址。

2.ADSL動態撥號他有個獨有的特色,每撥一次號,就獲取一個新的IP。也就是它的IP是不固定的。

四:驗證碼

驗證碼(CAPTCHA)是「Completely Automated PublicTuring test to tell Computers and HumansApart」(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機仍是人的公共全自動程序。

能夠防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試。

這個問題能夠由計算機生成並評判,可是必須只有人類才能解答。因爲計算機沒法解答CAPTCHA的問題,因此回答出問題的用戶就能夠被認爲是人類。

解決方案:

1.手動識別驗證碼

2.pytesseract識別簡單的驗證碼

3.對接打碼平臺

4.機器學習

擴展知識:

基於反爬的相關實例代碼:

#! /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()
相關文章
相關標籤/搜索