最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于反爬蟲的一些簡單總結(jié)

 更新時間:2017年12月13日 09:14:18   作者:超人Python  
這篇文章主要介紹了關(guān)于反爬蟲的一些簡單總結(jié),具有一定借鑒價值,需要的朋友可以參考下。

爬蟲與反爬蟲,這相愛相殺的一對,簡直可以寫出一部壯觀的斗爭史。而在大數(shù)據(jù)時代,數(shù)據(jù)就是金錢,很多企業(yè)都為自己的網(wǎng)站運用了反爬蟲機制,防止網(wǎng)頁上的數(shù)據(jù)被爬蟲爬走。然而,如果反爬機制過于嚴格,可能會誤傷到真正的用戶請求;如果既要和爬蟲死磕,又要保證很低的誤傷率,那么又會加大研發(fā)的成本。

簡單低級的爬蟲速度快,偽裝度低,如果沒有反爬機制,它們可以很快的抓取大量數(shù)據(jù),甚至因為請求過多,造成服務(wù)器不能正常工作。

1、爬取過程中的302重定向

在爬取某個網(wǎng)站速度過快或者發(fā)出的請求過多的時候,網(wǎng)站會向你所在的客戶端發(fā)送一個鏈接,需要你去驗證圖片。我在爬鏈家和拉鉤網(wǎng)的過程中就曾經(jīng)遇到過:

對于302重定向的問題,是由于抓取速度過快引起網(wǎng)絡(luò)流量異常,服務(wù)器識別出是機器發(fā)送的請求,于是將請求返回鏈接定到某一特定鏈接,大多是驗證圖片或空鏈接。

在這種時候,既然已經(jīng)被識別出來了,就使用代理ip再繼續(xù)抓取。

2、headers頭文件

有些網(wǎng)站對爬蟲反感,對爬蟲請求一律拒絕,這時候我們需要偽裝成瀏覽器,通過修改http中的headers來實現(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、模擬登陸

一般登錄的過程都伴隨有驗證碼,這里我們通過selenium自己構(gòu)造post數(shù)據(jù)進行提交,將返回驗證碼圖片的鏈接地址輸出到控制臺下,點擊圖片鏈接識別驗證碼,輸入驗證碼并提交,完成登錄。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys #
from selenium.webdriver.support.ui import WebDriverWait # WebDriverWait的作用是等待某個條件的滿足之后再往后運行
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ū)動

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')     # 截取當前頁面的圖片
input_solution = input('請輸入驗證碼 :')
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  # 用來定位當前頁面
# 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')  #截取當前頁面的圖片
sys.exit(0)
driver.quit() #退出驅(qū)動

這里面,PhantomJS是一個很棒的exe,下載地址:phantomjs。他可以模擬瀏覽器行為進行操作。當我們遇到JS渲染的網(wǎng)頁,在使用正則表達式、BS4和xpath . . . 都無法匹配出數(shù)據(jù)時(數(shù)據(jù)根本沒加載上),可以使用PhantomJS模擬瀏覽器行為發(fā)送請求,將會得到網(wǎng)頁的原始全部數(shù)據(jù)。

4、代理ip

