Scrapy使用代理爬取网站

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: timg.jpg前言在我们平时使用爬虫程序采集数据时,往往会遇到,因采集速度过快导致的自己网络ip被目标网站封禁,这种封禁有时候是封几分钟,有时候是封一天,封的时间不等,但是这样会导致我们局域网内其他人也无法访问目标网站,最大的问题是我们无法进行数据采集。
img_94d3da47fcf91d6528495c3ce840bc1d.jpe
timg.jpg

前言

在我们平时使用爬虫程序采集数据时,往往会遇到,因采集速度过快导致的自己网络ip被目标网站封禁,这种封禁有时候是封几分钟,有时候是封一天,封的时间不等,但是这样会导致我们局域网内其他人也无法访问目标网站,最大的问题是我们无法进行数据采集。为了保证正常采集数据且本地ip不被封禁,引入代理ip。

代理ip

代理ip有很多种类型,这里我们爬虫程序一般使用的是http或https的代理ip。
爬虫使用的话最好用高匿代理

高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。

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中,使用redis的set数据结构,


img_675e2c898b20f9f164937970f94de700.png
image.png

当然了,这里列出的ip都是可使用的,因为在放入redis之前我会使用特定的程序去检测代理ip的可用性。
代理ip的来源这里我要说一下,最好是越多越好,分好类,付费的,免费的,拨号的,全部拿来用,使用的时候随机从redis中取一个出来用。代理ip的选择大家自行查找,或者需要也可给我留言。

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增加代理的需求。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
数据采集 Python
Scrapy框架 -- 深度爬取并持久化保存图片
Scrapy框架 -- 深度爬取并持久化保存图片
47 0
|
8月前
|
XML 数据采集 JSON
scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。
|
4月前
|
数据采集 JavaScript 开发者
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
|
8月前
|
数据采集 XML 存储
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
这个案例展示了如何使用 Scrapy 框架构建一个简单的爬虫项目,从网页中提取数据并保存到文件中。通过配置、编写爬虫代码、定义数据模型和数据处理管道,你可以灵活地构建各种爬虫应用。
210 0
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
|
9月前
|
数据采集 Python
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
异步编程在现代软件开发中扮演着越来越重要的角色,特别是在网络爬虫等需要处理大量 I/O 操作的场景中。本文将介绍 asyncio 这个强大的异步编程库,并探讨如何在 Scrapy 爬虫框架中充分利用 asyncio 提升爬虫的效率和灵活性。此外,还将介绍如何集成爬虫代理功能,进一步提高爬虫的效率和稳定性。
122 0
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
|
10月前
|
数据采集 开发者 Python
如何使用Scrapy框架爬取301跳转后的数据
如何使用Scrapy框架爬取301跳转后的数据
|
Python
Scrapy添加代理验证
Scrapy添加代理验证
69 0
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
|
数据采集 Web App开发 存储
使用 Scrapy + Selenium 爬取动态渲染的页面
使用 Scrapy + Selenium 爬取动态渲染的页面
396 0
使用 Scrapy + Selenium 爬取动态渲染的页面
|
Python
Requests 和 Scrapy 添加动态IP代理
Requests 和 Scrapy 添加动态IP代理
332 0