zoukankan      html  css  js  c++  java
  • 爬虫2

    request.html 

    html的对象属性

    对象方法:   find     search    render(大头)  scrolldown  sleep  keep_page     反扒

    浏览器的交互   html.page.xxx

    asynic内部 写

    键盘事件

    牛逼的requests-html
    
    from requests_html import HTMLSession
    
    session = HTMLSession(
        browser_args=[
            '--no-sand',
            '--user-agent=xxx'
        ],
        headless=False
    )
    
    
    # 上述参数    
      no-sand 以最高权限运行
      user-agent  改变用户的信息,避免被浏览器发现自己是非法用户,需要注意不能有空格
      headless    因为render下载的内核浏览器是无头的,所以需要让其变的有头,需要改变源码
    
                
    响应对象有三:
    响应对象 = session.request(......,method='')
    响应对象 = session.get(......)
    响应对象 = session.post(......)
    html响应属性:  和 requests库是一样的
    
    form requests_html import HtmLSession
    
    session = HtmLSession()
    
    r = session(url="https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=0&genres=%E5%89%A7%E6%83%85")
    
    r.url
    r.text
    r.encoding
    r.content
    r.json()
    r.status_code
    r.header
    r.cookies
    r.history
    html对象属性:
    
    from  requests_html imort HTMLSession
    
    session = HTMLSession()
     
    r = session(url="http://www.baidu.com")
    
    r.html.absolute_links    将所拿到的路径改变为绝对路径
    r.html.links   输出原样的路径,相对的还是相对
    r.html.html    拿到html文件
    r.html.text      拿到所有的文本内容   最好在配合对象方法find下一起使用
    r.html.encoding   解决r.html.html的编码问题
    r.html.raw_html   拿到二进制数据流,原生的数据,可以通过decode解码来转变
    r.html.pq    产生的是一个pquery对象
    
    注:r.encoding() 控制的是r.text的编码
    r.html.encoding()控制的是r.html.html格式
    html的对象方法
    
    
    from requests_html import HTMLSession
    
    session = HTMLSession()
    
    r = session(url="http://www.mi.com") 
    
    r.html.find('css选择器')   拿到符合条件的一个列表,里面是element对象
    
    r.html.find('css选择器',first=True) 拿到匹配到的第一个element对象,可以和text属性连用,取得其内部的text文本
    
    r.html.xpath("xpath选择器")
    
    r.html.xpath('xpath选择器',first=True)
    
        .search('模板')  从上到下,匹配一次,返回的是result对象
        ('xxx{}yyy{}'[0])   搭配find属性使用,记得加上first=True,拿到第一个中括号内的数据
       
        .search_all('模板')     返回的是一个list类型,符合条件的数据都被拿出来
    
    r.html.render()    第一次使用时,会自动下载内核浏览器,
    作用是将获取的数据进行渲染,替换掉原始数据
    render()的使用
    
    from requests_html import HTMLSession
    
    session = HTMLSession()
    
    r = session.get(url="http://www.baidu.com")
    
    
    
    #   r.html.render(内部存在一些参数)
    
    # 参数
    scripts = '''  
    
    () =>{
    
    return document.charset
    }
    
      '''
    
    # scripts可以实现js注入
    
    
    参数  scrolldown   可以实现页面的滑动效果,不过因为使用的是headless浏览器,所以为了展示效果,需要改变一下 requests_html的源码
    
    流程如下: 找到HTMLSession继承的父类 BassSession,在其内部的__init__里,添加关键字参数  headless=True,  再添加字段,self.headless = headless.  接着在@property所装饰的方法browser下,将headless的值改变为self.headless即可!!!
    
    最后一步,在 session = HTMLSession()  里的括号内条件参数如下:
    
    session = HTMLSession(
        browser_args=[
            '--no-sand',
            '--user-agent=xxx'
        ],
        headless=False
    )
    操作完毕后,就可以实现浏览器弹窗!!!
    
    
    
    参数  sleep   与 scrolldown搭配使用:
    (scrolldown=20,sleep=1)  页面向下滑动20次,每次间隔为1秒
    
    参数  keep_page  
    keep_page=True    数据保存,为浏览器的交互做准备!!
    
    参数: reload
    reload = False 为假,则页面不会从浏览器加载,而是从内存加载
    综上: r.html.render(script
    =scripts,scrolldown=scrolldown,sleep=sleep,keep_page=True)
    补充:用来反扒的手段之一:
    
    在web的检查页面 输入 navigator.webdriver  如果是正常的浏览方式,则显示undefine,通过内核浏览器去请求,会显示True
    
    解决方式:将下面的代码加入scripts里即可!
    
    ()=>{
    Object.defineProperties(navigator,{
            webdriver:{
            get: () => undefined
            }
        })
    与浏览器交互:
    
    from requests_html import HTMLSession
    
    session = HtmLSession()
    
    import asyncio
    
    r = session(url='https://www.sogou.com/')
    
    
    r.html.render(script=script,  keep_page=True)
    
    async def test():
        await r.html.page.screenshot({'path':'2.png','clip':{'x':200,'y':200,'width':400,'height':400}})   # 截图保存
    
        await r.html.page.evaluate('''
        () =>{
         var a = document.querySelector('div#p')
         return (0)
        }      # 实现js注入
    
        await r.html.page.cookies()    # 浏览器渲染后的cookies
        
    
        await r.html.page.type('.SignFlowInput-requiredErrorMask ','12345',{'delay':500})   # 找到选择器,在页面输入12345,每次输入间隔时间为0.5秒
    
        await r.html.page.click("[type='submit']")   #找到选择器,实现点击事件
        
    
        await r.html.page.focus("[placeholder='手机号']")  # 找到选择器,实现聚焦事件
    
    
        await r.html.page.waitForSelector("[placeholder='手机号']")
    # 等待页面选择器对应标签加载完
    
         await r.html.page.hover("[data-stat-id='6f5c93b4d1baf5e9']")  #找到选择器,实现悬浮事件
              
         await r.html.page.waitFor(1000)   # 与hover事件合用效果好
        
        
    上面生成了一个test函数,需要去执行它,固定写法:
    asyncio.get_event_loop().run_until_complete(test())


    键盘事件: r.html.page.keyboard.XXX
    
    .down('Shift')   持续按下
    
    .up('Shift')     抬起来
    
    .press('ArrowLeft')  压下,抬起
    
    .type('喜欢你啊',{‘delay’:100})   键入事件,不需要指定选择器
    
    上述的括号内的事件就是其本身的意义,合理搭配使用,
    
    
    
    eg:
    
    async def test2():
        await r.html.page.keyboard.type('西荒酒吧111',{'delay':1000})
        await r.html.page.keyboard.down('Shift')
        for i in range(4):
            await r.html.page.keyboard.press('ArrowLeft',{'delay':500})
        await r.html.page.keyboard.up('Shift')
        await r.html.page.keyboard.press('Backspace')
    
    asyncio.get_event_loop().run_until_complete(test2()
    鼠标事件    r.html.page.mouse.XXX
    
    
    .click(x,y,{
                    'button''left',
                    'click':1
                    'delay':0
                })
                .down({'button''left'})
                .up({'button''left'})
                .move(x,y,{'steps':1})
    常见的反扒手段:
    
    1.检测浏览器headers
    
    2.ip封禁
    
    3.图片验证码
    
    4.滑动模块
    
    5.js轨迹
    
    6.前端反调试
    作业1:爬取校花网图片
    
    
    
    作业2.爬取豆瓣电影数据
    
    
    
    作业3.爬取校花网视频
  • 相关阅读:
    大数据平台Hadoop集群搭建
    分布式文件系统之FastDFS安装部署
    Nginx反代MogileFS集群
    分布式文件系统之MogileFS的安装使用
    高可用服务之Keepalived利用脚本实现服务的可用性检测
    高可用服务之Keepalived高可用LVS集群
    高可用服务之Keepalived邮件通知配置
    高可用服务之Keepalived基础入门
    高可用集群corosync+pacemaker之pcs安装使用
    高可用集群corosync+pacemaker之crmsh使用(二)
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11318569.html
Copyright © 2011-2022 走看看