zoukankan      html  css  js  c++  java
  • python

    1.  start_urls  --  起始URL 的内部实现(将迭代器转换为生成器)

    class QSpider(scrapy.Spider):
        name = 'q'
        allowed_domains = ['chouti.com']
        start_urls = ['http://chouti.com/']
    
    def start_requests(self)
        # 方式一:
        for url in self.start_urls:
            yield Request(url=url)
        
        # 方式二:
        req_list = []
        for url in self.start_urls:
            req_list.append(Request(url=url))
        return req_list


    2. 深度和优先级

    深度:
        - 最开始是0
        - 每次 yield 时,会根据原来请求中的 depth + 1
        - 配置:DEPTH_LIMIT 深度控制
    优先级:
        - 请求被下载的优先级 -= 深度 * 配置 DEPTH_PRIORITY
        - settings配置:DEPTH_PRIORITY

    3. 下载中间件

    scrapy 中设置代理( 两个单独的程序之间的 环境变量是不共享的,因为是两个进程 )
    - 内置:
         在爬虫启动时,提前在 os.envrion 中设置代理
            # 方式一( 设置环境变亮 ):
            import os
            os.environ["HTTPS_PROXY"] = "https://root:xx@1.1.1.1:80"
            os.environ["HTTP_PROXY"] = "1.1.1.2"
            # 方式二( 设置参数 ):
            yield Request(url=url, callback=self.parse, meta={'proxy':'https://root:xx@1.1.1.1:80'})
        
    - 自定义:
    1. settings:
    DOWNLOADER_MIDDLEWARES = {
       #'xdb.middlewares.XdbDownloaderMiddleware': 543,
        'xdb.proxy.XdbProxyMiddleware':751,
    }
    
    2. proxy.py
    class DdbProxyMiddleware(object):
        def process_request(self, request, spider):
            PROXIES = [
                {'ip_port': '111.11.228.75:80', 'user_pass': ''},
                {'ip_port': '120.198.243.22:80', 'user_pass': ''},
                {'ip_port': '111.8.60.9:8123', 'user_pass': ''},
                {'ip_port': '101.71.27.120:80', 'user_pass': ''},
                {'ip_port': '122.96.59.104:80', 'user_pass': ''},
                {'ip_port': '122.224.249.122:8088', 'user_pass': ''},
            ]
            proxy = random.choice(PROXIES)
            if proxy['user_pass'] is not None:
                request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
                encoded_user_pass = base64.b64encode(to_bytes(proxy['user_pass']))
                request.headers['Proxy-Authorization'] = to_bytes('Basic ' + encoded_user_pass)
            else:
                request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
  • 相关阅读:
    进制间转换的理论和实现不同
    操作DOM
    浏览器对象
    浏览器
    面向对象编程——class继承
    面向对象编程——原型继承
    js面向对象编程——创建对象
    JS面向对象编程
    js的JSON
    js标准对象——Date
  • 原文地址:https://www.cnblogs.com/chaoqi/p/10551606.html
Copyright © 2011-2022 走看看