當爬取速度過快時,當請求次數(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、驗證碼輸入

遇到驗證的問題,我一般都是人工識別:獲取驗證碼的鏈接再控制臺下 ——> 點擊鏈接識別驗證碼 ——> 在控制臺手動輸入驗證碼并提交。

6、ajax加載的數(shù)據(jù)

對于ajax加載的數(shù)據(jù),我們無論通過request或post方法請求得到的網(wǎng)頁都無法得到。

關(guān)于一個網(wǎng)頁是否是ajax加載數(shù)據(jù),我們只需將網(wǎng)頁內(nèi)容print到控制臺下,將其與網(wǎng)頁原始內(nèi)容進行比對,如果有數(shù)據(jù)缺失,那么這些數(shù)據(jù)就是ajax加載。例如:我們想獲取京東上商品的價格、銷量、好評等方面的數(shù)據(jù),但是請求返回的網(wǎng)頁中沒有這些數(shù)據(jù)。因為這些數(shù)據(jù)是ajax加載。對于ajax加載的頁面,一般有兩種方法。

(1)分析網(wǎng)頁

按F12打開瀏覽器調(diào)試工具,在Network下選擇XHR或Doc標簽,分析(雙擊點開查看)這兩個標簽下的鏈接。如果點開鏈接打開的網(wǎng)頁中正好有那些沒有加載的數(shù)據(jù),則這些數(shù)據(jù)是通過該鏈接傳送的。再對該鏈接進行規(guī)律分析,以后對該鏈接發(fā)送請求。

(2)使用PhantomJS模擬瀏覽器行為

使用PhantomJS模擬瀏覽器進行發(fā)送請求,得到返回的內(nèi)容是完全的(ajax加載的數(shù)據(jù)也會有)。但是使用PhantomJS請求速度過慢,一般一個網(wǎng)頁4~5s時間,不能忍。一般要使用PhantomJS需要開多線程。

driver = webdriver.PhantomJS(executable_path='C:\PyCharm 2016.2.3\phantomjs\phantomjs.exe') # 構(gòu)造網(wǎng)頁驅(qū)動
driver.get('https://www.zhihu.com/') 
print(driver.page_source) # 打印網(wǎng)頁內(nèi)容

總結(jié)

以上就是本文關(guān)于關(guān)于反爬蟲的一些簡單總結(jié)的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解

Python爬蟲實例爬取網(wǎng)站搞笑段子

如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Python使用keys() 獲取 Redis 數(shù)據(jù)庫中的所有鍵

    Python使用keys() 獲取 Redis 數(shù)據(jù)庫中的所有鍵

    哈希、列表、集合、排序集合、字符串、JSON 和流是 Redis 支持的眾多數(shù)據(jù)結(jié)構(gòu)之一,本文將討論獲取 Redis 數(shù)據(jù)庫中的所有鍵,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • 利用Python?爬取股票實時數(shù)據(jù)詳情

    利用Python?爬取股票實時數(shù)據(jù)詳情

    這篇文章主要介紹了利用Python?爬取股票實時數(shù)據(jù)詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • python如何利用plt.legend()添加圖例代碼示例

    python如何利用plt.legend()添加圖例代碼示例

    用python的matplotlib畫圖時,往往需要加圖例說明,下面這篇文章主要給大家介紹了關(guān)于python如何利用plt.legend()添加圖例的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Python實現(xiàn)模塊熱加載的示例代碼

    Python實現(xiàn)模塊熱加載的示例代碼

    這篇文章主要為大家詳細介紹了Python實現(xiàn)模塊熱加載的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2023-12-12
  • Django入門優(yōu)缺點及環(huán)境搭建流程

    Django入門優(yōu)缺點及環(huán)境搭建流程

    這篇文章主要為大家介紹了Django入門優(yōu)缺點及環(huán)境搭建流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • pygame畫點線方法詳解

    pygame畫點線方法詳解

    這篇文章主要介紹了pygame畫點線的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • 簡單的Python調(diào)度器Schedule詳解

    簡單的Python調(diào)度器Schedule詳解

    這篇文章主要介紹了簡單的Python調(diào)度器Schedule詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • pytorch hook 鉤子函數(shù)的用法

    pytorch hook 鉤子函數(shù)的用法

    這篇文章主要介紹了pytorch hook 鉤子函數(shù)的用法,Hook 是 PyTorch 中一個十分有用的特性,使用后可以不必改變網(wǎng)絡(luò)輸入輸出的結(jié)構(gòu),方便地獲取、改變網(wǎng)絡(luò)中間層變量的值和梯度,下文詳細介紹需要的小伙伴可以參考一下
    2022-03-03
  • 利用?Python?把小伙伴制作成表情包

    利用?Python?把小伙伴制作成表情包

    這篇文章主要介紹了如何利用?Python把你的小伙伴變成表情包,在日常生活中,我們經(jīng)常會存取一些朋友們的丑照,在這個項目中,我們以萌萌噠的熊貓頭作為背景,然后試著在背景圖上加入朋友們的照片,下面詳細內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • Python數(shù)據(jù)可視化圖實現(xiàn)過程詳解

    Python數(shù)據(jù)可視化圖實現(xiàn)過程詳解

    這篇文章主要介紹了Python數(shù)據(jù)可視化圖實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06

最新評論

汉源县| 纳雍县| 诏安县| 营山县| 双牌县| 克山县| 乐业县| 神农架林区| 龙陵县| 芦山县| 个旧市| 常熟市| 霍邱县| 井研县| 平乡县| 黑龙江省| 南雄市| 西宁市| 响水县| 梁河县| 辽中县| 库尔勒市| 如东县| 德清县| 资兴市| 周口市| 蚌埠市| 青海省| 彭阳县| 麻江县| 宣恩县| 黔南| 隆昌县| 芜湖县| 蒙自县| 浙江省| 宁陕县| 新宾| 儋州市| 永宁县| 万安县|