Python爬蟲基礎(chǔ) | 爬蟲反ban的技巧

根據(jù)scrapy官方文檔:http://doc.scrapy.org/en/master/topics/practices.html#avoiding-getting-banned里面的描述,要防止scrapy被ban芹扭,主要有以下幾個(gè)策略麻顶。

  • 動(dòng)態(tài)設(shè)置user agent
  • 禁用cookies/啟用cookie
  • 設(shè)置延遲下載
  • 使用Google cache (未記錄)
  • 使用IP地址池(Tor project、VPN和代理IP)
  • 利用第三方平臺(tái)crawlera做scrapy爬蟲防屏蔽 (未記錄)

動(dòng)態(tài)設(shè)置user agent

# -*- coding:utf-8 -*-

import random

def get_headers():
    useragent_list = [
        'Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.9.2.1000 Chrome/39.0.2146.0 Safari/537.36',
        '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.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 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/532.3',
        '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 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'
    ]
    useragent = random.choice(useragent_list)
    header = {'User-Agent': useragent}
    return header


禁用cookies/啟用cookie

Cookies

cookies(來(lái)自維基百科)因?yàn)?a target="_blank" rel="nofollow">HTTP協(xié)議是無(wú)狀態(tài)的舱卡,即服務(wù)器不知道用戶上一次做了什么辅肾,這嚴(yán)重阻礙了交互式Web應(yīng)用程序的實(shí)現(xiàn)。在典型的網(wǎng)上購(gòu)物場(chǎng)景中轮锥,用戶瀏覽了幾個(gè)頁(yè)面矫钓,買了一盒餅干和兩飲料。最后結(jié)帳時(shí),由于HTTP的無(wú)狀態(tài)性新娜,不通過(guò)額外的手段赵辕,服務(wù)器并不知道用戶到底買了什么。 所以Cookie就是用來(lái)繞開HTTP的無(wú)狀態(tài)性的“額外手段”之一概龄。服務(wù)器可以設(shè)置或讀取Cookies中包含信息还惠,借此維護(hù)用戶跟服務(wù)器會(huì)話中的狀態(tài)。
Cookie另一個(gè)典型的應(yīng)用是當(dāng)?shù)卿浺粋€(gè)網(wǎng)站時(shí)私杜,網(wǎng)站往往會(huì)請(qǐng)求用戶輸入用戶名和密碼蚕键,并且用戶可以勾選“下次自動(dòng)登錄”。如果勾選了衰粹,那么下次訪問(wèn)同一網(wǎng)站時(shí)锣光,用戶會(huì)發(fā)現(xiàn)沒(méi)輸入用戶名和密碼就已經(jīng)登錄了。這正是因?yàn)榍耙淮蔚卿洉r(shí)寄猩,服務(wù)器發(fā)送了包含登錄憑據(jù)(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上嫉晶。第二次登錄時(shí),(如果該Cookie尚未到期)瀏覽器會(huì)發(fā)送該Cookie田篇,服務(wù)器驗(yàn)證憑據(jù),于是不必輸入用戶名和密碼就讓用戶登錄了箍铭。

采用selenium + PhantomJS 模擬瀏覽器登錄Lagou泊柬,獲取cookie

PhantomJS 下載頁(yè)面

# -*- coding:utf-8 -*-

import sys
import time
import random
from selenium import webdriver
reload(sys)
sys.setdefaultencoding('utf-8')

def random_sleep_time():
    sleeptime = random.randint(0, 10)
    return time.sleep(sleeptime)

def get_headers_with_cookie():
    driver = webdriver.PhantomJS(executable_path="D:\phantomjs-2.1.1-windows\\bin\phantomjs.exe") #需下載PhantomJS并解壓到某一路徑
    url_login = 'https://passport.lagou.com/login/login.html'
    driver.get(url_login)
    driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[1]/input').clear()
    driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[1]/input').send_keys('username') #需替換可用賬戶
    random_sleep_time()
    driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[2]/input').clear()
    driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[2]/input').send_keys('password') #需替換可用賬戶
    random_sleep_time()
    driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[5]/input').click()
    random_sleep_time()
    cookies = "; ".join([item["name"] + "=" + item["value"] for item in driver.get_cookies()])
    headers = get_headers()
    headers['cookie'] = cookies.encode('utf-8')
    return headers


XPath解析 Copy XPath技巧 參考向右奔跑-009 - 使用XPath解析網(wǎng)頁(yè)

driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[1]/input')  
driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[2]/input')
driver.find_element_by_xpath('/html/body/section/div[1]/form/div/div[5]/input')
Copy XPath

Scrapy 禁用Cookie

setting.py中設(shè)置

COOKIES_ENABLED=False

代理設(shè)置 PROXIES

setting.py中設(shè)置

PROXIES = [
    {'ip_port': '111.11.228.75:80', 'user_pass': ''},
    {'ip_port': '120.198.243.22:80', 'user_pass': ''},
    {'ip_port': '111.8.60.9:8123', 'user_pass': ''},
    {'ip_port': '101.71.27.120:80', 'user_pass': ''},
    {'ip_port': '122.96.59.104:80', 'user_pass': ''},
    {'ip_port': '122.224.249.122:8088', 'user_pass': ''},
]

設(shè)置下載延遲

setting.py中設(shè)置

DOWNLOAD_DELAY=3

創(chuàng)建中間件(middlewares.py)

import random
import base64
from settings import PROXIES

class RandomUserAgent(object):
    """Randomly rotate user agents based on a list of predefined ones"""

    def __init__(self, agents):
        self.agents = agents

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('USER_AGENTS'))

    def process_request(self, request, spider):
        # print "**************************" + random.choice(self.agents)
        request.headers.setdefault('User-Agent', random.choice(self.agents))

