zoukankan      html  css  js  c++  java
  • 爬虫-反爬与反反爬(12)

    概念:

    爬虫:批量获取对方的消息

    反爬:使用技术,防止被别人爬取

    反反爬:使用技术,绕过反爬策略

    反爬虫的目的:

    1】防止暴力的初级爬虫
    2】失控的爬虫,防止一些被遗弃但没有关闭的爬虫
    3】重要的数据保存

    常见的反爬虫策略:

    user-agent反爬
    ip频率限制
    必须登录反爬

    解决思路:因为user-agent带有Bytespider爬虫标记,这可以通过Nginx规则来限定流氓爬虫的访问,直接返回403错误。

    1、在/etc/nginx/conf.d目录下(因Nginx的安装区别,可能站点配置文件的路径有所不同)新建文件deny_agent.config配置文件:

    #forbidden Scrapy
    if ($http_user_agent ~* (Scrapy|Curl|HttpClient))
    {
        return 403;
    }
    
    #forbidden UA
    if ($http_user_agent ~ "Bytespider|FeedDemon|JikeSpider|
    Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|
    ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|
    DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$
    " ) { return 403; } #forbidden not GET|HEAD|POST method access if ($request_method !~ ^(GET|HEAD|POST)$) { return 403; }

    注意UA:

    FeedDemon             内容采集
    BOT/0.1 (BOT for JCE) sql注入
    CrawlDaddy            sql注入
    Java                  内容采集
    Jullo                 内容采集
    Feedly                内容采集
    UniversalFeedParser   内容采集
    ApacheBench           cc攻击器
    Swiftbot              无用爬虫
    YandexBot             无用爬虫
    AhrefsBot             无用爬虫
    YisouSpider           无用爬虫(已被UC神马搜索收购,此蜘蛛可以放开!)
    jikeSpider            无用爬虫
    MJ12bot               无用爬虫
    ZmEu phpmyadmin       漏洞扫描
    WinHttp               采集cc攻击
    EasouSpider           无用爬虫
    HttpClient            tcp攻击
    Microsoft URL Control 扫描
    YYSpider              无用爬虫
    jaunty                wordpress爆破扫描器
    oBot                  无用爬虫
    Python-urllib         内容采集
    Indy Library          扫描
    FlightDeckReports Bot 无用爬虫
    Linguee Bot           无用爬虫
    View Code

    使用啊步云实现反ip限制

    #通过ip代理绕过ip反爬
    import requests
    from scrapy import Selector
    def get_html(url):
        # 代理服务器
        print("开始下载url : {}".format(url))
        proxyHost = "http-dyn.abuyun.com"
        proxyPort = "9020"
        # 代理隧道验证信息
        proxyUser = "H58G6G30137G865D"
        proxyPass = "043F1F63DA9899C8"
    
        proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
            "host": proxyHost,
            "port": proxyPort,
            "user": proxyUser,
            "pass": proxyPass,
        }
    
        proxies = {
            "http": proxyMeta,
            "https": proxyMeta,
        }
        from fake_useragent import UserAgent
        ua = UserAgent()
        print(ua.random)
        headers = {
            "User-Agent": ua.random
        }
    
        resp = requests.get(url, proxies=proxies, headers=headers)
        return resp
    
    #1. 随机去ip可能会重复
    #2. 用的人太多
    #1. 为什么代理可行,在什么情况下ip代理可行()
    
    if __name__ == "__main__":
        for i in range(1, 30):
            job_list_url = "https://www.lagou.com/zhaopin/Python/{}/?filterOption={}".format(i, i)
            job_list_res = get_html(job_list_url)
            job_list_html = job_list_res.content.decode("utf8")
            sel = Selector(text=job_list_html)
            all_lis = sel.xpath(
                "//div[@id='s_position_list']//ul[@class='item_con_list']/li//div[@class='position']//a[1]/@href").extract()
            for url in all_lis:
                success = False
                while 1:
                    try:
                        job_res = get_html(url)
                        job_html = job_res.content.decode("utf8")
                        job_sel = Selector(text=job_html)
                        print(job_html)
                        print(job_sel.xpath("//div[@class='job-name']//span[1]/text()").extract()[0])
                    except Exception as e:
                        print("下载失败")
                        pass

     

     反爬的类型:

    ### User-Agent识别
    
    修改请求头信息里的User-Agent
    
    ### 请求头信息识别
    
    比如说referer, content-type,请求方法(POST, GET)
    
    构造相应的请求头信息。比如说referer,我们在提取URL的时候,要把URL所在页面的URL也存储起来,并放到request.headers。
    
    ### 异步加载
    
    我们需要分析页面的网络请求,从中找出和我们想要的数据相关的请求,并分析它的请求头信息、参数、cookie,
    然后根据这些信息构造我们的请求。通常来说都是ajax请求,也有图片请求,比如图片的lazy load,通过js在页面加载后修改图片的src属性。
    一般都会有其他的自定义属性存在,比如说
    "_src"。总之,可以找到一些ID或者链接。注意观察相关dom节点树上的特殊属性。 ### 请求参数加密 一般是在前端通过一定的计算,构造出一个哈希值。需要分析前端的代码,找出具体计算的代码逻辑,并用python再实现。
    如果前端的代码经过混淆,并且代码量十分巨大,可以使用selenium或者splash等引擎去请求。但是,如果爬取的数据需求量比较大,
    我们还是要通过直接调用对方接口的形式去获取数据。 ## 请求结果加密 ##
    1. json数据里面加密 比如携程酒店房型列表接口,用它自己的js解密,或者分析它的js前端逻辑,用python代码实现出来。 ### 2. CSS加密 比如大众点评,通过CSS样式去代替某个字符。我们需要同时爬取CSS文件,并且分析CSS文件内的样式,最后定位到svg文件,并分析提取svg内的内容,完成替换。 ### 3. 字体加密 比如猫眼电影。每次随机返回一个字体文件,并且字符也是随机的。需要每次下载对应的字体文件,并解析字体文件和字符之间的对应关系。 ## Cookie限制 登录、session限制,比如新片场,拿到登录以后的cookie,然后set到头信息里面,这样请求的时候就相当于登录了。 ## IP频率限制 需要准备大量的IP代理,获得IP代理的方式有: 1. 自己搭建代理服务器(tinyproxy, squid+动态拨号,DDNS) 2. 付费购买 3. 爬取公开网络上代理(可用性比较低) 控制爬取频率,保持不被封的情况下的最合适的并发数量。 ## 验证码: 1. 尝试可否绕过前端验证,直接请求具体的接口,以绕开验证码. 2. 可以用图片识别库去识别某些比较简单的验证码 3. 接入云打码平台 4. 用机器学习训练验证码的图片库,然后识别
    好好学习,天天向上
  • 相关阅读:
    计蒜客 跳跃游戏2
    计蒜客 跳跃游戏
    2018 计蒜之道-初赛 第一场 A-百度无人车
    poj 3625 (最小生成树算法)
    poj 3623(贪心)
    poj2386(dfs搜索水题)
    poj 2761 主席树的应用(查询区间第k小值)
    POJ 2456 编程技巧之------二分查找思想的巧妙应用
    POJ 1995(有关快速幂运算的一道水题)
    1441:【例题2】生日蛋糕
  • 原文地址:https://www.cnblogs.com/topass123/p/13342040.html
Copyright © 2011-2022 走看看