您的位置:首页 >资讯列表 > 正文
发布时间:2021-07-26 14:58
Scrapy使用http代理ip爬取网站

在我们平时使用爬虫程序采集数据时,经常会遇到因采集速度过快导致自己的IP地址被目标网站封禁,有时候会封几分钟,有时候是封一天。这不仅会导致局域网内其他人也无法访问目标网站,还会阻碍我们的数据采集。为了保证正常采集数据且本地IP不被封禁,我们一般会使用http代理ip

代理IP

爬虫最好用高匿代理,高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。我们爬虫程序一般使用的是飞猪HTTP代理IP,质量稳定可用率高。

Scrapy使用代理爬取网站

requests库使用代理IP

# 准备好的代理ip

proxy = "127.0.0.1:8000"

proxies = {

"https": "https://{0}".format(proxy),

"http": "http://{0}".format(proxy),

}

res = requests.get(url, proxies=proxies)

以上代码片段是最简单的requests库实现代理IP执行get请求。

 

线上爬虫使用代理IP方案

目前爬虫使用代理的方法很多,这里我简单说说我在线上环境使用代理的心得。

首先,我自己维护了一个代理IP池,这个IP池是放在redis中的,也就是说我的所有可使用的代理IP是放在redis中,使用redisset数据结构。

 

scrapy使用代理IP

class RandomProxyMiddleware(object):

 

def __init__(self):

settings = get_project_settings()

self.PROXY_REDIS_HOST = settings.get('PROXY_REDIS_HOST')

self.PROXY_REDIS_PORT = settings.get('PROXY_REDIS_PORT')

self.PROXY_REDIS_PARAMS = settings.get('PROXY_REDIS_PARAMS')

self.PROXY_REDIS_KEY = settings.get('PROXY_REDIS_KEY')

self.pool = redis.ConnectionPool(host=self.PROXY_REDIS_HOST,

port=self.PROXY_REDIS_PORT,

db=self.PROXY_REDIS_PARAMS['db'],

password=self.PROXY_REDIS_PARAMS['password'])

self.conn = redis.StrictRedis(connection_pool=self.pool)

 

def process_request(self, request, spider):

proxy = self.conn.srandmember(self.PROXY_REDIS_KEY)

proxy = proxy.decode('utf-8')

proxy = json.loads(proxy)

ip = proxy['proxy']

request.meta['proxy'] = "https://%s" % ip

上面代码片段自定义一个代理中间件RandomProxyMiddleware,scrapyprocess_request(self, request, spider)这个方法中使用redis的操作随机获取一个代理出来,加到request.meta['proxy'],便完成了代理中间件的编写。随后把RandomProxyMiddleware加到setting文件中,

 

DOWNLOADER_MIDDLEWARES = {

'crawl_spider.middlewares.RandomProxyMiddleware': 400,

}

便可完成scrapy增加http代理ip的需求。

 

 

 



上一篇 选择HTTP代理IP时要注意哪些问题 下一篇 HTTP代理可以用于注册业务吗?
在线咨询
微信客服

微信客服

微信公众号

微信公众号

回到顶部