摘要:返回結(jié)果如下,接下來我們便開始爬取西刺代理,首先我們打開瀏覽器查看網(wǎng)頁,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重復(fù)的等待秒將要爬取頁數(shù)的爬取好后存入數(shù)組,然后再對(duì)其中的逐一測(cè)試。
有時(shí)候在網(wǎng)站看小說,會(huì)莫名跳出來一個(gè)“疑似機(jī)器惡意爬取,暫時(shí)無法訪問”這樣類似的網(wǎng)站提示,需要刷新一下或者輸入一個(gè)驗(yàn)證碼才能重新進(jìn)入,這樣的情況偶有發(fā)生,相信大家都有遇到過。出現(xiàn)這個(gè)現(xiàn)象的原因就是我們?yōu)g覽的網(wǎng)頁采取了反爬蟲的措施,特別做爬蟲爬取網(wǎng)頁,在某個(gè)ip單位時(shí)間請(qǐng)求網(wǎng)頁次數(shù)過多時(shí),服務(wù)器會(huì)拒絕服務(wù),這種情況就是由于訪問頻率引起的封ip,這種情況靠解封不能很好的解決,所以我們就想到了偽裝本機(jī)ip去請(qǐng)求網(wǎng)頁,也就是我們今天要講的使用代理ip。
目前網(wǎng)上有許多代理ip,有免費(fèi)的也有付費(fèi)的,例如西刺代理,豌豆代理,快代理等等,免費(fèi)的雖然不用花錢但有效的代理很少且不穩(wěn)定,付費(fèi)的可能會(huì)好一點(diǎn),不過今天我只爬取免費(fèi)的西刺代理并將檢測(cè)是否可用,將可用ip存入MongoDB,方便下次取出。
運(yùn)行平臺(tái):Windows
Python版本:Python3.6
IDE: Sublime Text
其他:Chrome瀏覽器
簡(jiǎn)述流程為:
步驟1:了解requests代理如何使用
步驟2:從西刺代理網(wǎng)頁爬取到ip和端口
步驟3:檢測(cè)爬取到的ip是否可用
步驟4:將爬取的可用代理存入MongoDB
步驟5:從存入可用ip的數(shù)據(jù)庫里隨機(jī)抽取一個(gè)ip,測(cè)試成功后返回
對(duì)于requests來說,代理的設(shè)置比較簡(jiǎn)單,只需要傳入proxies參數(shù)即可。
不過需要注意的是,這里我是在本機(jī)安裝了抓包工具Fiddler,并用它在本地端口8888創(chuàng)建了一個(gè)HTTP代理服務(wù)(用Chrome插件SwitchyOmega),即代理服務(wù)為:127.0.0.1:8888,我們只要設(shè)置好這個(gè)代理,就可以成功將本機(jī)ip切換成代理軟件連接的服務(wù)器ip了。
import requests proxy = "127.0.0.1:8888" proxies = { "http":"http://" + proxy, "https":"http://" + proxy } try: response = requests.get("http://httpbin.org/get",proxies=proxies) print(response.text) except requests.exceptions.ConnectionError as e: print("Error",e.args)
這里我是用來http://httpbin.erg/get作為測(cè)...,我們?cè)L問該網(wǎng)頁可以得到請(qǐng)求的有關(guān)信息,其中origin字段就是客戶端ip,我們可以根據(jù)返回的結(jié)果判斷代理是否成功。返回結(jié)果如下:
{
"args":{}, "headers":{ "Accept":"*/*", "Accept-Encoding":"gzip, deflate", "Connection":"close", "Host":"httpbin.org", "User-Agent":"python-requests/2.18.4" }, "origin":"xx.xxx.xxx.xxx", "url":"http://httpbin.org/get"
}
接下來我們便開始爬取西刺代理,首先我們打開Chrome瀏覽器查看網(wǎng)頁,并找到ip和端口元素的信息。
可以看到,西刺代理以表格存儲(chǔ)ip地址及其相關(guān)信息,所以我們用BeautifulSoup提取時(shí)很方便便能提取出相關(guān)信息,但是我們需要注意的是,爬取的ip很有可能出現(xiàn)重復(fù)的現(xiàn)象,尤其是我們同時(shí)爬取多個(gè)代理網(wǎng)頁又存儲(chǔ)到同一數(shù)組中時(shí),所以我們可以使用集合來去除重復(fù)的ip。
27def scrawl_xici_ip(num): 28 """ 29 爬取代理ip地址,代理的url是西刺代理 30 """ 31 ip_list = [] 32 for num_page in range(1,num): 33 url = url_ip + str(num_page) 34 response = requests.get(url,headers=headers) 35 if response.status_code == 200: 36 content = response.text 37 soup = BeautifulSoup(content,"lxml") 38 trs = soup.find_all("tr") 39 for i in range(1,len(trs)): 40 tr = trs[i] 41 tds = tr.find_all("td") 42 ip_item = tds[1].text + ":" + tds[2].text 43 # print(ip_item) 44 ip_list.append(ip_item) 45 ip_set = set(ip_list) # 去掉可能重復(fù)的ip 46 ip_list = list(ip_set) 47 time.sleep(count_time) # 等待5秒 48 return ip_list
將要爬取頁數(shù)的ip爬取好后存入數(shù)組,然后再對(duì)其中的ip逐一測(cè)試。
51def ip_test(url_for_test,ip_info): 52 """ 53 測(cè)試爬取到的ip,測(cè)試成功則存入MongoDB 54 """ 55 for ip_for_test in ip_info: 56 # 設(shè)置代理 57 proxies = { 58 "http": "http://" + ip_for_test, 59 "https": "http://" + ip_for_test, 60 } 61 print(proxies) 62 try: 63 response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10) 64 if response.status_code == 200: 65 ip = {"ip":ip_for_test} 66 print(response.text) 67 print("測(cè)試通過") 68 write_to_MongoDB(ip) 69 except Exception as e: 70 print(e) 71 continue
這里就用到了上面提到的requests設(shè)置代理的方法,我們使用http://httpbin.org/ip作為測(cè)試...,它可以直接返回我們的ip地址,測(cè)試通過后再存入MomgoDB數(shù)據(jù)庫。
存入MongoDB的方法在上一篇糗事百科爬取已經(jīng)提過了。連接數(shù)據(jù)庫然后指定數(shù)據(jù)庫和集合,再將數(shù)據(jù)插入就OK了。
74def write_to_MongoDB(proxies): 75 """ 76 將測(cè)試通過的ip存入MongoDB 77 """ 78 client = pymongo.MongoClient(host="localhost",port=27017) 79 db = client.PROXY 80 collection = db.proxies 81 result = collection.insert(proxies) 82 print(result) 83 print("存儲(chǔ)MongoDB成功")
最后運(yùn)行查看一下結(jié)果吧
如果對(duì)Python編程、網(wǎng)絡(luò)爬蟲、機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、web開發(fā)、人工智能、面試經(jīng)驗(yàn)交流。感興趣可以519970686,群內(nèi)會(huì)有不定期的發(fā)放免費(fèi)的資料鏈接,這些資料都是從各個(gè)技術(shù)網(wǎng)站搜集、整理出來的,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我,我會(huì)注明出處之后分享給大家。
稍等,運(yùn)行了一段時(shí)間后,難得看到一連三個(gè)測(cè)試通過,趕緊截圖保存一下,事實(shí)上是,畢竟是免費(fèi)代理,有效的還是很少的,并且存活時(shí)間確實(shí)很短,不過,爬取的量大,還是能找到可用的,我們只是用作練習(xí)的話,還是勉強(qiáng)夠用的。現(xiàn)在看看數(shù)據(jù)庫里存儲(chǔ)的吧。
因?yàn)榕廊〉捻摂?shù)不多,加上有效ip也少,再加上我沒怎么爬,所以現(xiàn)在數(shù)據(jù)庫里的ip并不多,不過也算是將這些ip給存了下來。現(xiàn)在就來看看怎么隨機(jī)取出來吧。
85 86def get_random_ip(): 87 """ 88 隨機(jī)取出一個(gè)ip 89 """ 90 client = pymongo.MongoClient(host="localhost",port=27017) 91 db = client.PROXY 92 collection = db.proxies 93 items = collection.find() 94 length = items.count() 95 ind = random.randint(0,length-1) 96 useful_proxy = items[ind]["ip"].replace(" ","") 97 proxy = { 98 "http": "http://" + useful_proxy, 99 "https": "http://" + useful_proxy, 100 } 101 response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10) 102 if response.status_code == 200: 103 return useful_proxy 104 else: 105 print("此{(lán)ip}已失效".format(useful_proxy)) 106 collection.remove(useful_proxy) 107 print("已經(jīng)從MongoDB移除") 108 get_random_ip() 109
由于擔(dān)心放入數(shù)據(jù)庫一段時(shí)間后ip會(huì)失效,所以取出前我重新進(jìn)行了一次測(cè)試,如果成功再返回ip,不成功的話就直接將其移出數(shù)據(jù)庫。
這樣我們需要使用代理的時(shí)候,就能通過數(shù)據(jù)庫隨時(shí)取出來了。
總的代碼如下:
import random import requests import time import pymongo from bs4 import BeautifulSoup # 爬取代理的URL地址,選擇的是西刺代理 url_ip = "http://www.xicidaili.com/nt/" # 設(shè)定等待時(shí)間 set_timeout = 5 # 爬取代理的頁數(shù),2表示爬取2頁的ip地址 num = 2 # 代理的使用次數(shù) count_time = 5 # 構(gòu)造headers headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"} # 測(cè)試ip的URL url_for_test = "http://httpbin.org/ip" def scrawl_xici_ip(num): """ 爬取代理ip地址,代理的url是西刺代理 """ ip_list = [] for num_page in range(1,num): url = url_ip + str(num_page) response = requests.get(url,headers=headers) if response.status_code == 200: content = response.text soup = BeautifulSoup(content,"lxml") trs = soup.find_all("tr") for i in range(1,len(trs)): tr = trs[i] tds = tr.find_all("td") ip_item = tds[1].text + ":" + tds[2].text # print(ip_item) ip_list.append(ip_item) ip_set = set(ip_list) # 去掉可能重復(fù)的ip ip_list = list(ip_set) time.sleep(count_time) # 等待5秒 return ip_list def ip_test(url_for_test,ip_info): """ 測(cè)試爬取到的ip,測(cè)試成功則存入MongoDB """ for ip_for_test in ip_info: # 設(shè)置代理 proxies = { "http": "http://" + ip_for_test, "https": "http://" + ip_for_test, } print(proxies) try: response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10) if response.status_code == 200: ip = {"ip":ip_for_test} print(response.text) print("測(cè)試通過") write_to_MongoDB(ip) except Exception as e: print(e) continue def write_to_MongoDB(proxies): """ 將測(cè)試通過的ip存入MongoDB """ client = pymongo.MongoClient(host="localhost",port=27017) db = client.PROXY collection = db.proxies result = collection.insert(proxies) print(result) print("存儲(chǔ)MongoDB成功") def get_random_ip(): """ 隨機(jī)取出一個(gè)ip """ client = pymongo.MongoClient(host="localhost",port=27017) db = client.PROXY collection = db.proxies items = collection.find() length = items.count() ind = random.randint(0,length-1) useful_proxy = items[ind]["ip"].replace(" ","") proxy = { "http": "http://" + useful_proxy, "https": "http://" + useful_proxy, } response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10) if response.status_code == 200: return useful_proxy else: print("此{(lán)ip}已失效".format(useful_proxy)) collection.remove(useful_proxy) print("已經(jīng)從MongoDB移除") get_random_ip() def main(): ip_info = [] ip_info = scrawl_xici_ip(2) sucess_proxy = ip_test(url_for_test,ip_info) finally_ip = get_random_ip() print("取出的ip為:" + finally_ip) if __name__ == "__main__": main()
【給技術(shù)人一點(diǎn)關(guān)愛!!!】
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/19405.html
摘要:返回結(jié)果如下,接下來我們便開始爬取西刺代理,首先我們打開瀏覽器查看網(wǎng)頁,并找到和端口元素的信息。爬取代理地址,代理的是西刺代理去掉可能重復(fù)的等待秒將要爬取頁數(shù)的爬取好后存入數(shù)組,然后再對(duì)其中的逐一測(cè)試。 有時(shí)候在網(wǎng)站看小說,會(huì)莫名跳出來一個(gè)疑似機(jī)器惡意爬取,暫時(shí)無法訪問這樣類似的網(wǎng)站提示,需要刷新一下或者輸入一個(gè)驗(yàn)證碼才能重新進(jìn)入,這樣的情況偶有發(fā)生,相信大家都有遇到過。出現(xiàn)這個(gè)現(xiàn)象的...
摘要:準(zhǔn)備工作查看肯德基官網(wǎng)的請(qǐng)求方法請(qǐng)求。判斷得肯德基官網(wǎng)是請(qǐng)求通過這兩個(gè)準(zhǔn)備步驟,明確本次爬蟲目標(biāo)的請(qǐng)求肯德基官網(wǎng)獲取上海肯德基地點(diǎn)前頁。構(gòu)造不難發(fā)現(xiàn),肯德基官網(wǎng)的的一個(gè)共同點(diǎn),我們把它保存為。 ...
摘要:發(fā)布不到兩天,上數(shù)已近,這個(gè)業(yè)界大熱的史上最輕量的開源發(fā)行版,你試過了沒資深架構(gòu)師來教你走出嘗鮮第一步使用教程在此前言昨天,正式發(fā)布了一款史上最輕量的開源發(fā)行版。大小只有,極簡(jiǎn),輕便,易于使用。 發(fā)布不到兩天,GitHub上Star數(shù)已近3000,這個(gè)業(yè)界大熱的、史上最輕量的開源Kubernetes發(fā)行版,你試過了沒? Rancher資深架構(gòu)師來教你走出嘗鮮第一步!使用教程在此! sh...
摘要:以上是如果你想精通網(wǎng)絡(luò)爬蟲的學(xué)習(xí)研究路線,按照這些步驟學(xué)習(xí)下去,可以讓你的爬蟲技術(shù)得到非常大的提升。 作者:韋瑋 轉(zhuǎn)載請(qǐng)注明出處 隨著大數(shù)據(jù)時(shí)代的到來,人們對(duì)數(shù)據(jù)資源的需求越來越多,而爬蟲是一種很好的自動(dòng)采集數(shù)據(jù)的手段。 那么,如何才能精通Python網(wǎng)絡(luò)爬蟲呢?學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲的路線應(yīng)該如何進(jìn)行呢?在此為大家具體進(jìn)行介紹。 1、選擇一款合適的編程語言 事實(shí)上,Python、P...
閱讀 2329·2021-09-29 09:42
閱讀 564·2021-09-06 15:02
閱讀 2616·2021-09-02 15:40
閱讀 2121·2019-08-30 14:23
閱讀 1865·2019-08-30 13:48
閱讀 1296·2019-08-26 12:01
閱讀 966·2019-08-26 11:53
閱讀 2153·2019-08-23 18:31