爬蟲:
我們爲了獲得任何信息而採用任何手段對某一個網站進行的‘攻擊’行爲,之所以稱之爲‘攻擊行爲’,主要是因爲我們對網站的爬蟲過程會對網站造成不同程度上的影響。而爬蟲與我們手動點擊訪問網站數據的區別主要就在於這個是批量的操作
反爬蟲:
網站爲了維護自己的核心安全而採取的抑制爬蟲的手段
常見的反爬機制:
1、基於User-Agent反爬
思想:
服務器後臺訪問的User-Agent進行統計,單位時間內同一個User-Agent訪問的次數超過特定的閥值,就會被不同程度的封禁IP,從而造成無法進行爬取的狀況
解決:
方案一:
將常見的User-Agent封裝到一個文件中,別人總結好的常用的User-Agent鏈接:https://www.cnblogs.com/zrmw/p/9332801.html
在爬取的過程中首先導入這個文件,然後隨機選擇這裏面的某一個User-Agent
方案二:
在python中使用第三方類庫:fake_useragent ,生成隨機的User-Agent
2、基於IP反爬
思想:
後端服務器對訪問進行統計,單位時間內同一個IP地址訪問的次數超過一個特定的值,就會不同程度的封禁IP,導致無法進行相關的爬蟲操作
解決方案:
使用不同的IP進行訪問,設置一定的訪問停滯,random.sleep(3)
常見的就是購買專業代理構建可用代理池。可以免費或者花錢購買可用的IP地址,但是免費的有很多是不可用的(雖然收費的也有很多不可以用)
西刺代理網址:https://www.xicidaili.com/
構建代理池的方法:
前期準備:
註冊西刺賬戶、購買專業版代理,購買完成之後,獲取API並複製下來,實現以下代碼來構建代理池
import requests from lxml import etree from fake_useragent import UserAgent # 獲取User-Agent def get_random_ua(): ua = UserAgent() return ua.random # 購買代理後複製的API粘貼到此處 url = 'API' # 獲取所有代理IP的地址和端口號 # [{'http':'http://xxxx:xx','https':'https://xxxx:xxx'},] def get_ip_list(): # 獲取user-agent headers = { 'User-Agent' : get_random_ua() } # 已知的可用代理IP proxies = { 'http': 'http://182.35.81.10:9999', 'https': 'https://182.35.81.10:9999' } html = requests.get(url,proxies=proxies,headers=headers).text # 解析 parse_html = etree.HTML(html) # r_list: [<element tr at xxx>,<element tr at xxx>] r_list = parse_html.xpath('//tr') # 空列表,存放所有ip和port proxy_list = [] # 依次遍歷 for r in r_list[1:]: ip = r.xpath('./td[2]/text()')[0] port = r.xpath('./td[3]/text()')[0] proxy_list.append( { 'http':'http://{}:{}'.format(ip,port), 'https':'https://{}:{}'.format(ip,port) } ) # proxy_list: [{},{},{},{}] return proxy_list # 測試代理,建立代理IP池 def proxy_pool(): # 調用上面函數 proxy_list = get_ip_list() # 可用代理IP列表 useful_proxy = [] # 測試代理是否可用 for proxy in proxy_list: # proxy: {'http':'http://xxxx:xx'} headers = {'User-Agent':get_random_ua()} try: res = requests.get( url = 'http://httpbin.org/get', headers=headers, proxies = proxy, timeout = 5 ) print(res.text) useful_proxy.append(proxy) except Exception as e: print('{}不能用'.format(proxy)) continue return useful_proxy if __name__ == '__main__': proxy_pool() #useful_proxy即爲我們構建的代理池。
3、動態頁面抓包
思想:
當我們進入到某個網頁的時候,我們想通過查看源代碼解析頁面上的結構,看到的內容卻不是我們網頁顯示的內容;或者,當我們瀏覽網站的時候網頁結構顯示不全,只有滑動鼠標才能將剩餘的信息顯示出來,這時候我們就需要手動抓包來進行分析了
解決
打開頁面->查看網頁源代碼->搜索關鍵字,發現搜索不到關鍵字,這個其實就是我們所說的動態頁面。這個時候按F12進行刷新頁面,在network的左側一欄可以找到很多個包,查看headers中的requets-url,此時滾動鼠標或者其他方式查看頁面的另一條數據,方法相同,查看requests-url,對比這兩個url的不同點,然後發現裏面的規律並進行分析