proxy - 使用代理爬网
问题描述
我编写了一个 Scrapy 中间件,必须通过scrapy.Request(url)对每个请求使用代理。
我的自定义中间件:
MyCustomProxyMiddleware 类(对象):
def __init__(self, settings): self.chosen_proxy = settings.get('ROTATOR_PROXY', None) @classmethod def from_crawler(cls, crawler): return cls(crawler.settings) def process_request(self, request, spider): if self.chosen_proxy is not None: request.meta["proxy"] = self.chosen_proxy log.debug('Using proxy <%s>' % self.chosen_proxy)
在我的 settings.py
ROTATOR_PROXY = 'http://ip:port' # 这是我的 rotator 网关代理
我的蜘蛛:
def start_requests(self): urls = [] # thousand URLs for url in urls: # Don't redirect URL and scrape data if checkers.is_url(url): yield scrapy.Request(url)
但是,我检查了 rotator 代理网关的统计信息,我看到一些首先使用代理的 scrapy.Request( url),但许多scrapy.Request(url)不使用我的 rotator 代理网关。我需要所有请求都必须使用我的 rotator 网关。
我无法猜测问题,请让我知道我的问题并尽可能提出我的错误。
提前致谢,
解决方案
有多种方法可以将代理与 scrapy 爬虫一起使用。第一种方法是使用传统方式,运行命令“pip install scrapy-rotating proxies”并按照官方文档进行操作。开发人员使用的第二个也是最常用的 API 集成了具有处理代理的预构建函数以及对多种语言(包括 python)的支持,以便这些 API 自动处理代理轮换并提供完全匿名性。除此之外,您可以尝试以下代码以将代理与scrapy一起使用。但在开始编写代码之前,请注意,在第一个源代码中,我们通过请求参数设置代理,在第二个源代码中,创建了自定义代理中间件。
方法一:
def start_requests(self):
for url in self.start_urls:
return Request(url=url, callback=self.parse,
headers={"User-Agent": "scrape web"},
meta={"proxy": "http:/154.112.82.262:8
方法二:
from w3lib.http import basic_auth_header
class CustomProxyMiddleware(object):
def process_request(self, request, spider):
request.meta[“proxy”] = "http://192.168.1.1:8050"
request.headers[“Proxy-Authorization”] =
basic_auth_header(“<proxy_user>”, “<proxy_pass>”)
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.CustomProxyMiddleware': 350,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}
注意:通过将其作为请求参数传递来设置代理,第二种方法是创建自定义代理中间件。
推荐阅读
- javascript - 如何在循环下一次迭代之前等待谷歌远程呼叫返回我的结果
- shell - 在 Golang 中需要交互式输入的测试 exec
- django - django 抓取表单输入并编辑实例
- plc - 在结构化文本语法中初始化自定义类型数组
- python - Bluez DBus:客户端服务器实现
- c# - 检测更改提要中的单个文档属性更改
- c# - 接口中的泛型方法
- android - Android Studio CMake/Ninja 不用于构建 NDK 项目
- r - 在用户定义的函数中包含公式
- javascript - 使用 map reduce 等,您将如何在嵌套数组中找到符合特定条件的第一项,并在找到后停止?