關(guān)于反爬蟲的一些簡(jiǎn)單總結(jié)
爬蟲與反爬蟲,這相愛相殺的一對(duì),簡(jiǎn)直可以寫出一部壯觀的斗爭(zhēng)史。而在大數(shù)據(jù)時(shí)代,數(shù)據(jù)就是金錢,很多企業(yè)都為自己的網(wǎng)站運(yùn)用了反爬蟲機(jī)制,防止網(wǎng)頁上的數(shù)據(jù)被爬蟲爬走。然而,如果反爬機(jī)制過于嚴(yán)格,可能會(huì)誤傷到真正的用戶請(qǐng)求;如果既要和爬蟲死磕,又要保證很低的誤傷率,那么又會(huì)加大研發(fā)的成本。
簡(jiǎn)單低級(jí)的爬蟲速度快,偽裝度低,如果沒有反爬機(jī)制,它們可以很快的抓取大量數(shù)據(jù),甚至因?yàn)檎?qǐng)求過多,造成服務(wù)器不能正常工作。
1、爬取過程中的302重定向
在爬取某個(gè)網(wǎng)站速度過快或者發(fā)出的請(qǐng)求過多的時(shí)候,網(wǎng)站會(huì)向你所在的客戶端發(fā)送一個(gè)鏈接,需要你去驗(yàn)證圖片。我在爬鏈家和拉鉤網(wǎng)的過程中就曾經(jīng)遇到過:
對(duì)于302重定向的問題,是由于抓取速度過快引起網(wǎng)絡(luò)流量異常,服務(wù)器識(shí)別出是機(jī)器發(fā)送的請(qǐng)求,于是將請(qǐng)求返回鏈接定到某一特定鏈接,大多是驗(yàn)證圖片或空鏈接。
在這種時(shí)候,既然已經(jīng)被識(shí)別出來了,就使用代理ip再繼續(xù)抓取。
2、headers頭文件
有些網(wǎng)站對(duì)爬蟲反感,對(duì)爬蟲請(qǐng)求一律拒絕,這時(shí)候我們需要偽裝成瀏覽器,通過修改http中的headers來實(shí)現(xiàn)
headers = { 'Host': "bj.lianjia.com", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 'Accept-Encoding': "gzip, deflate, sdch", 'Accept-Language': "zh-CN,zh;q=0.8", 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36", 'Connection': "keep-alive", } p = requests.get(url, headers=headers) print(p.content.decode('utf-8'))
3、模擬登陸
一般登錄的過程都伴隨有驗(yàn)證碼,這里我們通過selenium自己構(gòu)造post數(shù)據(jù)進(jìn)行提交,將返回驗(yàn)證碼圖片的鏈接地址輸出到控制臺(tái)下,點(diǎn)擊圖片鏈接識(shí)別驗(yàn)證碼,輸入驗(yàn)證碼并提交,完成登錄。
from selenium import webdriver from selenium.webdriver.common.keys import Keys # from selenium.webdriver.support.ui import WebDriverWait # WebDriverWait的作用是等待某個(gè)條件的滿足之后再往后運(yùn)行 from selenium.webdriver import ActionChains import time import sys driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe') # 構(gòu)造網(wǎng)頁驅(qū)動(dòng) driver.get('https://www.zhihu.com/#signin') # 打開網(wǎng)頁 driver.find_element_by_xpath('//input[@name="password"]').send_keys('your_password') driver.find_element_by_xpath('//input[@name="account"]').send_keys('your_account') driver.get_screenshot_as_file('zhihu.jpg') # 截取當(dāng)前頁面的圖片 input_solution = input('請(qǐng)輸入驗(yàn)證碼 :') driver.find_element_by_xpath('//input[@name="captcha"]').send_keys(input_solution) time.sleep(2) driver.find_element_by_xpath('//form[@class="zu-side-login-box"]').submit() # 表單的提交 表單的提交,即可以選擇登錄按鈕然后使用click方法,也可以選擇表單然后使用submit方法 sreach_widonw = driver.current_window_handle # 用來定位當(dāng)前頁面 # driver.find_element_by_xpath('//button[@class="sign-button submit"]').click() try: dr = WebDriverWait(driver,5) # dr.until(lambda the_driver: the_driver.find_element_by_xpath('//a[@class="zu-side-login-box"]').is_displayed()) if driver.find_element_by_xpath('//*[@id="zh-top-link-home"]'): print('登錄成功') except: print('登錄失敗') driver.save_screenshot('screen_shoot.jpg') #截取當(dāng)前頁面的圖片 sys.exit(0) driver.quit() #退出驅(qū)動(dòng)
這里面,PhantomJS是一個(gè)很棒的exe,下載地址:phantomjs。他可以模擬瀏覽器行為進(jìn)行操作。當(dāng)我們遇到JS渲染的網(wǎng)頁,在使用正則表達(dá)式、BS4和xpath . . . 都無法匹配出數(shù)據(jù)時(shí)(數(shù)據(jù)根本沒加載上),可以使用PhantomJS模擬瀏覽器行為發(fā)送請(qǐng)求,將會(huì)得到網(wǎng)頁的原始全部數(shù)據(jù)。
4、代理ip
當(dāng)爬取速度過快時(shí),當(dāng)請(qǐng)求次數(shù)過多時(shí)都面臨ip被封的可能。因此使用代理也是必備的。
使用request加代理
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080",} p = request.get("http://www.baidu.com", proxies = proxies) print(p.content.decode('utf-8'))
使用urllib加代理
user_agent ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0' headers = {'User-Agent':user_agent} proxy = {'http':'http://10.10.1.10:1080',} proxy_handler = urllib.request.ProxyHandler(proxy) opener = urllib.request.build_opener(proxy_handler) urllib.request.install_opener(opener) url = "https://www.baidu.com/" req = urllib.request.Request(url=url,headers=headers) res = urllib.request.urlopen(req) print(res.read().decode('utf-8')) # 打印網(wǎng)頁內(nèi)容
5、驗(yàn)證碼輸入
遇到驗(yàn)證的問題,我一般都是人工識(shí)別:獲取驗(yàn)證碼的鏈接再控制臺(tái)下 ——> 點(diǎn)擊鏈接識(shí)別驗(yàn)證碼 ——> 在控制臺(tái)手動(dòng)輸入驗(yàn)證碼并提交。
6、ajax加載的數(shù)據(jù)
對(duì)于ajax加載的數(shù)據(jù),我們無論通過request或post方法請(qǐng)求得到的網(wǎng)頁都無法得到。
關(guān)于一個(gè)網(wǎng)頁是否是ajax加載數(shù)據(jù),我們只需將網(wǎng)頁內(nèi)容print到控制臺(tái)下,將其與網(wǎng)頁原始內(nèi)容進(jìn)行比對(duì),如果有數(shù)據(jù)缺失,那么這些數(shù)據(jù)就是ajax加載。例如:我們想獲取京東上商品的價(jià)格、銷量、好評(píng)等方面的數(shù)據(jù),但是請(qǐng)求返回的網(wǎng)頁中沒有這些數(shù)據(jù)。因?yàn)檫@些數(shù)據(jù)是ajax加載。對(duì)于ajax加載的頁面,一般有兩種方法。
(1)分析網(wǎng)頁
按F12打開瀏覽器調(diào)試工具,在Network下選擇XHR或Doc標(biāo)簽,分析(雙擊點(diǎn)開查看)這兩個(gè)標(biāo)簽下的鏈接。如果點(diǎn)開鏈接打開的網(wǎng)頁中正好有那些沒有加載的數(shù)據(jù),則這些數(shù)據(jù)是通過該鏈接傳送的。再對(duì)該鏈接進(jìn)行規(guī)律分析,以后對(duì)該鏈接發(fā)送請(qǐng)求。
(2)使用PhantomJS模擬瀏覽器行為
使用PhantomJS模擬瀏覽器進(jìn)行發(fā)送請(qǐng)求,得到返回的內(nèi)容是完全的(ajax加載的數(shù)據(jù)也會(huì)有)。但是使用PhantomJS請(qǐng)求速度過慢,一般一個(gè)網(wǎng)頁4~5s時(shí)間,不能忍。一般要使用PhantomJS需要開多線程。
driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe') # 構(gòu)造網(wǎng)頁驅(qū)動(dòng) driver.get('https://www.zhihu.com/') print(driver.page_source) # 打印網(wǎng)頁內(nèi)容
總結(jié)
以上就是本文關(guān)于關(guān)于反爬蟲的一些簡(jiǎn)單總結(jié)的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- Nginx反爬蟲策略,防止UA抓取網(wǎng)站
- 詳解python 破解網(wǎng)站反爬蟲的兩種簡(jiǎn)單方法
- Python3爬蟲學(xué)習(xí)之應(yīng)對(duì)網(wǎng)站反爬蟲機(jī)制的方法分析
- python解決網(wǎng)站的反爬蟲策略總結(jié)
- python 常見的反爬蟲策略
- Python爬蟲與反爬蟲大戰(zhàn)
- Python反爬蟲偽裝瀏覽器進(jìn)行爬蟲
- python爬蟲 urllib模塊反爬蟲機(jī)制UA詳解
- 關(guān)于爬蟲和反爬蟲的簡(jiǎn)略方案分享
- 淺談Scrapy框架普通反爬蟲機(jī)制的應(yīng)對(duì)策略
- 網(wǎng)站反爬蟲策略
相關(guān)文章
Python中Parser的超詳細(xì)用法實(shí)例
Parser模塊為Python的內(nèi)部解析器和字節(jié)碼編譯器提供了一個(gè)接口,該接口的主要目的是允許Python代碼編輯Python表達(dá)式的分析樹并從中創(chuàng)建可執(zhí)行代碼,這篇文章主要給大家介紹了關(guān)于Python中Parser超詳細(xì)用法的相關(guān)資料,需要的朋友可以參考下2022-07-07Python基礎(chǔ)之變量的相關(guān)知識(shí)總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著Python變量展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Python GUI Tkinter簡(jiǎn)單實(shí)現(xiàn)個(gè)性簽名設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了Python GUI Tkinter簡(jiǎn)單實(shí)現(xiàn)個(gè)性簽名設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06pytorch實(shí)現(xiàn)focal loss的兩種方式小結(jié)
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)focal loss的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹
這篇文章主要介紹了Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05python把數(shù)據(jù)導(dǎo)出生成excel文件的方法小結(jié)
在Python中,將數(shù)據(jù)導(dǎo)出生成Excel文件,最常用的庫之一是openpyxl(用于處理.xlsx文件)和pandas,以下將分別介紹如何使用這兩個(gè)庫來生成Excel文件,感興趣的小伙伴跟著小編一起來看看吧2024-09-09