东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

沙皇leon国际

13997106478
联系方式
全国服务热线: 13997106478

咨询热线:18837802055
联系人:余扬
地址:海南省海口市龙昆北路昌信公寓

网络爬虫之scrapy框架设置代理

来源:沙皇leon国际   发布时间:2019-11-18   点击量:14

前戏

os.environ()简介

os.environ()可以获取到当前进程的环境变量,注意,是当前进程。

如果我们在一个程序中设置了环境变量,另一个程序是无法获取设置的那个变量的。

环境变量是以一个字典的形式存在的,可以用字典的方法来取值或者设置值。

os.environ() key字段详解

windows:

os.environ["HOMEPATH"]:当前用户主目录。os.environ["TEMP"]:临时目录路径。os.environ[PATHEXT"]:可执行文件。os.environ["SYSTEMROOT"]:系统主目录。os.environ["LOGONSERVER"]:机器名。os.environ["PROMPT"]:设置提示符。

linux:

os.environ["USER"]:当前使用用户。os.environ["LC_COLLATE"]:路径扩展的结果排序时的字母顺序。os.environ["SHELL"]:使用shell的类型。os.environ["LAN"]:使用的语言。os.environ["SSH_AUTH_SOCK"]:ssh的执行路径。

内置的方式

原理

scrapy框架内部已经实现了设置代理的方法,它的原理是从环境变量中取出设置的代理,然后再使用,

所以我们只需要在程序执行前将代理以键值对的方式设置到环境变量中即可。

代码

第一种方式:直接添加键值对的方式

class ChoutiSpider(scrapy.Spider):name = "chouti"allowed_domains = ["chouti.com"]start_urls = ["https://dig.chouti.com/"]cookie_dict = {}def start_requests(self):import osos.environ["HTTPS_PROXY"] = "http://username:password@192.168.11.11:9999/"os.environ["HTTP_PROXY"] = "19.11.2.32",for url in self.start_urls:yield Request(url=url,callback=self.parse)

第二种方式:设置meta参数的方式

class ChoutiSpider(scrapy.Spider):name = "chouti"allowed_domains = ["chouti.com"]start_urls = ["https://dig.chouti.com/"]cookie_dict = {}def start_requests(self):for url in self.start_urls:yield Request(url=url,callback=self.parse,meta={"proxy":""http://username:password@192.168.11.11:9999/""})

自定义方式

原理

我们可以根据内部实现的添加代理的类(中间件)的实现方法,来对它进行升级,比如内部的方式一次只能使用一个代理,

我们可以弄一个列表,装很多代理地址,然后随机选取一个代理,这样可以防止请求过多被封ip

代码

class ChoutiSpider(scrapy.Spider):name = "chouti"allowed_domains = ["chouti.com"]start_urls = ["https://dig.chouti.com/"]cookie_dict = {}def start_requests(self):for url in self.start_urls:yield Request(url=url,callback=self.parse,meta={"proxy":""http://username:password@192.168.11.11:9999/""})import base64import randomfrom six.moves.urllib.parse import unquotetry:from urllib2 import _parse_proxyexcept ImportError:from urllib.request import _parse_proxyfrom six.moves.urllib.parse import urlunparsefrom scrapy.utils.python import to_bytesclass XXProxyMiddleware(object):def _basic_auth_header(self, username, password):user_pass = to_bytes("%s:%s" % (unquote(username), unquote(password)),encoding="latin-1")return base64.b64encode(user_pass).strip()def process_request(self, request, spider):PROXIES = ["http://username:password@192.168.11.11:9999/","http://username:password@192.168.11.12:9999/","http://username:password@192.168.11.13:9999/","http://username:password@192.168.11.14:9999/","http://username:password@192.168.11.15:9999/","http://username:password@192.168.11.16:9999/",]url = random.choice(PROXIES)orig_type = ""proxy_type, user, password, hostport = _parse_proxy(url)proxy_url = urlunparse((proxy_type or orig_type, hostport, "", "", "", ""))if user:creds = self._basic_auth_header(user, password)else:creds = Nonerequest.meta["proxy"] = proxy_urlif creds:request.headers["Proxy-Authorization"] = b"Basic " + creds

写完类之后需要在settings文件里配置一下:

DOWNLOADER_MIDDLEWARES = { "spider.xxx.XXXProxyMiddleware": 543,}

  

相关产品

COPYRIGHTS©2017 沙皇leon国际 ALL RIGHTS RESERVED 备案号:14