精华内容
下载资源
问答
  • 反爬常见反爬通过User-Agent来反爬通过Referer来反爬通过Cookie来反爬通过js来反爬通过验证码验证行为来反爬通过ip地址来反爬通过自定义字体来反爬通过css样式来反爬js2py模块的使用js2py简介简单使用案例:人人网...

    常见反爬

    • 通过User-Agent来反爬
    • 通过Referer来反爬
    • 通过Cookie来反爬
    • 通过js加密请求参数来反爬
    • 通过行为验证来反爬
    • 通过ip地址来反爬
    • 通过自定义字体来反爬
    • 通过css样式来反爬

    通过User-Agent来反爬

    • 反爬原理:
      • 爬虫发送请求时,请求头中默认没有User-Agent,或提供非正常的UA
        
    • 应对思路:
      • 在请求时添加UA
        
    • 具体应对:
      • requests模块发送请求时在headers参数中添加UA键值对
        
      • selenium默认自带被控制浏览器的UA,也可以替换UA
        
      • 随机User-Agent,如 faker模块.

    通过Referer来反爬

    Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的

    • 反爬原理:
      • 爬虫发送请求时,请求头中默认情况下不会带上Referer字段
        
    • 应对思路:
      • 在请求时添加Referer
        
    • 具体应对:
      • requests模块发送请求时在headers参数中添加Referer键值对,从抓包信息中复制Referer信息
        
      • selenium默认自带Referer
        

    通过Cookie来反爬

    无论是否需要登陆,web服务器都可以在用户的浏览器中设置Cookie;Cookie是header的一部分,当浏览器向web服务器发送请求的时候,如果存在Cookie就一定会携带

    • 反爬原理:
      • web服务器检查请求头中的cookie是否是之前设置的cookie
        
    • 应对思路:
      • 携带cookie发送请求
        
    • 具体应对:
      • requests模块发送请求时,使用requests.session自动处理cookie
        
      • 用requests模块发送请求时,在cookies参数或在headers参数中,使用selenium获取的cookie;注意cookie的过期时间
        
      • 构建cookie池(根据cookie的过期时间,定期批量获取的cookie,放到数据库中),requests模块发送请求时,使用从cookie池中获取的cookie
        

    通过js来反爬

    很多时候,网站利用用户的浏览器对返回的数据或请求的参数进行解密或加密,比如百度翻译PC版

    • 反爬原理:
      • 利用用户的浏览器执行web服务器返回的js代码来对加密的响应内容进行解密(不常见)
        
      • 利用用户的浏览器执行web服务器返回的js代码来对请求参数进行加密,之后再发送请求(常见)
        
    • 应对思路:
      • python重写js代码的功能、或执行js代码拿到结果
        
    • 具体应对:
      • 完全看不懂js代码:selenium
        
      • 完全看懂js代码:python重写js代码的功能
        
      • 能够看懂js代码执行的大致过程:使用js2py模块运行相关的js代码,获取运行结果(js2py模块在下面将介绍到)
        

    通过验证码验证行为来反爬

    我们在浏览网站时,经常看见类似12306或者这样的等一些用户行为验证

    • 反爬原理:
      • 对方服务器通过弹出验证码强制验证用户浏览行为
        
    • 应对思路:
      • 使用打码平台或深度学习的方式破解验证码
        
    • 具体应对:
      • 一些打码平台(自己搜索)

    通过ip地址来反爬

    正常用户很难在很短的时间内打开需要点击才能访问的链接,那么网站就可以根据ip地址和cookie以及user-agent等能区分不同用户身份的信息来进行反爬

    • 反爬原理:
      • 检测同一个ip在单位时间内是否发送了大量请求
        
      • 经常和cookie以及user-agent配合检查
        
    • 应对思路:
      • 网上获取免费的代理ip
        
      • 购买代理ip
        
      • 使用代理ip池
        
    • 具体应对:
      • 构建代理ip池
        
        • 把免费以及收费的代理ip放到数据库中
        • 使用时随机获取一个代理ip
        • 向目标url发送请求,并设置超时
        • 如果超时或无法使用就在数据库中标记该代理ip对具体访问的url不可用
      • requests模块发送请求使用proxies参数
        
      • selenium可以通过配置对象来使用代理ip
        

    通过自定义字体来反爬

    打开猫眼电影PC页面,右键检查用户评分,查看网页源代码

    在这里插入图片描述

    • 反爬原理:
      • 利用浏览器能够加载渲染并正确显示自定义字体的功能,使用自定义字体不影响正常用户浏览
        
    • 应对思路:
      • 从移动端页面获取数据
        
      • 处理并解析自定义字体
        
    • 具体应对:

    通过css样式来反爬

    打开去哪儿网PC端页面,搜索并查看飞机票信息

    在这里插入图片描述

    • 反爬原理:
      • 利用css样式来便宜标签,且不影响正常用户查看
    • 应对思路:
      • 计算css偏移

    js2py模块的使用

    当我们仅了解js运行的大致情况,又不能使用selenium的时候,就可以使用js2py来解决js执行和js加密的问题

    js2py简介

    • 作用:
      • js2py模块能够帮助我们在python代码中执行js代码,并获取js代码运行的结果或其中的变量
    • 安装:
      • pip install js2py

    简单使用

    import js2py
    
    js_str = '''
    function func(x)
    {
        return x
    }
    '''
    # 实例化js解释器对象
    js_content = js2py.EvalJs()
    
    js_content.execute(js_str) # 传入并执行js代码
    # 调用js代码中的函数并获取返回值
    ret = js_content.func('hahaha')
    print(ret)
    
    js_var = 'var abc = 1'
    js_content.execute(js_var) # # 传入并执行js代码(变量)
    # 获取js代码中的变量
    print(js_content.abc)
    
    # 向js执行解释器中传入变量
    js_content.abc = 2
    print(js_content.abc)
    
    • 步骤:
      • 实例化js解释器对象
        • js_content = js2py.EvalJs()
          
      • 传入并执行js代码
        • js_content.execute(js代码)
          
      • 调用js中的函数并获取返回结果
        • ret = js_content.func('参数')
          
      • 获取js中的变量
        • js_content.变量名
          
      • 向js中传入变量
        • js_content.变量名 = 值
          

    案例:人人网登录

    利用谷歌浏览器抓包确定登录的url、请求方法以及请求参数

    • url:http://activity.renren.com/livecell/ajax/clog
    • 请求方法:POST
    • 请求体参数:
      • phoneNum: 账号
      • password: 加密之后的密码
      • c1: 0
      • rKey: rkey请求获取的

    通过谷歌浏览器抓包知道需要以下三步

    1. 获取rkey
    2. 执行密码加密js
    3. 执行密码加密js过程中会执行BigInt.js 、RSA.js 、Barrett.js 三个js文件
    • 获取rkey

      • url:http://activity.renren.com/livecell/rKey
        
      • 请求方法:GET
        
    • 密码加密js:

    t.password = t.password.split("").reverse().join(""),
    setMaxDigits(130);
    var o = new RSAKeyPair(n.e,"",n.n),
    r = encryptedString(o, t.password);
    
    • 拷贝BigInt.js 、RSA.js 、Barrett.js 三个js文件到本地

    参考代码:

    import requests
    import json
    import js2py
    
    
    #  实例化session对象
    session = requests.session()
    # 自定义头文件
    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36",
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type":"application/x-www-form-urlencoded"
    }
    # 设置session的请求头信息
    session.headers = headers
    
    # 获取js代码中所需要的n值和rKey参数
    response = session.get("http://activity.renren.com/livecell/rKey")
    # print(response.content.decode())
    n = json.loads(response.content)['data']
    
    # 根据获取信息对密码进行加密
    # 准备用户名和密码
    phoneNum = "131..."
    password = "****"
    
    # 使用js2py生成js的执行环境:context
    context = js2py.EvalJs()
    # 拷贝使用到js文件的内容到本项目中
    # 读取js文件的内容,使用context来执行它们
    with open("BigInt.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    with open("RSA.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    with open("Barrett.js", 'r', encoding='utf8') as f:
        context.execute(f.read())
    
    # 向context环境中添加需要数据
    context.t = {'password': password}
    context.n = n
    # 执行加密密码的js字符
    js = '''
           t.password = t.password.split("").reverse().join(""),
           setMaxDigits(130);
           var o = new RSAKeyPair(n.e,"",n.n)
            , r = encryptedString(o, t.password);
          '''
    context.execute(js)
    # 通过context获取加密后密码信息
    # print(context.r)
    password = context.r
    
    # 使用session发送登录请求
    data = {
        'phoneNum': '131....',
        'password': password,
        'c1':0,
        'rKey':n['rkey']
    }
    
    response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data)
    print(response.content.decode())
    
    # 访问需要登录的资源
    response = session.get("http://activity.renren.com/home#profile")
    print(response.content.decode())
    

    cooike代理池和ip代理池

    cooike代理池

    • cookie池的应用场景
      • 当需要很多账号进行大批量采集数据时,在发送获取数据的请求时都需要登录
      • 或在发送获取数据的请求时都需要发送前置请求
    • cookie池的作用
      • 省资源(减少耗时、减少请求)
      • 保护账号或ip(避免频繁访问)
        在这里插入图片描述
    • 定期获取cookie:可以使用requests模块或selenium
    • 存储cookie
    • 获取cookie的函数或webapi
    • 删除失效cookie的函数或webapi(获取cookie的时间周期可以设置在cookie有效期内)

    总结:我们可以不断的去获取cooike然后把这些cookie储存起来,我们要用的时候随机拿一个,如果遇到过期的cooike就把它从储存的地方删除

    ip代理池

    • 应用场景:大量代理ip频繁切换时,需要使用代理ip池
    • 作用:提高数据抓取的效率,让服务器以为不是同一个客户端在请求,避免真实ip被封
      在这里插入图片描述
    • 定期获取代理ip:更新存储的代理ip
      • 免费的
      • 收费的
    • 存储代理ip
    • 提供代理ip的接口
    • 删除/标记代理ip的接口
      • 某个经过初步检查(请求下baidu等)代理ip对一个目标url不可用时,不代表对其它域名的url也不好使
      • 这个时候需要在代理ip存储的载体中,标记该代理ip对某个域名无效

    总结:我们可以通过一些代理ip网站去获取一些代理ip,然后把这些ip储存起来,我们要用的时候随机拿一个,通过这个ip去访问我们需要爬取的网站,这样可以避免我们使用一个ip频繁访问而被封的情况。

    展开全文
  • 绕过反爬机制的方法

    2021-07-22 10:52:00
    反爬机制:图片懒加载,广泛应用在了一些图片的网站中。 只有当图片被显示在浏览器可视化范围之内才会将img的伪属性变成真正的属性。如果是requests发起的请求,requests请求是没有可视化范围,因此我们-一定要解析...

    ●站长素材高清图片下载
            ■反爬机制:图片懒加载,广泛应用在了一些图片的网站中。
                    只有当图片被显示在浏览器可视化范围之内才会将img的伪属性变成真正的属性。如果是requests发起的请求,requests请求是没有可视化范围,因此我们-一定要解析的是img伪属性的属性值(图片地址)
            ●学过的反爬机制.
                    ■robots
                    ■UA伪装
                    ■动态加载数据的捕获
                    ■图片懒加载

    ●cookie
    ●代理机制
    ●验证码的识别
    ●模拟登录

            ●cookie:
                    ■是存储在客户端的一组键值对。
                    ■web中cookie的典 型应用:
                            - 免密登录
                    ■cookie和爬虫之间的关联
                            - sometimes, 对一张页面进行请求的时候,如果请求的过程中不携带cookie的话,那么我们是无法请求到正确的页面数据。因此cookie是爬虫中-一个非常典型且常见的反爬机制。

            ●需求:爬取雪球网中的咨询信息。 https://xueqiu.com/
            ●分析:
                    ■1.判定爬取的咨询数据是否为动态加载的
             - 相关的更多咨询数据是动态加载的,滚轮滑动到底部的时候会动态加载出更多咨询数据。
                    ■2.定位到ajax请求的数据包,提取出请求的url,响应数据为json形式的咨询数据

             ●问题:我们没有请求到我们想要的数据
            ●原因:我们没有严格意义上模拟浏览器发请求。
                    ■处理:可以将浏览器发请求携带的请求头,全部粘贴在headers字典中,将headers作用到requests的请求操作中即可。
            ●cookie的处理方式
                    ■方式1:手动处理
                    。将抓包工具中的cookie粘贴在headers中
                    。弊端: cookie如果过了有效时长则该方式失效。
                    ■方式2:自动处理
                    。基于Session对象实现自动处理。
                    。如何获取- -个session对象: requests Session0返回- -个session对象。
                    。session对象的作用:
                    。该对象可以向requests- -样调用get和post发起指定的请求。只不过如果在使用session发请求的过程中如果产生了cookie,则cookie会 被自动存储到该session对象中,那么就意味着下次再次使用session对象发起请求,则该次请求就是携带cookie进行的请求发送。
                    。在爬虫中使用session的时候,session对象至 少会被使用几次?
                    。两次。第一次使用session是为了将ookie捕获且存储到session对象中。 下次的时候就是携带cookie进行的请求发送。

    session = requests.Sessiom()
    mainUrl = "主页网址获取cookie"
    # 第一次发请求获取cookie
    session.get(mainUrl, headers=headers)
    
    # 第二次发请求会携带cookie
    url = "需要爬取的网址"
    pageText = session.get(url, headers=headers).json()
    

            ●代理机制操作

                    ■在爬虫中,所谓的代理指的是什么?
                            。就是代理服务器
                    ■代理服务器的作用是什么?
                            。就是用来转发请求和响应。
                    ■在爬虫中为什么需要使用代理服务器?
                            。如果我们的爬虫在短时间内对服务器发起了高频的请求,那么服务器会检测到这样的一个异常的行为请求,就会将该请求对应设备的ip禁掉,就以为这client设备 无法对服务器端再次进行请求发送。(ip被禁掉了)
                            。如果ip被禁, 我们就可以用代理服务器进行请求转发,破解ip被禁的反爬机制。因为使用代理后,服务器端接受到的请求对应的ip地址就是代理服务器而不是我们真正的客户端的。
                    ■代理服务器分为不同的匿名度:
                            。透明代理:如果使用了该形式的代理,服务器端知道你使用了代理机制也知道你的真实ip。
                            。匿名代理:知道你使用代理,但是不知道你的真实ip
                            。高匿代理:不知道你使用了代理也不知道你的真实ip
                    ■代理的类型
                            。https: 代理只能转发https协议的请求
                            。http: 转发http的请求
                    ■代理服务器:
                            。快代理
                            。西祠代理
                            。goubanjia
                            。代理精灵(推荐) : http://http.zhiliandaili.cn

    # ●封装一个代理池
    from 1xml import etree
    url = '代理端口的网址'
    page_text = requests.get(ur1,headers=headers).text
    tree = etree.HTML(page_text)
    proxy_list = tree.xpath('//body//text()')
    http_proxy = []  # 代理池
    for proxy in proxy_list:
        dic = {
            'http' : proxy
        }
        http_proxy.append(dic)
    http_proxy
    # ●使用代理机制破解ip被封的效果
    #ur1模板
    url = 'https://www.xicidaili.com/nn/%d '
    ips = []
    for page in range(1,11):
        new_url = format(ur1%page)
        #让当次的请求使用代理机制,就可以更换请求的ip地址
        # page_text = requests.get(url=new_url, headers=headers, proxies={'http':ip:port}).text
        page_text = requests.get(url=new_url, headers=headers, proxies=random.choies(http_proxy)).text
        tree = etree.HTML(page_text)
        #在xpath表达式中不可以出现tbody标签
        tr_1ist = tree.xpath('//*[@id="ip_list"]//tr')[1:]
        for tr in tr_list:
            ip = tr.xpath('./td[2]/text()')[0]
            ips .append(ip)
    print(1en(ips))
    

             ●验证码的识别
                    基于线上的打码平台识别验证码
                    打码平台
                            - 1.超级鹰(使用) : http://www。chaojiying. com/ about。html
                                    - 1.注册[用户中心的身份]
                                    - 2.登录(用户中心的身份)
                                            - 1.查询余额,请充值
                                            - 2.创建一个软件ID (899370)
                                            - 3.下载一个示例代码
                            - 2.云打码
                            - 3.打码兔

            ●模拟登录
                    ■流程:
                    。对点击登录按钮对应的请求进行发送(post请求)
                    。处理请求参数:
                            。用户名
                            。密码
                            。验证码
                            。其他的防伪参数

            ●在请求参数中如果看到了- -组乱序的请求参数,最好去验证码这组请求参数是否为动态变化。
            ●处理:
                    ■方式1:常规来讲一 半动态变化的请求参数会被隐藏在前台页面中,那么我们就要去前台页面源码中取找。
                    ■方式2:如果前台页面没有的话,我们就可以基于抓包工具进行全局搜索。

    #识别验证码
    login_url = '登录的URL'
    data = {
        'VIEWSTATE' : '41QUDYGYp480//d8dSe+k037Ut9i jESlrJJLPgCESA+C4 EAmEQV4h+p/G4 sKwsGz2mFd',
        'VIEWSTATEGENERATOR' : 'C93BE1AE' ,
        'from' : 'http://so.gushiwen.org/user/collect.aspx',
        'email' : 'www.zhangbowudieqq.com',
        'pwd' : bobo328410948',
        'code': '验证码',   #动态变化
        'denglu' : '登录',
    }
    #对点击登录按钮发起请求:获取了登录成功后对应的页面源码数据
    page_text_login = requests.post(url=login_ur1, headers=headers,data=data).text
    

            ●基于百度AI实现的爬虫功能
                    ■图像识别
                    ■语音识别&合成
                    ■自然语言处理
            ●使用流程:
                    ■点击控制台进行登录
                    ■选择想要实现的功能
                    ■实现功能下创建一个app
                    ■选择对应的pythonSDK文档进行代码实现

    展开全文
  • 常见反爬机制及其破解方法 常见反爬机制及其破解方式: 封禁IP,使用cookie等前面文章已经讲过 现在主要将下面的: ​ ~ 验证码 ​ —> 文字验证码 —> OCR(光学文字识别)—> 接口 / easyocr ​ 程序自己...

    常见反爬机制及其破解方法

    常见反爬机制及其破解方式:
    封禁IP,使用cookie等前面文章已经讲过

    现在主要将下面的:

    ​ ~ 验证码
    ​ —> 文字验证码 —> OCR(光学文字识别)—> 接口 / easyocr
    ​ 程序自己解决不了的问题就可以考虑使用三方接口(付费/免费)
    ​ —> 行为验证码 —> 超级鹰
    ​ ~ 手机号+短信验证码
    ​ —> 接码平台
    ​ ~ 动态内容
    ​ —> JavaScript逆向 —> 找到提供数据的API接口
    ​ —> 手机抓接口 —> 抓包工具(Charles / Fiddler)
    ​ —> Selenium直接模拟浏览器操作获取动态内容
    ​ ~ find_element_by_xxx / find_elements_by_xxx
    ​ ~ page_source —> 获取包含动态内容的网页源代码
    ​ —> JavaScript加密和混淆技术 —> 读懂JavaScript是反反爬的前提
    ​ ~ 字体反爬 / 内容来自于抠图
    ​ —> 例子

    bytes —> 不变字节串 —> 二进制 —> BytesIO
    str —> 不变字符串 —> 可阅读的字符 —> StringIO

    一、调用三方API接口数据(天行数据)

    import requests
    
    for page in range(1, 6):
        response = requests.get(
            'http://api.tianapi.com/topnews/index',
            params={
                'key': 'd5eace66dccd771e36767ce3563efa09',
                'page': page,
                'num': 20,
                'word': '华为',
                'src': '人民日报'
            }
        )
        result = response.json()
        for news in result['newslist']:
            print(news['title'])
            print(news['url'])
    

    二、OCR(光学文字识别)库

    python 自带的easyocr库

    import easyocr
    reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)
    print(reader.readtext('./files/captcha.jpg', detail=0))
    

    例子:阿里云邮箱自动登陆

    import io
    
    import easyocr
    
    from PIL import Image
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.support.wait import WebDriverWait
    
    browser = webdriver.Chrome()
    browser.set_window_size(1280, 960)
    browser.get('http://mail.1000phone.com/')
    # 隐式等待(下面的方法在工作时如果取不到就等10秒)
    browser.implicitly_wait(10)
    # 显式等待
    wait = WebDriverWait(browser, 10)
    wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, '.login_panel_iframe')))
    iframe1 = browser.find_element_by_css_selector('.login_panel_iframe')
    # 记录iframe1的位置(相对位置)
    x1, y1 = iframe1.location['x'], iframe1.location['y']
    # Chrome对象的switch_to属性的frame方法,可以从页面切换到iframe中
    browser.switch_to.frame(iframe1)
    iframe2 = browser.find_element_by_css_selector('#ding-login-iframe')
    x2, y2 = iframe2.location['x'], iframe2.location['y']
    browser.switch_to.frame(iframe2)
    username_input = browser.find_element_by_css_selector('#username')
    # 模拟用户输入
    username_input.send_keys('xx@1000phone.com')
    password_input = browser.find_element_by_css_selector('#password')
    password_input.send_keys('xxxxx!!')
    # 创建一个等待对象
    wait = WebDriverWait(browser, 10)
    wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '#login_checkcode_ico')))
    captcha_img = browser.find_element_by_css_selector('#login_checkcode_ico')
    # WebElement对象的size属性代表元素宽度和高度,location属性代表元素在窗口中的位置
    size, location = captcha_img.size, captcha_img.location
    x3, y3, width, height = location['x'], location['y'], size['width'], size['height']
    # 截取整个浏览器窗口的图片获得图片的二进制数据
    image_data = browser.get_screenshot_as_png()
    # bytes(只读字节串) ----> io.BytesIO(可写字节串)---> getvalue() ---> bytes
    # str(只读字符串) ----> io.StringIO(可写字符串)---> getvalue() ---> str
    browser_image = Image.open(io.BytesIO(image_data))
    # 从截图上剪裁出验证码的图片
    x, y = x1 + x2 + x3, y1 + y2 + y3
    # Windows系统的写法 ---> 如果截图有问题就把坐标写死
    # print(x, y, width, height)
    checkcode_image = browser_image.crop((x * 1.25, y * 1.25, (x + width) * 1.25, (y + height) * 1.25))
    # macOS系统的写法
    # checkcode_image = browser_image.crop((x * 2, y * 2, (x + width) * 2, (y + height) * 2))
    checkcode_image.save('result.png')
    # 通过easyocr做光学文字识别
    reader = easyocr.Reader(['en'], gpu=False)
    code = reader.readtext('result.png', detail=0)[0]
    # 将识别出的验证码输入文本框
    checkcode_input = browser.find_element_by_css_selector('#login_checkcode')
    checkcode_input.send_keys(code)
    login_button = browser.find_element_by_css_selector('#login_submit_btn')
    # 模拟用户点击
    login_button.click()
    

    三、第三方打码平台(超级鹰打码平台)

    补充:需要使用python 自带pillow库

    """
    Pillow库 ---> PIL ---> Python Image Library
    """
    from PIL import Image, ImageFilter
    
    # 加载图像
    guido_image = Image.open('guido.jpg')
    # 剪裁
    guido_image.crop((80, 40, 310, 350)).show()
    # 滤镜
    guido_image.filter(ImageFilter.CONTOUR).show()
    # 缩略图
    guido_image.thumbnail((125, 185))
    # 显示图像
    guido_image.show()
    

    编写超级鹰打码平台类

    from hashlib import md5
    
    import requests
    
    
    class ChaojiyingClient:
    
        def __init__(self, username, password, soft_id):
            self.username = username
            password = password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }
    
        def post_pic(self, image_data, code_type):
            """
            image_data: 图片字节
            code_type: 验证码类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': code_type,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', image_data)}
            response = requests.post(
                url='http://upload.chaojiying.net/Upload/Processing.php',
                data=params,
                files=files,
                headers=self.headers
            )
            return response.json()
    
        # 超级鹰错误反馈函数(仅用于给超级鹰平台反馈)
        def report_error(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()
    
    
    if __name__ == '__main__':
        chaojiying = ChaojiyingClient('账户', '密码x', 'ID')  # 用户中心>>软件ID 生成一个替换 96001
        with open('img.png', 'rb') as file:
            image_data = file.read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
            print(chaojiying.post_pic(image_data, 1902))  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    
    

    例子:使用超级鹰进行阿里云邮箱自动登陆

    import io
    
    import easyocr
    
    from PIL import Image
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.support.wait import WebDriverWait
    
    from chaojiying import ChaojiyingClient
    
    browser = webdriver.Chrome()
    browser.set_window_size(1280, 960)
    browser.get('http://mail.1000phone.com/')
    # 隐式等待(下面的方法在工作时如果取不到就等10秒)
    browser.implicitly_wait(10)
    # 显式等待
    wait = WebDriverWait(browser, 10)
    wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, '.login_panel_iframe')))
    iframe1 = browser.find_element_by_css_selector('.login_panel_iframe')
    # 记录iframe1的位置(相对位置)
    x1, y1 = iframe1.location['x'], iframe1.location['y']
    # Chrome对象的switch_to属性的frame方法,可以从页面切换到iframe中
    browser.switch_to.frame(iframe1)
    iframe2 = browser.find_element_by_css_selector('#ding-login-iframe')
    x2, y2 = iframe2.location['x'], iframe2.location['y']
    browser.switch_to.frame(iframe2)
    username_input = browser.find_element_by_css_selector('#username')
    # 模拟用户输入
    username_input.send_keys('xxxx.com')
    password_input = browser.find_element_by_css_selector('#password')
    password_input.send_keys('xxxx!!')
    # 创建一个等待对象
    wait = WebDriverWait(browser, 10)
    wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '#login_checkcode_ico')))
    captcha_img = browser.find_element_by_css_selector('#login_checkcode_ico')
    # WebElement对象的size属性代表元素宽度和高度,location属性代表元素在窗口中的位置
    size, location = captcha_img.size, captcha_img.location
    x3, y3, width, height = location['x'], location['y'], size['width'], size['height']
    # 截取整个浏览器窗口的图片获得图片的二进制数据
    image_data = browser.get_screenshot_as_png()
    # bytes(只读字节串) ----> io.BytesIO(可写字节串)---> getvalue() ---> bytes
    # str(只读字符串) ----> io.StringIO(可写字符串)---> getvalue() ---> str
    browser_image = Image.open(io.BytesIO(image_data))
    # 从截图上剪裁出验证码的图片
    x, y = x1 + x2 + x3, y1 + y2 + y3
    # Windows系统的写法 ---> 如果截图有问题就把坐标写死
    # print(x, y, width, height)
    checkcode_image = browser_image.crop((x * 1.25, y * 1.25, (x + width) * 1.25, (y + height) * 1.25))
    # macOS系统的写法
    # checkcode_image = browser_image.crop((x * 2, y * 2, (x + width) * 2, (y + height) * 2))
    checkcode_image.save('result.png')
    # 通过超级鹰打码平台打码
    chaojiying = ChaojiyingClient('账户', '密码', 'ID')
    with open('result.png', 'rb') as file:
        image_data = file.read()
        result_dict = chaojiying.post_pic(image_data, 1902)
    # 将识别出的验证码输入文本框
    checkcode_input = browser.find_element_by_css_selector('#login_checkcode')
    checkcode_input.send_keys(result_dict['pic_str'])
    login_button = browser.find_element_by_css_selector('#login_submit_btn')
    # 模拟用户点击
    login_button.click()
    
    

    四、通过接码平台接收手机验证码(隐私短信平台)

    通过隐私短信平台接收验证码(免费)

    
    import re
    
    import bs4
    import requests
    
    pattern = re.compile(r'\d{4,6}')
    
    resp = requests.get('https://www.yinsiduanxin.com/china-phone-number/verification-code-16521686439.html')
    soup = bs4.BeautifulSoup(resp.text, 'html.parser')
    # print(resp.text)
    td = soup.select_one('body > div.container > div:nth-child(4) > div:nth-child(3) > div.main > div.layui-row > table > tbody > tr:nth-child(1) > td:nth-child(2)')
    results = pattern.findall(td.text)
    print(results[0])
    
    展开全文
  • 常见得反爬机制及解决办法 1、针对请求头做出得反爬 简介:网站通过去检查headers中的User-Agent字段来反爬,如果我们没有设置请求头,那么headers默认是python这样就会出现访问失败、没有权限等原因,如果去...

    常见得反爬机制及解决办法

    1、针对请求头做出得反爬

    简介:网站通过去检查headers中的User-Agent字段来反爬,如果我们没有设置请求头,那么headers默认是python这样就会出现访问失败、没有权限等原因,如果去伪造一个请求头是可以避开得,不过如果短时间内频繁使用同一个User-Agent访问可能会被检测出来导致被封掉爬虫

    解决办法:通过fake_useragent构造随机请求头

    第一步:下载fake_useragent

    可以直接在cmd当中输入:

    pip install fake-useragent

    接下来设置代码如下:

    import requests
    from fake_useragent import UserAgent
    import random  #随机模块
    ua = UserAgent()  # 创建User-Agent对象
    useragent = ua.random
    headers = {'User-Agent': useragent}
    

    到这里得时候其实已经写好了,但肯定有小伙伴会想着去测试一下是不是真的自己使用了随机请求头那么我们去访问  http://httpbin.org/headers 看下返回得请求头数据

    第二步:验证请求头

    import requests
    from fake_useragent import UserAgent
    import random  #随机模块
    ua = UserAgent()  # 创建User-Agent对象
    useragent = ua.random  #随机使用请求头
    headers = {'User-Agent': useragent}
    url='http://httpbin.org/headers'
    renoes=requests.get(url,headers=headers)
    print(renoes.text)

    运行两次结果如下 

     可以发现请求头已经发生了变化并且每次不一样

    补充说明一点:

    在使用fake_useragent有时候会报错第一个原因可能是UserAgent列表发生了变动,而本地UserAgent的列表未更新所导致

    解决方法可以参考这篇文章 

    (21条消息) 解决fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached问题_一条会编程的鱼-CSDN博客https://blog.csdn.net/weixin_43581288/article/details/106529656?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163523713016780357226389%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163523713016780357226389&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-106529656.first_rank_v2_pc_rank_v29&utm_term=fake_useragent.errors.FakeUserAgentError%3A+Maximum+amount+of+retries+reached&spm=1018.2226.3001.4187

    如果通过上面那篇文章还是没有解决报错可以参考下面这篇

    (21条消息) 简单修改setting文件,解决fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached_大河的博客-CSDN博客https://blog.csdn.net/qq_45773419/article/details/119063825?spm=1001.2014.3001.5506

    然后得话还有一个要注意得地,用这个方法爬取某些网站得时候获取网站源代码,你会发现获取得竟然是一个提示,提示说浏览器版本太老啦,其实这个原因就是fake_useragent里面浏览器版本确实挺低得,遇到这种情况用自己得浏览器请求头就可以解决,可以这样写

    import requests
    import random  #随机模块
    #这个列表里面存放你自己收集来得请求头,下面得请求头是我用fake_useragent随机生成得,仅用来做演示如果直接使用还是有可能会提示浏览器版本低
    UserAgents=[
    'Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0',
    'Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36',
    'Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0',
    'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36'
    ]
    user_agent=random.choice(UserAgents)
    headers = {'User-Agent':user_agent}
    url='http://httpbin.org/headers'
    renoes=requests.get(url,headers=headers)
    print(renoes.text)

     2、针对ip做出得反爬

    简介:网站后台检测到IP频繁访问,从而封掉IP地址

    解决办法:使用代理IP 或者构建IP代理池

     使用代理IP的话个人是比较推荐快代理的隧道代理 快代理 - 企业级代理云服务提供商 (kuaidaili.com)

    原因嘛就是可以每次请求更换IP地址配合上面说的随机请求头更加保险

    当然设置起来也是很简单的他们官方有专门的技术文档,在代码样例里面可以看到也是支持下载代码到本地 

     

    3、账号封禁

    简介:有的网站必须要求登录账号才能继续访问,如果我们用一个账号爬取过于频繁就会导致这个账号被封禁

    解决办法:使用接码平台注册账号(这里不过多讲解具体操作,自己百度一下吧~)

    4、处理验证码

    简介:我们在爬取一些网站的时候它们并不是静态页面,而是通过Ajax交互来异步更新网页

    解决办法:分析其JS接口、使用selenium模拟浏览器来获取数据(后面得话都是将如何用selenium获取数据,因为分析JS接口有些网站会加密本人目前暂时不会JS逆向,下次一定补上)

    1、处理普通的图像验证码

    列如: 

    这种的话可以使用tesseract这个库去识别,但是吧这样费时费力而且识别准确度不高不如直接动用打码平台快,可以使用超级鹰打码平台便宜速度还快

    处理方法参考我写的另外一篇文章:

    超级鹰的使用方式_m0_59874815的博客-CSDN博客首先肯定要有一个账号嘛超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大 (chaojiying.com)注册我觉得没啥好说的小伙伴门自己来哈,注册好账号之后我们点击开发文档,选择自己的语言我这里选择的是python点击下载之后得到的是一个压缩文件需要解压我们点击这个文件即可其它不用管这里更换为自己的账号密码,最后的软件ID如下图获取这里需要注意的是由于是python3的版本我们还需要在print后面加上()到这里就差...https://blog.csdn.net/m0_59874815/article/details/121007373

    2、处理图像识别

    列如:

     这种我依然使用的超级鹰打码,不过的话有些图片实在是太模糊识别成功率吧~不会太高不过勉强能用

    处理方法参考我写的另外一篇文章:

    使用python+selenium超级鹰破解图像识别验证码_m0_59874815的博客-CSDN博客大家做爬虫的时候肯定会遇到很多验证码列如本文所指的图像识别:我在爬取拉勾网的时候过于频繁被跳转到了验证系统,真是令人头大url=安全访问验证-拉勾网https://sec.lagou.com/verify.html?e=2&f=https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=我们需要先点击这里的验证按钮之后就会直接跳出图像验证码,在识别完成之后点击...https://blog.csdn.net/m0_59874815/article/details/121048996

    3、处理滑块验证 

     这种我们使用opencv来识别缺口从而模拟拖动

    处理方法如下:

    selenium+opencv破解滑块验证码_m0_59874815的博客-CSDN博客https://blog.csdn.net/m0_59874815/article/details/121195481?spm=1001.2014.3001.5501

    4、使用selenium获取cookie,并且携带cookie信息登录从而避免再次认证

    之前我们不是已经介绍了验证码如何处理嘛,那我们第一次模拟登录之后下一次总不能在继续识别验证码之后在登陆吧,这样很烧钱得呀(超级鹰识别要钱,虽然不贵但那也是钱嘛)而且还不能保证成功率,所以我们模拟登录之后需要获取其cookie信息下次在登录直接携带即可

    处理方法参考我写的另外一篇文章:

    selenium获取cookie并携带模拟登录_m0_59874815的博客-CSDN博客前言:有小伙伴可能会觉得明明F12在开发者选项里面就能获取到cookie信息为啥还要专门写一个程序去获取,这不多此一举嘛其实并不是哟,首先呢一般你直接登录之后得cookie信息都是不完整得只有一条而且大部分都是加密过得,哪怕我们假设它是完整得你直接复制之后selenium也接受不了,因为直接复制得格式不是selenium要求的你再去转换格式不得很麻烦呀不多废话哈切入正题,这次测试得目标网站为QQ空间 https://mail.qq.com/1、获取cookie信息先定义前面...https://blog.csdn.net/m0_59874815/article/details/121183959

    好了反爬整合就写到这里拉,以后想起啥在补充吧

    声明

    本文仅限于做技术交流学习,请勿用作任何非法用途!

    展开全文
  • 爬虫反爬机制及反爬策略

    千次阅读 2020-10-19 15:49:35
    爬虫是一种模拟浏览器对网站发起请求,获取数据的方法。简单的爬虫在抓取网站数据的时候,因为对网站访问过于频繁,给服务器造成过大的压力,容易使网站崩溃,因此网站维护者会通过一些手段避免爬虫的访问,以下是...
  • 常见的反爬机制

    2020-04-28 15:17:15
    常见的基础反爬 1、Headers反爬虫 :Cookie、Referer、User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2、IP限制 :网站根据IP地址访问频率进行反爬,短时间内进制IP访问 解决方案: 1、构造...
  • 常见的反爬机制及应对策略

    千次阅读 2019-03-31 22:35:35
    从用户的headers进行反爬是最常见的反爬策略,Headers是一种最常见的反爬机制Headers是一种区分浏览器行为和机器行为中最简单的方法,还有一些网站会对Referer (上级链接)进行检测 从而实现爬虫。 相应的解决措施...
  • 有哪些反爬机制

    2020-07-16 14:25:35
    对于爬虫用户来说,网站的反爬机制可以说是他们的头号敌人。反爬机制是为了防止爬虫爬取数据过于频繁,给服务器造成过重的负担导致服务器崩溃而设置的机制,它其实也有几种不同的方式,下面我们就来说说。 1、通过...
  • 01前言想着爬取『豆瓣』的用户和电影数据进行『挖掘』,分析用户和电影之间以及各自之间的关系,数据量起码是万级别的。但是在爬取过程中遇到了反爬机制,因此这里给大家分享一下如何解决爬虫的反爬问...
  • 每个网站的反爬策略在不断升级(淘宝,京东,企查查),那么现在突破反爬虫的策略也要相应的不断升级,不然很容易被限制,而在提高爬虫工作效率上,动态代理IP是最大的助力,亿牛云海量的家庭私密代理IP完全可以使...
  • 常见的反爬机制及处理方法 """ ⒈Headers反爬虫:Cookie、Referer、User-Agent """ User-Agent 用户代理,是Http协议中的一部分,属于请求头的组成部分,作用是描述发出HTTP请求的终端的一些信息。 使得服务器...
  • (1)网站要求在浏览器的请求头加上浏览器标识时 使用,User-Agent 伪装浏览器 (2)当网站限制 IP 时, 使用代理 IP,或者伪装 IP (3)当网站要求 cookie 验证时, 一般的做法是 IP + User-Agent 去访问,然后会返...
  • 如何破解字体反爬机制

    千次阅读 2018-10-27 17:39:14
    这几天爬取58租房信息的时候意外发现了它是一个字体反爬的网站,所谓的字体反爬就是网站将一些关键字替换为网站自己的字体,这样在网页上字体会正常显示,但是当爬取下来的时候,经过字体加密的字符都是乱码的,根本...
  • 爬虫的概念及类型 1.什么是爬虫? 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 ...爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制, 从而可以获取门户网站
  • 一些反爬机制

    千次阅读 2018-04-07 15:48:20
    写爬虫的时候总结出部分反爬机制:(1)U-A校验模式 当你在家用浏览器上网的时候,每次发送请求时请求头会自动携带浏览器参数还有系统参数给服务器。从而让服务器知道这是一个人啊!一次来作为反爬机制的一种。(2)...
  • selenium反爬机制

    2019-05-06 16:28:00
    使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制。它的应用,使得许多网站的反采集策略形同虚设。由于selenium不会在...
  • python web编程之反爬机制绕过 从一道逆向题引发的思考: 能否直接将要解密的数据,通过python脚本的的方式,提交给相应的网站,并通过脚本抓取相应的结果 现在的网站都添加了相应的反爬取机制,刚开始的几次...
  • 爬虫系列 — 反爬机制和破解方法汇总 反爬机制和破解方法汇总 一什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式。 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。...
  • 某Boss招聘网站的反反爬机制详解

    千次阅读 多人点赞 2020-04-26 02:44:12
    近日出于学习的目的对某Boss网站的反爬机制进行了分析和逆向,终于完全搞定了,记录总结下方便日后学习! 本代码请仅用于 纯技术研究的 用途,请勿用于商业用途或 非法用途,如果因使用者非法使用造成的法律问题与本...
  • 这个网站的反爬虫机制比较简单。当我们使用网络请求库下载图片时,该网站会对检查每个 HTTP 请求的 headers 头部中 Referer 字段。它判断该字段是否为空,如果字段为空,那么不会返回正常显示的图片,而是返回一张带...
  • 爬虫如何突破网站的反爬机制

    千次阅读 2019-07-22 14:35:49
    每个网站的反爬策略在不断升级(淘宝,京东,企查查),那么现在突破反爬虫的策略也要相应的不断升级,不然很容易被限制,而在提高爬虫工作效率上,动态代理IP是最大的助力,亿牛云海量的家庭私密代理IP完全可以使...
  • scrapy豆瓣实战反爬机制(转)

    千次阅读 2018-07-20 15:04:50
    scrapy是优秀的Python爬虫框架,最近在使用scrapy爬取豆瓣音乐信息时,着实被其反爬机制搞了一下。虽然豆瓣提供了各种API可以供我们提取信息,但是我就是要用爬虫爬你练手。 正文 常见的反爬机制有如下几种: 1....
  • 反爬机制

    2019-04-14 22:44:00
    1.robots 2.UA伪装 3.基于ajax加载的动态数据 4.图片懒加载 5.数据加密 6.input隐藏数据 7.验证码 8.cookie 转载于:https://www.cnblogs.com/Lucifer77/p/10707973.html
  • 爬虫中常见的问题,常见的反爬机制

    千次阅读 多人点赞 2019-10-01 11:42:00
    这个问题的话,在一般情况下还是不会遇到,主要就是在高并发请求的时候,有可能同一个时刻请求多次来自同一个站点的数据,触发该网站的反爬机制的频率限制,就会出现什么scoket.timeout,urllib3.connection....
  • # 什么是图片懒加载?... 懒加载技术反爬 requests模块是没有可视化的,响应结果中全是src2 print (image_name) # 打印图片名称 转载于:https://www.cnblogs.com/zhangchen-sx/p/10841249.html
  • 这篇文章的主要目的还是破解JS参数加密,百度翻译的JS过程并不是很复杂,非常适合新手练手。 ... 更多Python视频、源码、资料加群683380553免费获取 ...打开第二个文件v2transapi,可以看到我们需要的内容。...
  • 爬虫的反爬机制与相对应的反反爬手段
  • 将爬虫伪装成浏览器,可以骗过后台反爬机制 Opera Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60 Opera/8.0 (Windows NT...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,878
精华内容 1,951
关键字:

反爬机制