python建立ip代理池_python代理池的构建3——爬取代理ip

#-*-coding:utf-8-*-

'''目标: 实现可以指定不同URL列表,分组的XPATH和详情的XPATH,从不同页面上提取代理的IP,端口号和区域的通用爬虫;

步骤:

1.在base_ spider.py文件中,定义 一个BaseSpider类, 继承object

2.提供三个类成员变量:

urls:代理IP网址的URL的列表

group_ xpath:分组XPATH,获取包含代理IP信息标签列表的XPATH

detail. xpath:组内XPATH,获取代理IP详情的信息XPATH,格式为: {'ip':'xx', 'pot':'xx','area':'xx'}

3.提供初始方法,传入爬虫URL列表,分组XPATH,详情(组内)XPATH4.对外提供-个获取代理IP的方法,遍历URL列表,获取URL

根据发送请求,获取页面数据

解析页面,提取数据,封装为Proxy对象

返回Proxy对象列表'''

importrequestsimportsysfrom lxml importetree

sys.path.append("..") #提供要导入的模块路径,之前博客讲过怎么使用

sys.path.append("../..")from utils.http importget_requests_headersfrom domain importProxyclass BaseSpider(object): #定义一个最基础的爬虫,后面爬取专门网站的爬虫继承这个基础爬虫

urls =[]

group_xpath= '' #因为我们用的lxml模块解析页面,所以要传入分组xpath和细节xpath

detail_xpath = {} #这个细节xpath就是ip在页面的位置,端口在页面的位置等等

def __init__(self,urls=[],group_xpath='',detail_xpath={}):ifurls:

self.urls=urlsifgroup_xpath:

self.group_xpath=group_xpathifdetail_xpath:

self.detail_xpath=detail_xpathdefget_page_from_url(self,url):

response= requests.get(url,headers=get_requests_headers())#这个get_requests_headers方法是获取一个随机请求头,之前http.py模块定义过这个方法

returnresponse.contentdef get_first_list(self,li=[]):if len(li)!=0:returnli[0]else:return ''

defget_proxies_from_page(self,page):#这个就是把HTML页面给lxml,让它解析

element =etree.HTML(page)

trs=element.xpath(self.group_xpath)#print(trs)

for tr intrs:#tr.xpath(self.detail_xpath['ip'])因为这一部分返回的是一个列表,而且如果我们直接写

#tr.xpath(self.detail_xpath['ip'])[0],如果这个列表为空,他就会报错导致程序异常终止

ip = self.get_first_list(tr.xpath(self.detail_xpath['ip']))

port= self.get_first_list(tr.xpath(self.detail_xpath['port']))

area= self.get_first_list(tr.xpath(self.detail_xpath['area']))

proxy= Proxy(ip,port,area=area)print(proxy.__dict__) #这个dict函数就是把对象转化成字典类型输出,python内部函数

yield proxy #函数有了这个关键字,函数就是一个生成器函数。上篇博客讲过,会挂一下链接

defget_proxies(self):for url inself.urls:#print(url)

page =self.get_page_from_url(url)#print(page)

proxies =self.get_proxies_from_page(page)yield fromproxiesif __name__ == '__main__': #用于测试这个这个模块

#config = {

#'urls':{'http://www.ip3366.net/?stype=1&page={}'.format(i) for i in range(1,3)},

#'group_xpath':'//*[@id="list"]/table/tbody/tr',

#'detail_xpath':{

#'ip':'./td[1]/text()',

#'port':'./td[2]/text()',

#'area':'./td[6]/text()'

#}

#}

# #spider = BaseSpider(**config)

#for proxy in spider.get_proxies():

#print(proxy)

url = 'http://www.66ip.cn/4.html'response= requests.get(url,headers=get_requests_headers())print(response.content.decode('GBK'))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值