zoukankan      html  css  js  c++  java
  • scrapy 反扒措施

    scrapy 反扒措施

    反措施:

    1.临时或永久封禁来访ip
    
    2.返回验证码
    
    3.异步加载(ajax)
    
    4.爬虫陷阱
    
    5..加速乐的服务:在访问之前先判断客户端的cookie正不正确。如果不正确,返回521状态码,set-cookie并且返回一段js代码通过浏览器执行后又可以生成一个cookie,只有这两个cookie一起发送给服务器,才会返回正确的网页内容。
    
    6.javascript渲染:网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染<script>标签的js代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来
    
    
    

    制作措施:

    1.设置等待时间:
    
    	直接:导入time,然后限制时间为正常人浏览时间
        
    2.识别验证码:
    
    	机器识别:调用在线验证码识别软件接口识别验证码,正确率百分之八九十以
        
    3.异步加载:
    
    	① fiddler / wireshark抓包分析ajax请求的界面,再通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包。
    
    	② 通过PhantomJS+Selenium模拟浏览器行为,抓取经过js渲染后的页面。phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低
        
     4.爬虫陷阱:
    
    	一般是比较简单的死循环,可以对爬虫将要爬取的链接进行判断,不重复爬取相同的页面。除此之外,对于特定的元素看清之后小心爬取,还可使用scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数。
        
     5.针对用户行为:
    
    	① cookie禁用:对于一些不需要登录的网站,可以在setting.py文件中设置COOKIES_ENABLED = False
    
    	② 自动限速:在setting.py文件中设置DOWNLOAD_DELAY = 1
    
    	③判断header:在请求时构造一个header,每次url请求更换一次user-agent。可以百度,也可看看之前的文章
    
    	④ 采用代理IP:可以做一个IP代理池,每次运行时随机挑选一个做访问IP。IP代理有收费有免费,看情况使用
    
    
      6.scrapy和redis分布式爬虫:
    
        可以利用多台机器的宽带加速爬取,还有利用多台机器的ip加速爬取
    
        一般步骤如下:
    
            1.基本的http抓取工具,如scrapy
            2.避免重复抓取网页,如Bloom Filter
            3.维护一个所有集群机器能够有效分享的分布式队列
            4.将分布式队列和Scrapy结合
    
            5.后续处理,网页析取(python-goose),存储(Mongodb)
    
    8.加速乐:
    
        将浏览器返回的js代码放在一个字符串中,然后利用nodejs对这段代码进行反压缩,然后对局部的信息进行解密,得到关键信息放入下一次访问请求的头部中。
    

    测试代理是否可用:

    import urllib
     
    import requests
     
    import sys
     
    if __name__ == "__main__":
        for url in sys.stdin:
            resp = requests.get(url)
            if resp.status_code ==requests.codes.ok:
                print(url)
    
    

    识别爬虫:

    http日志和流量分析,如果单位时间内某个IP访问频率和流量超过特定阈值就可以界定为爬虫。
    
    Headers参数检测
    
    检测User-Agent或者Referer参数的值来判断是否为爬虫,顺便提一下Referer参数也可以防盗链
    
    在网页源码内放置一个对浏览器不可见的链接,正常用户使用浏览器是看不到该链接的当然也不会去点击,如果检测到该链接被点击,来访IP就会被界定为爬虫。
    
    
    
    高匿代理IP解决
    
    验证码识别 --. 人工打码平台
    
    滚动条滑到最底部才能继续浏览下一页内容,此时可以使用selenium+phantomjs解决,phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低
    
    对爬虫将要爬取的链接进行判断,不重复爬取相同的页面,scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数
    	
    

    实战:

    from scrapy import log
    import logging
    
    import random
    from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
    class UserAgent(UserAgentMiddleware):
    
        def __init__(self, user_agent=''):
            self.user_agent = user_agent
    
        def process_request(self, request, spider):
            ua = random.choice(self.user_agent_list)
            if ua:
                #显示当前使用的useragent
                #print "********Current UserAgent:%s************" %ua
                #记录
                log.msg('Current UserAgent: '+ua, level=logging.DEBUG)
                request.headers.setdefault('User-Agent', ua)
    
        user_agent_list = [
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
            "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
            "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
            "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
            "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
            "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
            "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
            "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
            "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
            "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
            "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
           ]
    

    代理:

    import random, base64
    
    
    class ProxyMiddleware(object):
        #代理IP列表
        proxyList = [ 
            '114.231.158.79:8088',
            '123.233.153.151:8118'
            ]
    
        def process_request(self, request, spider):
            # Set the location of the proxy
            pro_adr = random.choice(self.proxyList)
            request.meta['proxy'] = "http://" + pro_adr
    

    settings.py:

    ROBOTSTXT_OBEY = False
    
    ITEM_PIPELINES = {
       'ip_proxy_pool.pipelines.IpProxyPoolPipeline': 300,
    }
    
    #爬取间隔
    DOWNLOAD_DELAY = 1
    
    # 禁用cookie
    COOKIES_ENABLED = False
    
    # 重写默认请求头
    DEFAULT_REQUEST_HEADERS = {
      'Accept': 'text/html, application/xhtml+xml, application/xml',
      'Accept-Language': 'zh-CN,zh;q=0.8',
      'Host':'ip84.com',
      'Referer':'http://ip84.com/',
      'X-XHR-Referer':'http://ip84.com/'
    }
    
    #激活自定义UserAgent和代理IP
    # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
    DOWNLOADER_MIDDLEWARES = {
       'ip_proxy_pool.useragent.UserAgent': 1,
       'ip_proxy_pool.proxymiddlewares.ProxyMiddleware':100,
       'scrapy.downloadermiddleware.useragent.UserAgentMiddleware' : None,
    }
    
  • 相关阅读:
    计算机网络——浅析TCP粘包,拆包发生的原因以及解决方式
    计算机网络——谈谈HTTP中GET与POST的区别
    浅析Cookie、Session以及Token机制
    说说红黑树——不谈操作,只讲理解
    设计模式(1)——单例模式详解
    【转载】二叉排序树和平衡二叉树详解
    深入理解Java中方法重载的实现原理
    真win10官方原版ISO下载方法
    我的Windows装机必备软件与生产力工具
    Caffe源码理解3:Layer基类与template method设计模式
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12793166.html
Copyright © 2011-2022 走看看