class ProxyMiddleware(object):

    def process_request(self, request, spider):

        proxy = random.choice(PROXIES)
        if proxy['user_pass'] is not None:

            request.meta['proxy'] = "http://%s" % proxy['ip_port']
            encoded_user_pass = base64.encodestring(proxy['user_pass'])
            request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

            print "**************ProxyMiddleware have pass************" + proxy['ip_port']

        else:
            print "**************ProxyMiddleware no pass************" + proxy['ip_port']
            request.meta['proxy'] = "http://%s" % proxy['ip_port']

設(shè)置下載中間件

DOWNLOADER_MIDDLEWARES = {
#   'myproject.middlewares.MyCustomDownloaderMiddleware': 543,
    'myproject.middlewares.RandomUserAgent': 1,
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
#   'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'myproject.middlewares.ProxyMiddleware': 100,
}

參考資料

[1] 如何讓你的scrapy爬蟲不再被ban
[2] 為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法
[3] 互聯(lián)網(wǎng)網(wǎng)站的反爬蟲策略淺析
[4] 用 Python 爬蟲抓站的一些技巧總結(jié)
[5] 如何識(shí)別PhantomJs爬蟲
[6] 麻袋理財(cái)之反爬蟲實(shí)踐
[7] 中間件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诈火,隨后出現(xiàn)的幾起案子兽赁,更是在濱河造成了極大的恐慌,老刑警劉巖冷守,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刀崖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拍摇,警方通過(guò)查閱死者的電腦和手機(jī)亮钦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)充活,“玉大人蜂莉,你說(shuō)我怎么就攤上這事』炻眩” “怎么了映穗?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)幕随。 經(jīng)常有香客問(wèn)我蚁滋,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任辕录,我火速辦了婚禮澄阳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踏拜。我一直安慰自己碎赢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布速梗。 她就那樣靜靜地躺著肮塞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姻锁。 梳的紋絲不亂的頭發(fā)上枕赵,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音位隶,去河邊找鬼拷窜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涧黄,可吹牛的內(nèi)容都是我干的篮昧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笋妥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懊昨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起春宣,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酵颁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后月帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏惋,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年嚷辅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了簿姨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潦蝇,死狀恐怖款熬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攘乒,我是刑警寧澤贤牛,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站则酝,受9級(jí)特大地震影響殉簸,放射性物質(zhì)發(fā)生泄漏闰集。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一般卑、第九天 我趴在偏房一處隱蔽的房頂上張望武鲁。 院中可真熱鬧,春花似錦蝠检、人聲如沸沐鼠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饲梭。三九已至,卻和暖如春焰檩,著一層夾襖步出監(jiān)牢的瞬間憔涉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工析苫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兜叨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓衩侥,卻偏偏與公主長(zhǎng)得像国旷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顿乒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容