詳解python 破解網(wǎng)站反爬蟲的兩種簡(jiǎn)單方法
最近在學(xué)爬蟲時(shí)發(fā)現(xiàn)許多網(wǎng)站都有自己的反爬蟲機(jī)制,這讓我們沒(méi)法直接對(duì)想要的數(shù)據(jù)進(jìn)行爬取,于是了解這種反爬蟲機(jī)制就會(huì)幫助我們找到解決方法。
常見(jiàn)的反爬蟲機(jī)制有判別身份和IP限制兩種,下面我們將一一來(lái)進(jìn)行介紹。
(一) 判別身份
首先我們看一個(gè)例子,看看到底什么時(shí)反爬蟲。
我們還是以 豆瓣電影榜top250(https://movie.douban.com/top250) 為例。`
import requests # 豆瓣電影榜top250的網(wǎng)址 url = 'https://movie.douban.com/top250' # 請(qǐng)求與網(wǎng)站的連接 res = requests.get(url) # 打印獲取的文本 print(res.text)
這是段簡(jiǎn)單的請(qǐng)求與網(wǎng)站連接并打印獲取數(shù)據(jù)的代碼,我們來(lái)看看它的運(yùn)行結(jié)果。
我們可以發(fā)現(xiàn)我們什么數(shù)據(jù)都沒(méi)有獲取到,這就是由于這個(gè)網(wǎng)站有它的身份識(shí)別功能,把我們識(shí)別為了爬蟲,拒絕為我們提供數(shù)據(jù)。不管是瀏覽器還是爬蟲訪問(wèn)網(wǎng)站時(shí)都會(huì)帶上一些信息用于身份識(shí)別。而這些信息都被存儲(chǔ)在一個(gè)叫請(qǐng)求頭(request headers) 的地方。而這個(gè)請(qǐng)求頭中我們只需要了解其中的一個(gè)叫user-agent(用戶代理) 的就可以了。user-agent里包含了操作系統(tǒng)、瀏覽器類型、版本等信息,通過(guò)修改它我們就能成功地偽裝成瀏覽器。
下面我們來(lái)看怎么找這個(gè)user-agent吧。
首先得打開(kāi)瀏覽器,隨便打開(kāi)一個(gè)網(wǎng)站,再打開(kāi)開(kāi)發(fā)者工具。
再點(diǎn)擊network標(biāo)簽,接著點(diǎn)第一個(gè)請(qǐng)求,再找到Request Headers,最后找到user-agent字段。(有時(shí)候可能點(diǎn)擊network標(biāo)簽后是空白得,這時(shí)候刷新下網(wǎng)頁(yè)就好啦!)
找到請(qǐng)求頭后,我們只需要把他放進(jìn)一個(gè)字典里就好啦,具體操作見(jiàn)下面代碼。
import requests # 復(fù)制剛才獲取得請(qǐng)求頭 headers = { 'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } # 豆瓣電影榜top250的網(wǎng)址 url = 'https://movie.douban.com/top250' # 請(qǐng)求與網(wǎng)站的連接 res = requests.get(url, headers=headers) # 打印獲取的文本 print(res.text)
現(xiàn)在我們?cè)賮?lái)看部分輸出結(jié)果。
我們可以發(fā)現(xiàn)已經(jīng)將該網(wǎng)站的HTML文件全部爬取到了,至此第一種方法就將完成了。下面我們來(lái)看第二種方法。
(二) IP限制
IP(Internet Protocol) 全稱互聯(lián)網(wǎng)協(xié)議地址,意思是分配給用戶上網(wǎng)使用的網(wǎng)際協(xié)議的設(shè)備的數(shù)字標(biāo)簽。它就像我們身份證號(hào)一樣,只要知道你的身份證號(hào)就能查出你是哪個(gè)人。
當(dāng)我們爬取大量數(shù)據(jù)時(shí),如果我們不加以節(jié)制地訪問(wèn)目標(biāo)網(wǎng)站,會(huì)使網(wǎng)站超負(fù)荷運(yùn)轉(zhuǎn),一些個(gè)人小網(wǎng)站沒(méi)什么反爬蟲措施可能因此癱瘓。而大網(wǎng)站一般會(huì)限制你的訪問(wèn)頻率,因?yàn)檎H耸遣粫?huì)在 1s 內(nèi)訪問(wèn)幾十次甚至上百次網(wǎng)站的。所以,如果你訪問(wèn)過(guò)于頻繁,即使改了 user-agent 偽裝成瀏覽器了,也還是會(huì)被識(shí)別為爬蟲,并限制你的 IP 訪問(wèn)該網(wǎng)站。
因此,我們常常使用 time.sleep() 來(lái)降低訪問(wèn)的頻率,比如上一篇博客中的爬取整個(gè)網(wǎng)站的代碼,我們每爬取一個(gè)網(wǎng)頁(yè)就暫停一秒。
import requests import time from bs4 import BeautifulSoup # 將獲取豆瓣電影數(shù)據(jù)的代碼封裝成函數(shù) def get_douban_movie(url): # 設(shè)置反爬蟲的請(qǐng)求頭 headers = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' } # 請(qǐng)求網(wǎng)站的連接 res = requests.get('https://movie.douban.com/top250', headers=headers) # 將網(wǎng)站數(shù)據(jù)存到BeautifulSoup對(duì)象中 soup = BeautifulSoup(res.text,'html.parser') # 爬取網(wǎng)站中所有標(biāo)簽為'div',并且class='pl2'的數(shù)據(jù)存到Tag對(duì)象中 items = soup.find_all('div', class_='hd') for i in items: # 再篩選出所有標(biāo)簽為a的數(shù)據(jù) tag = i.find('a') # 只讀取第一個(gè)class='title'作為電影名 name = tag.find(class_='title').text # 爬取書名對(duì)應(yīng)的網(wǎng)址 link = tag['href'] print(name,link) url = 'https://movie.douban.com/top250?start={}&filter=' # 將所有網(wǎng)址信息存到列表中 urls = [url.format(num*25) for num in range(10)] for item in urls: get_douban_movie(item) # 暫停 1 秒防止訪問(wèn)太快被封 time.sleep(1)
部分運(yùn)行結(jié)果:
至此兩種比較簡(jiǎn)單的應(yīng)對(duì)反爬蟲方法就講完啦,希望能對(duì)大家有所幫助,如果有問(wèn)題,請(qǐng)及時(shí)給予我指正,感激不盡!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Python中操作時(shí)間之mktime()方法的使用教程
這篇文章主要介紹了在Python中操作時(shí)間之mktime()方法的使用教程,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python+Tkinter實(shí)現(xiàn)簡(jiǎn)單的畫圖軟件
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Tkinter實(shí)現(xiàn)編寫一個(gè)簡(jiǎn)單的畫圖軟件,可以實(shí)現(xiàn)畫圖、保存、撤銷等功能,感興趣的可以了解一下2023-04-04使用numpy和PIL進(jìn)行簡(jiǎn)單的圖像處理方法
今天小編就為大家分享一篇使用numpy和PIL進(jìn)行簡(jiǎn)單的圖像處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python 實(shí)現(xiàn)12306登錄功能實(shí)例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)12306登錄功能的完整代碼,需要的朋友可以參考下2018-02-02