python爬蟲之抓取代理伺服器IP
轉載請標明出處:
http://blog.csdn.net/hesong1120/article/details/78990975
本文出自:hesong的專欄
前言
使用爬蟲爬取網站的資訊常常會遇到的問題是,你的爬蟲行為被對方識別了,對方把你的IP遮蔽了,返回不了正常的資料給你。那麼這時候就需要使用代理伺服器IP來偽裝你的請求了。
免費代理伺服器網站有:
- 西刺免費代理IP
- 快代理
- 66免費代理
下面我們以西刺免費代理IP為例子看看是如何獲取可用IP的。主要分為以下幾個步驟:
1. 請求url,獲取網頁資料
2. 解析網頁資料,找到包含【IP地址】和【埠】資訊的節點,解析出這兩個資料
3. 驗證取得的【IP地址】和【埠】資訊是否可用
4. 將驗證可用的【IP地址】和【埠】資訊儲存起來(暫存到列表,或儲存到檔案,儲存到資料庫)
1. 請求網頁資料
請求網頁資料是使用requests庫去做網路請求的,填入url,和header頭部資訊,使用get請求方式去請求,得到response相應後,返回response.text即是響應的文字內容,即網頁文字內容。
# 請求url,獲取網頁資料
def _requestUrl(index):
src_url = 'http://www.xicidaili.com/nt/'
url = src_url + str(index)
if index == 0:
url = src_url
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
}
response = requests.get(url, headers=headers)
return response.text
用瀏覽器開啟網址看一下
2. 解析網頁資料
返回正確的網頁資料之後,就可以開始對它進行解析了,這裡使用BeautifulSoup庫進行網頁內容解析。如果是Chrome瀏覽器,按f12可以檢視網頁原始碼,如圖
找到某個tr行,第1個和第2個td列就是是ip和埠資訊,因此我們可以用BeautifulSoup查詢所以的tr行,再查詢該tr行的第1個和第2個td列即可以獲取該頁面上所有的ip和埠資訊了。
# 解析網頁資料,獲取ip和埠資訊
def parseProxyIpList(content):
list = []
soup = BeautifulSoup(content, 'html.parser')
ips = soup.findAll('tr')
for x in range(1, len(ips)):
tds = ips[x].findAll('td')
ip_temp = 'http://' + tds[1].contents[0] + ':' + tds[2].contents[0]
print('發現ip:%s' % ip_temp)
list.append(ip_temp)
return list
3. 驗證IP和埠是否可用
解析到頁面上的所有ip和埠資訊後,還需要驗證它是否是有效的,然後對它們進行過濾,獲取有效的ip列表。驗證方法就是使用它作為代理地址,去請求網路,看是否能請求成功,如果請求成功,說明是有效的。當然,這裡需要加上超時時間,以避免等待時間過長,這裡設定超時時間為5秒。
# 過濾有效的ip資訊
def filterValidProxyIp(list):
print('開始過濾可用ip 。。。')
validList = []
for ip in list:
if validateIp(ip):
print('%s 可用' % ip)
validList.append(ip)
else:
print('%s 無效' % ip)
return validList
# 驗證ip是否有效
def validateIp(proxy):
proxy_temp = {"http": proxy}
url = "http://ip.chinaz.com/getip.aspx"
try:
response = requests.get(url, proxies=proxy_temp, timeout=5)
return True
except Exception as e:
return False
4. 發起請求,儲存可用IP和埠資訊
接下來要開始呼叫以上程式碼了。這裡只爬取第1頁資料
# 獲取可用的代理ip列表
def getProxyIp():
allProxys = []
startPage = 0
endPage = 1
for index in range(startPage, endPage):
print('查詢第 %s 頁的ip資訊' % index)
# 請求url,獲取網頁資料
content = _requestUrl(index)
# 解析網頁資料,獲取ip和埠資訊
list = parseProxyIpList(content)
# 過濾有效的ip資訊
list = filterValidProxyIp(list)
# 新增到有效列表中
allProxys.append(list)
print('第 %s 頁的有效ip有以下:' % index)
print(list)
print('總共找到有效ip有以下:')
print(allProxys)
return allProxys
執行該爬蟲程式之後,就可以開始爬取代理伺服器資訊了。如圖
總結
通過以上步驟就可以獲取有效的代理伺服器IP資訊了,其他代理伺服器IP網站的獲取方式和這個大同小異,主要在於解析網頁資料那裡,需要找到包含IP和埠資料的標籤,然後解析獲取到。有了代理伺服器IP,你就可以爬取更多網站的資訊了。
還有個問題是,網站可能會對某個IP檢測,如果超過一定請求次數,就會對其進行遮蔽,那這樣會導致程式中斷,無法獲取所有的資訊,這如何解決呢?歡迎關注我的微信公眾號hesong,瞭解具體應對方式。
附上原始碼地址
我的部落格
GitHub
我的簡書
群號:194118438,歡迎入群
微信公眾號 hesong ,微信掃一掃下方二維碼即可關注: