zoukankan      html  css  js  c++  java
  • 爬虫

    前戏

    os.environ()简介

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

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

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

    os.environ() key字段详解

    windows:

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

    linux:

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

    内置的方式

    原理

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

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

    代码

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

     1 class ChoutiSpider(scrapy.Spider):
     2     name = 'chouti'
     3     allowed_domains = ['chouti.com']
     4     start_urls = ['https://dig.chouti.com/']
     5     cookie_dict = {}
     6  
     7     def start_requests(self):
     8         import os
     9         os.environ['HTTPS_PROXY'] = "http://username:password@192.168.11.11:9999/"
    10         os.environ['HTTP_PROXY'] = '19.11.2.32',
    11         for url in self.start_urls:
    12             yield Request(url=url,callback=self.parse)

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

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

    自定义方式

    原理

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

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

    代码

     1 class ChoutiSpider(scrapy.Spider):
     2     name = 'chouti'
     3     allowed_domains = ['chouti.com']
     4     start_urls = ['https://dig.chouti.com/']
     5     cookie_dict = {}
     6  
     7     def start_requests(self):
     8         for url in self.start_urls:
     9             yield Request(url=url,callback=self.parse,meta={'proxy':'"http://username:password@192.168.11.11:9999/"'})
    10  
    11             import base64
    12             import random
    13             from six.moves.urllib.parse import unquote
    14             try:
    15                 from urllib2 import _parse_proxy
    16             except ImportError:
    17                 from urllib.request import _parse_proxy
    18             from six.moves.urllib.parse import urlunparse
    19             from scrapy.utils.python import to_bytes
    20  
    21             class XXProxyMiddleware(object):
    22  
    23                 def _basic_auth_header(self, username, password):
    24                     user_pass = to_bytes(
    25                         '%s:%s' % (unquote(username), unquote(password)),
    26                         encoding='latin-1')
    27                     return base64.b64encode(user_pass).strip()
    28  
    29                 def process_request(self, request, spider):
    30                     PROXIES = [
    31                         "http://username:password@192.168.11.11:9999/",
    32                         "http://username:password@192.168.11.12:9999/",
    33                         "http://username:password@192.168.11.13:9999/",
    34                         "http://username:password@192.168.11.14:9999/",
    35                         "http://username:password@192.168.11.15:9999/",
    36                         "http://username:password@192.168.11.16:9999/",
    37                     ]
    38                     url = random.choice(PROXIES)
    39  
    40                     orig_type = ""
    41                     proxy_type, user, password, hostport = _parse_proxy(url)
    42                     proxy_url = urlunparse((proxy_type or orig_type, hostport, '', '', '', ''))
    43  
    44                     if user:
    45                         creds = self._basic_auth_header(user, password)
    46                     else:
    47                         creds = None
    48                     request.meta['proxy'] = proxy_url
    49                     if creds:
    50                         request.headers['Proxy-Authorization'] = b'Basic ' + creds

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

    1 DOWNLOADER_MIDDLEWARES = {
    2    'spider.xxx.XXXProxyMiddleware': 543,
    3 }
  • 相关阅读:
    php ReflectionObject类
    is_callable
    Zend Framework: Accessing Request, Response & Router Object from anywhere
    (转)zend异常处理
    call_user_func
    zend framework基础教程6—视图
    php func_get_arg
    zend framework基础教程3—创建index.php
    【算法02】3种方法求解斐波那契数列
    【算法01】寻找丑数
  • 原文地址:https://www.cnblogs.com/zhaohuhu/p/9245728.html
Copyright © 2011-2022 走看看