爬虫-ip代理
代理(proxy)
-
代理服务器:实现请求转发,从而可以实现更换请求的ip地址
-
代理的匿名度:
- 透明:服务器知道你使用了代理并且知道你的真实ip
- 匿名:服务器知道你使用了代理,但是不知道你的真实ip
- 高度匿名(高匿):服务器不知道你使用了代理,更不知道你的真实ip
-
代理的类型:
- http:该类型的代理只可以转发http协议的请求
- https:只可以转发https协议的请求
-
requests请求中更换ip:
在requests添加一个参数 proxies={'http/https':'ip:port'}
import requests headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' } url = 'https://www.baidu.com/s?wd=ip' #proxies={'http/https':'ip:port'} page_text = requests.get(url=url,headers=headers,proxies={'https':'1.197.203.187:9999'}).text with open('ip.html','w',encoding='utf-8') as fp: fp.write(page_text)
-
免费代理ip的网站
- 快代理
- 西祠代理
- goubanjia
- 代理精灵(推荐):http://http.zhiliandaili.cn/
-
在爬虫中遇到ip被禁掉如何处理?
- 使用代理
- 构建一个代理池
- 拨号服务器
-
代理池构建
#基于代理精灵构建一个ip池 from lxml import etree all_ips = [] # 列表形式的代理池 proxy_url = 'http://t.11jsq.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=52&time=1&pro=&city=&port=1&format=html&ss=5&css=&dt=1&specialTxt=3&specialJson=&usertype=2' # 代理ip地址 proxy_page_text = requests.get(url=proxy_url,headers=headers).text tree = etree.HTML(proxy_page_text) proxy_list = tree.xpath('//body//text()') for ip in proxy_list: dic = {'https':ip} all_ips.append(dic) all_ips import random #爬取西祠代理中的免费代理ip url = 'https://www.xicidaili.com/nn/%d' free_proxies = [] for page in range(1,30): new_url = format(url%page) page_text = requests.get(new_url,headers=headers,proxies=random.choice(all_ips)).text tree = etree.HTML(page_text) tr_list = tree.xpath('//*[@id="ip_list"]//tr')[1:]#xpath表达式中不可以出现tbody for tr in tr_list: ip = tr.xpath('./td[2]/text()')[0] port = tr.xpath('./td[3]/text()')[0] t_type = tr.xpath('./td[7]/text()')[0] dic = { 'ip':ip, 'port':port, 'type':t_type } free_proxies.append(dic) print('第{}页爬取完毕!!!'.format(page)) print(len(free_proxies))