最近看到一篇文章:「關于爬蟲,這裡有一份《中國焦慮圖鑒》」,對于爬蟲分析的很透徹,建議大家看一下。想圍觀的朋友自己搜尋題目就可以找到。
如果你要問我在哪裡搜尋,我隻會讓你試着自己找答案。因為在你學習的過程中一定會遇到各種各樣奇奇怪怪的問題,難道都要問别人嗎?在學校有老師解答你的疑惑,走出學校,我們要試着自己獨立解決問題。我經常去的Stack Overflow上面,别人提的問題都是經過自己獨立思考,看到提問者對問題的了解,為解決問題嘗試過哪些方法,最後還是沒有解決才來提問,希望我們也能如此。
不扯别的,我們知道在爬蟲中最重要的不是後兩步,即解析資料,儲存資料,最重要的還是請求資料。
在爬取小規模的網頁,資料規模不大,網頁沒有什麼反爬技術的情況下,我們的爬蟲還是很好玩的,一旦我們要爬取的網頁反爬很強,我們擷取的資料量又非常大時,我們很容易就會被封ip,一旦IP被封,爬蟲就無法繼續下去。
正常的僞造請求頭,構造參數已經沒有辦法解決我們的問題。
在爬蟲的世界裡,永遠都是跟網頁的反爬技術做鬥争,封了我們的ip,我們還可以僞造ip,今天就帶大家擷取一些免費的ip。
這裡請求的是一個國内免費的ip髙匿代理IP網站:http://www.xicidaili.com/nn/
請求一頁就可以了,今天的代碼幫助大家随機生成一個該網站上提供的ip位址。
請求網頁
classSpider():
'''随機擷取一個IP位址'''
def__get_page(self):
'''擷取資料,添加請求頭'''
url ='http://www.xicidaili.com/nn/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
r = requests.get(url,headers=headers)
ifr.status_code ==200:
print('爬取成功')
returnr.text
由于這個ip代理網站沒有什麼反爬技術,基本上帶個請求頭就可以了。
解析網頁
這裡用了兩種方式解析網頁
def__parse_page(self,html):
'''這裡用了兩種方式擷取解析IP,傳回一個ip清單'''
'''soup = BeautifulSoup(html,'lxml')
ips = soup.find_all('tr')#先找到節點tr
ip_list = []
for i in range(1,len(ips)):
ip_info = ips[i]
tds = ip_info.find_all('td')
ip_list.append(tds[1].text + ':' +tds[2].text)
return ip_list'''
data = etree.HTML(html)
items = data.xpath('//tr[@class="odd"]')
foriteminitems:
ips = item.xpath('./td[2]/text()')[0]
tds = item.xpath('./td[3]/text()')[0]
ip_list.append(ips +':'+ tds)
returnip_list
這裡比較來看,我還是傾向于用xpath,一來簡單,再者性能還好,相比較BeautifulSoup來說,性能就沒那麼好了。
處理資料
接下來是一個随機函數,生成一個随機ip位址:
def__get_random_ip(self,ip_list):
proxy_list = []
foripinip_list:
#周遊ip清單,添加http://
proxy_list.append('http://'+ ip)
proxy_ip = random.choice(proxy_list)#随機傳回一個ip
proxies = {'http':proxy_ip}#構造成字典。
returnproxies
defrun(self):
html =self.__get_page()
ip_list =self.__parse_page(html)
proxy =self.__get_random_ip(ip_list)
print(proxy)
if__name__=='__main__':
spider = Spider()
spider.run()
程式運作後,控制台輸出:
{'http':'http://110.73.8.27:8123'}
程式運作後随機生成一個ip位址,你可以拿去用,當然你也可以導入你需要僞裝ip的程式裡。
總結
看了開篇提到的那篇文章之後,結合最近看到聽到的消息,在想這樣一個問題「爬蟲犯法嗎?」
爬蟲犯不犯法,看你抓取的資料是什麼内容,就好比百度,谷歌的搜尋引擎每天在各個網站上爬到資料,展現給你。當然不犯法。
有位爬蟲大佬這樣說:
公開可查的就可以爬,這個就沒啥事。那些用某些特殊權限的賬号登入才可以的那就比較危險。還有必須破解才能爬的就構成犯罪了,另外,都建議使用代理ip,一個反爬,一個隐藏真實ip。是以對于我們小白來說完全沒有問題,隻要不觸碰一些敏感未公開的資料就沒事。
公衆号sixkery,專注于python爬蟲。有任何學習上的問題都可以背景聯系我哦