为什么使用代理
在爬取网站信息的过程中,有些网站为了防止爬虫,可能会限制每个ip的访问速度或访问次数。对于限制访问速度的情况,我们可以通过time.sleep进行短暂休眠后再次爬取。对于限制ip访问次数的时候我们需要通过代理ip轮换去访问目标网址。
从哪里获取代理IP
付费获取代理IP,或者通过爬取免费代理的网站网站获取代理IP,有如下可以免费获取代理IP的网站
快代理、代理66、有代理、西刺代理、guobanjia、国内高匿代理IP
如何保证代理质量
由于免费代理IP大部分不能用,所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。
基本流程
1.从代理网站爬取代理IP(本次爬取国内高匿代理,网址https://link.jianshu.com/?t=http%3A%2F%2Fwww.xicidaili.com%2Fnn%2F
2.将爬取的代理IP保存至本地txt文档
3.遍历文档,用代理IP访问常用网址剔除不可用和质量低的代理IP
- 使用多线程爬取高匿代理前10页的代理IP并保存至桌面ip_list.txt文档
import threading
import os
import requests
from bs4 import BeautifulSoup
import re
def get_proxy(num):
os.chdir(r'C:\Users\Administrator\Desktop')
f = open('ip_list.txt','a',encoding='utf-8')
urls = ['http://www.xicidaili.com/nn/%i' %i for i in range(num+1)]
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
for url in urls:
response = requests.get(url,headers = headers)
soup = BeautifulSoup(response.text,"lxml")
ip_info = soup.find_all('tr',class_='odd')
try:
for i in ip_info:
ip = i.find_all('td')[1].text
port = i.find_all('td')[2].text
proxy = ip + ':' + port +'\n'
f.write(proxy)
except Exception as e:
print('NO IP')
f.close()
t = threading.Thread(target=get_proxy,args=(10,))
t.start()
t.join()
- 对保存至桌面文档的代理IP进行测试,将测试能够达到要求的ip添加至proxys_list列表
proxys_list = []
def test_proxy():
os.chdir(r'C:\Users\Administrator\Desktop')
f = open('ip_list.txt','r',encoding='utf-8')
pros = f.readlines()
url = 'https://www.baidu.com/'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
for pro in pros:
proxy = ('http://'+ pro).strip('\n')
proxies = {'proxy':proxy}
print(proxies)
try:
response = requests.get(url,headers = headers,proxies = proxies)
except Exception as e:
pass
else:
code = response.status_code
if code >= 200 and code < 300:
proxys_list.append(proxies)
else:
continue
return(proxys_list)
t2 = threading.Thread(target=test_proxy)
t2.start()
t2.join()
有没有构建好的代理池
有,项目地址
项目说明文档
如何构建一个代理池
安装Python
至少Python3.5以上
安装Redis
安装好之后将Redis服务开启
配置代理池
cd proxypool
进入proxypool目录,修改settings.py文件
PASSWORD为Redis密码,如果为空,则设置为None
安装依赖
pip3 install -r requirements.txt
打开代理池和API
python3 run.py
获取代理
利用requests获取方法如下
import requests
PROXY_POOL_URL = 'http://localhost:5555/random'
def get_proxy():
try:
response = requests.get(PROXY_POOL_URL)
if response.status_code == 200:
return response.text
except ConnectionError:
return None
网友评论