前言:
在用python爬取大规模数据时,由于用户的频繁访问可能造成对当前ip的封禁,那么就需要用到代理ip的技术,在本文中我们尝试构建一个代理ip池来解决这个问题。笔者爬去赶集网商品数据时,手动构建代理ip,但是这种方法非常不灵活,而且ip容易失效,不适合大规模的数据爬取,所以我们采用爬虫自动构建ip代理。
首先,访问西刺ip代理网站(该网站提供了API用来提取代理ip,但是访问失败!),分析网页数据,ip数据位于table标签中的td标签中,使用selector抽取数据如下
'table#ip_list > tr > td'
分析网页数据并不规律,所有数据都在<td>标签中, 不容易区分,仔细分析,发现不同的ip,端口及协议这些数据存在一定的规律,可以通过列表中构建字典解决这个问题,完整的代码如下:
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/62.0.3202.94 Safari/537.36",
"Connection":"keep-alive"
}
def get_ips(url):
ips_data = requests.get(url,headers=headers)
soup_ips = BeautifulSoup(ips_data.text,'lxml')
ips = soup_ips.select('table#ip_list > tr > td')
i = 1 #ip在列表中首次出现的索引
j = 2 #端口首次在列表中出现的索引
k = 5 #协议首次在列表中出现的索引
ips_list = []
data = {}
while(i < len(ips)):
if ips[i]:
data['ip'] = ips[i].text
if ips[j]:
data['port'] = ips[j].text
if ips[k].text is not 'sock4/5': #保证爬取的协议为 http或者https
data['http_info'] = ips[k].text
#第一个ip数据与第二个ip数据之间相差为8
i = i + 8
j = j + 8
k = k + 8
if data['http_info'] != 'socks4/5':
#构建合适的ip地址
ips_list.append(data['http_info'].lower()+"://"+data['ip']+":"+data['port])
return ips_list
url = "http://www.xicidaili.com/"
get_ips(url)
最后,爬取的部分结果显示如下:
网友评论