最近在學爬蟲時發(fā)現(xiàn)許多網(wǎng)站都有自己的反爬蟲機制,這讓我們沒法直接對想要的數(shù)據(jù)進行爬取,于是了解這種反爬蟲機制就會幫助我們找到解決方法。
常見的反爬蟲機制有判別身份和IP限制兩種,下面我們將一一來進行介紹。
(一) 判別身份
首先我們看一個例子,看看到底什么時候反爬蟲。
我們還是以 豆瓣電影榜top250(https://movie.douban.com/top250) 為例。
import requests
# 豆瓣電影榜top250的網(wǎng)址url = ‘https://movie.douban.com/top250’# 請求與網(wǎng)站的連接res = requests.get(url)# 打印獲取的文本print(res.text)
這是段簡單的請求與網(wǎng)站連接并打印獲取數(shù)據(jù)的代碼,我們來看看它的運行結(jié)果。
我們可以發(fā)現(xiàn)我們什么數(shù)據(jù)都沒有獲取到,這就是由于這個網(wǎng)站有它的身份識別功能,把我們識別為了爬蟲,拒絕為我們提供數(shù)據(jù)。不管是瀏覽器還是爬蟲訪問網(wǎng)站時都會帶上一些信息用于身份識別。而這些信息都被存儲在一個叫請求頭(request headers) 的地方。而這個請求頭中我們只需要了解其中的一個叫user-agent(用戶代理) 的就可以了。user-agent里包含了操作系統(tǒng)、瀏覽器類型、版本等信息,通過修改它我們就能成功地偽裝成瀏覽器。
下面我們來看怎么找這個user-agent吧。
首先得打開瀏覽器,隨便打開一個網(wǎng)站,再打開開發(fā)者工具。
再點擊network標簽,接著點第一個請求,再找到Request Headers,最后找到user-agent字段。(有時候可能點擊network標簽后是空白的,這時候刷新下網(wǎng)頁就好啦!)
找到請求頭后,我們只需要把他放進一個字典里就好啦,具體操作見下面代碼。
import requests
# 復制剛才獲取得請求頭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’# 請求與網(wǎng)站的連接res = requests.get(url, headers=headers)# 打印獲取的文本print(res.text)
現(xiàn)在我們再來看部分輸出結(jié)果。
我們可以發(fā)現(xiàn)已經(jīng)將該網(wǎng)站的HTML文件全部爬取到了,至此第一種方法就將完成了。下面我們來看第二種方法。
(二) IP限制
IP(Internet Protocol) 全稱互聯(lián)網(wǎng)協(xié)議地址,意思是分配給用戶上網(wǎng)使用的網(wǎng)際協(xié)議的設備的數(shù)字標簽。它就像我們身份證號一樣,只要知道你的身份證號就能查出你是哪個人。
當我們爬取大量數(shù)據(jù)時,如果我們不加以節(jié)制地訪問目標網(wǎng)站,會使網(wǎng)站超負荷運轉(zhuǎn),一些個人小網(wǎng)站沒什么反爬蟲措施可能因此癱瘓。而大網(wǎng)站一般會限制你的訪問頻率,因為正常人是不會在 1s 內(nèi)訪問幾十次甚至上百次網(wǎng)站的。所以,如果你訪問過于頻繁,即使改了 user-agent 偽裝成瀏覽器了,也還是會被識別為爬蟲,并限制你的 IP 訪問該網(wǎng)站。
因此,我們常常使用 time.sleep() 來降低訪問的頻率,比如上一篇博客中的爬取整個網(wǎng)站的代碼,我們每爬取一個網(wǎng)頁就暫停一秒。
import requestsimport timefrom bs4 import BeautifulSoup
# 將獲取豆瓣電影數(shù)據(jù)的代碼封裝成函數(shù)def get_douban_movie(url):# 設置反爬蟲的請求頭 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’ }
# 請求網(wǎng)站的連接 res = requests.get(‘https://movie.douban.com/top250’, headers=headers)# 將網(wǎng)站數(shù)據(jù)存到BeautifulSoup對象中 soup = BeautifulSoup(res.text,‘html.parser’)# 爬取網(wǎng)站中所有標簽為‘div’,并且class=‘pl2’的數(shù)據(jù)存到Tag對象中 items = soup.find_all(‘div’, class_=‘hd’)for i in items:# 再篩選出所有標簽為a的數(shù)據(jù) tag = i.find(‘a(chǎn)’)# 只讀取第一個class=‘title’作為電影名 name = tag.find(class_=‘title’).text# 爬取書名對應的網(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 秒防止訪問太快被封 time.sleep(1)
至此兩種比較簡單的應對反爬蟲方法就講完啦,希望能對大家有所幫助,如果有問題,請及時給予我指正,感激不盡!
原文鏈接:https://blog.csdn.net/qq_41564422/article/details/104212511
(版權(quán)歸原作者所有,侵刪)
編輯:jq
-
爬蟲
+關(guān)注
關(guān)注
0文章
82瀏覽量
6868
原文標題:詳解python 破解網(wǎng)站反爬蟲的兩種簡單方法
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論