python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用。
本代码包括ip的爬取,检测是否可用,可用保存,通过函数get_proxies可以获得ip,如:{'HTTPS':'106.12.7.54:8118'}
下面放上源代码,并详细注释:
importrequests fromlxmlimportetree fromrequests.packagesimporturllib3 importrandom,time urllib3.disable_warnings() defspider(pages,max_change_porxies_times=300): """ 抓取XiciDaili.com的http类型-代理ip-和端口号 将所有抓取的ip存入raw_ips.csv待处理,可用check_proxies()检查爬取到的代理ip是否可用 ----- :parampages:要抓取多少页 :return:无返回 """ s=requests.session() s.trust_env=False s.verify=False urls=com/nn/{}' proxies={} try_times=0 foriinrange(pages): url=urls.format(i+1) s.headers={ 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding':'gzip,deflate,br', 'Accept-Language':'zh-CN,zh;q=0.9', 'Connection':'keep-alive', 'Referer':urls.format(iifi>0else''), 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.75Safari/537.36'} whileTrue: content=s.get(url,headers=s.headers,proxies=proxies) time.sleep(random.uniform(1.5,4))#每读取一次页面暂停一会,否则会被封 ifcontent.status_code==503:#如果503则ip被封,就更换ip proxies=get_proxies() try_times+=1 print(f'第{str(try_times):0>3s}次变更,当前{proxies}') iftry_times>max_change_porxies_times: print('超过最大尝试次数,连接失败!') return-1 continue else: break#如果返回码是200,就跳出while循环,对爬取的页面进行处理 print(f'正在抓取第{i+1}页数据,共{pages}页') forjinrange(2,102):#用简单的xpath提取http,host和port tree=etree.HTML(content.text) http=tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[6]/text()')[0] host=tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[2]/text()')[0] port=tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[3]/text()')[0] check_proxies(http,host,port)#检查提取的代理ip是否可用 defcheck_proxies(http,host,port,test_url='http://www.baidu.com'): """ 检测给定的ip信息是否可用 根据http,host,port组成proxies,对test_url进行连接测试,如果通过,则保存在ips_pool.csv中 :paramhttp:传输协议类型 :paramhost:主机 :paramport:端口号 :paramtest_url:测试ip :return:None """ proxies={http:host+':'+port} try: res=requests.get(test_url,proxies=proxies,timeout=2) ifres.status_code==200: print(f'{proxies}检测通过') withopen('ips_pool.csv','a+')asf: f.write(','.join([http,host,port])+'\n') exceptExceptionase:#检测不通过,就不保存,别让报错打断程序 print(e) defcheck_local_ip(fn,test_url): """ 检查存放在本地ip池的代理ip是否可用 通过读取fn内容,加载每一条ip对test_url进行连接测试,链接成功则储存在ips_pool.csv文件中 :paramfn:filename,储存代理ip的文件名 :paramtest_url:要进行测试的ip :return:None """ withopen(fn,'r')asf: datas=f.readlines() ip_pools=[] fordataindatas: #time.sleep(1) ip_msg=data.strip().split(',') http=ip_msg[0] host=ip_msg[1] port=ip_msg[2] proxies={http:host+':'+port} try: res=requests.get(test_url,proxies=proxies,timeout=2) ifres.status_code==200: ip_pools.append(data) print(f'{proxies}检测通过') withopen('ips_pool.csv','a+')asf: f.write(','.join([http,host,port])+'\n') exceptExceptionase: print(e) continue defget_proxies(ip_pool_name='ips_pool.csv'): """ 从ip池获得一个随机的代理ip :paramip_pool_name:str,存放ip池的文件名, :return:返回一个proxies字典,形如:{'HTTPS':'106.12.7.54:8118'} """ withopen(ip_pool_name,'r')asf: datas=f.readlines() ran_num=random.choice(datas) ip=ran_num.strip().split(',') proxies={ip[0]:ip[1]+':'+ip[2]} returnproxies if__name__=='__main__': t1=time.time() spider(pages=3400) t2=time.time() print('抓取完毕,时间:',t2-t1) #check_local_ip('raw_ips.csv','http://www.baidu.com')
以上就是python爬虫构建代理ip池抓取数据库的示例代码的详细内容,更多关于python爬虫构建代理ip池的资料请关注毛票票其它相关文章!