2.python爬蟲偽裝
一. 需求:
1.由於某些網頁為了不讓爬蟲爬,有些時候會檢查瀏覽器頭Request Header,然後直接斷網不讓你爬。(如煎蛋網,學完可以去試試)
2.對於爬蟲的頻繁操作,有時候網頁可能看某一ip出現的次數太多也會將其斷網。
二. 偽裝瀏覽器頭(Request Header)
先上程式碼:
其中header這個字典的那些亂七八糟的東西,在瀏覽器右鍵->檢查->Network->左側Name第一個點一下->右側出現點header,如圖:def download_html(self, url): header = {'Cookie' : 'rpln_guide=1; TIEBA_USERTYPE=26aac53c8dd34f8265bc3afb; bdshare_firstime=1454400287585; BIDUPSID=445BDAE5291A8082504B28A8B222428F; BAIDUID=9898ADD03EE8046FCEF6715C7507BCA9FG=1; PSTM=1456401045; TIEBAUID=69f9537ad7e26c90dcfeb337; BDUSS=khLY1k5ajNtUDRJRHBLc0VDbkJ1Nm8yfmlGOS01bFJ4VUI0bkFSUGNHbEltMzlYQVFBQUFBJCQAAAAAAAAAAAEAAABLl9EpSDk5MjEwOTg5OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgOWFdIDlhXW; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=1447_19860_17001_11506_20592_20848_20856_20836_20771_20781; LONGID=701601611; wise_device=0', 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36', 'Referer' : 'http//tieba.baidu.com/p/4730677633?see_lz=1&pn=2', 'Host' : 'tieba.baidu.com', #'Accept-Encoding' : 'gzip, deflate, sdch', 'Accept-Language' : 'zh-CN,zh;q=0.8', 'Connection' : 'keep-alive', 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Upgrade-Insecure-Requests' : '1', } request = urllib2.Request(url, None, header) response = urllib2.urlopen(request) return response.read()
一個一個改就行了,或者用我自己寫的自動化工具,將原文複製之後跑一下,生成res.txt裡面文字直接複製就可以,不用手動每個都自己改。
附上自動化工具程式碼:
if __name__ == "__main__": dic = {} while True: s = raw_input() if len(s) == 0: break list = s.split(':') key = '\'' + list[0] + '\'' value = '\'' for s in list[1:]: value += s value += '\'' + ',' dic[key] = value fout = open("res.txt", "w") for key in dic.keys(): fout.write( "%s : %s\n" %(key, dic[key]))
其實一般情況下只要修改user-agent就好了,有些網站防盜鏈可能需要修改Referer。
三. 偽裝IP
這是因為有些網頁不讓同一個ip對其頻繁訪問,於是禁止某一個ip。
法一:
可以通過修改X-Forwarded-For,偽裝成多個ip來進行抓取。程式碼如下:
def download_html(url): ip = ['121.31.159.197', '175.30.238.78', '124.202.247.110'] header = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36', 'X-Forwarded-For': ip[random.randint(0, 2)]} request = urllib2.Request(url, None, header) response = urllib2.urlopen(request) return response.read()
可以嘗試抓取https://www.whatismyip.com/?iref=home上面的ip地址,來驗證自己當前的ip。程式程式碼如下:
# -*- coding: UTF-8 -*-
import random
import urllib2
from bs4 import BeautifulSoup
def parser(url, html):
data = {}
soup = BeautifulSoup(html, "html.parser")
#<div class="ip">
summary = soup.find('div', class_ = "ip")
data['summary'] = summary.get_text()
return data
def download_html(url):
ip = ['121.31.159.197', '175.30.238.78', '124.202.247.110']
header = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',
'X-Forwarded-For': ip[random.randint(0, 2)]}
request = urllib2.Request(url, None, header)
response = urllib2.urlopen(request)
return response.read()
def output(data):
print data['summary']
if __name__ == "__main__":
url = "https://www.whatismyip.com/"
html = download_html(url)
data = parser(url, html)
output(data)
不過這種方法實際上還是使用當前的ip進行抓取,如果真正要使用別的ip要用以下方法。
法二:
對於我們使用urllib2.urlopen(url)的過程,實際上是先產生一個opener,然後用這個opener去開啟網頁,opener是一個OpenerDirector()類的物件,我們可以用urllib2.build_opener(ProxyHandler)來建立一個opener,裡面的引數是一個handler,用來管理代理,cookies等一切亂七八糟的東西。修改ip的handler是一個ProxyHandler類的例項。
如果加入urllib2.install_opener(opener),那麼urllib2的opener就是全域性的,也就是說,用urllib2.urlopen()的時候用的就是這個已經被安裝的opener,當然可以直接用這個opener.open(url)去開啟一個url。
過程如下:
1. 生成一個處理器opener = OpenerDirector()物件。
2. 給這個處理器物件加入處理器opener.add_handler(handler)
3. 使用開啟方法,即opener.open(url)
ProxyHandler = urllib2.ProxyHandler({'https': 'http://61.191.198.174/'})
opener = urllib2.build_opener(ProxyHandler)
urllib2.install_opener(opener)
request = urllib2.Request(url, None, header)
response = opener.open(request)
但是使用這種方法,如果找不到合適的代理,是打不開網頁的。