数据采集-Scrapy框架使用代理IP要点

scrapy框架通过模块化的设计实现了数据采集的通用功能接口,并提供自定义拓展,它将程序员从繁冗的流程式重复劳动中解放出来,给编程人员提供了灵活简便的基础构建,对于普通的网页数据采集,编程人员只需要将主要精力投入在网站数据分析和网站反爬策略分析上,结合代理IP的使用,可以实现项目的高效快速启动。

主要特性包括:

1)参数化设置请求并发数,自动异步执行

2)支持xpath,简洁高效

3)支持自定义中间件middleware

4)支持采集源列表

5)支持独立调试,方便 shell 方式

6)支持数据管道接口定义,用户可以选择文本、数据库等多种方式

在Scrapy框架中使用代理的方式有如下几种:

1.scrapy中间件

在项目中新建middlewares.py文件(./项目名/middlewares.py),内容如下:

#! -*- encoding:utf-8 -*-

import base64

import sys

import random

PY3 = sys.version_info[0] >= 3

def base64ify(bytes_or_str):

if PY3 and isinstance(bytes_or_str, str):

input_bytes = bytes_or_str.encode(utf8)

else:

input_bytes = bytes_or_str

output_bytes = base64.urlsafe_b64encode(input_bytes)

if PY3:

return output_bytes.decode(ascii)

else:

return output_bytes

class ProxyMiddleware(object):

def process_request(self, request, spider):

# 代理服务器(产品官网 http://www.16yun.cn)

proxyHost = "http://t.16yun.cn"

proxyPort = "31111"

# 代理验证信息

proxyUser = "username"

proxyPass = "password"

request.meta[proxy] = "http://{0}:{1}".format(proxyHost,proxyPort)

# 添加验证头

encoded_user_pass = base64ify(proxyUser + ":" + proxyPass)

request.headers[Proxy-Authorization] = Basic+ encoded_user_pass

# 设置IP切换头(根据需求)

tunnel = random.randint(1,10000)

request.headers[Proxy-Tunnel] = str(tunnel)

修改项目配置文件 (./项目名/settings.py)

DOWNLOADER_MIDDLEWARES = {

项目名.middlewares.ProxyMiddleware: 100,

}

2.scrapy环境变量

通过设置环境变量,来使用爬虫代理(Windows)

C:\>set http_proxy=http://username:password@ip:port