• requests-html库


    常用的解析语法

    解析库:pyquery、re、bs4、lxml

    在这里介绍的是 requests-html 库

    CSS选择器

    • 类选择器:.类名
    • id选择器:#id值
    • 标签选择器:标签名
    • 后代选择器:选择器1 选择器2
    • 子选择器:选择器1>选择器2
    • 属性选择器:
      • [属性名]
      • [属性名=属性值]
      • [属性名^=属性值]:开头
      • [属性名$=属性值]:结尾
      • [属性名*=属性值]:包含
    • 群组选择器:选择器1,选择器2 相当于or
    • 多条件选择器:选择器1选择器2 相当于and

    requests-html库

    安装:pip install requests-html

    使用:

    请求:参数和requests模块一模一样

    from requests-html import HTMLSession
    session = HTMLSession()  # 会自动保存cookie
    
    响应对象 = session.request(......)
    
    响应对象 = session.get(......)
    
    响应对象 = session.post(......)
    

    响应:属性和requests模块一模一样,关键多了个html属性

    r.url
    r.html
    

    1. html对象属性

    r.html.absolute_links  # 所有的路径都会转成绝对路径返回
    
    r.html.links  # 返回原样路径,如果是相对路径就是相对路径,如果是绝对路径返回就是绝对路径
    
    r.html.base_url  #  如果html有base标签,返回base标签路径;没有返回请求url
    
    r.html.html  # 相当于r.text,返回的是页面文本信息
    
    r.html.encoding = 'gbk'  # 控制解码格式
    
    r.html.text  # 获得页面所有文本,标签内的值。js代码也会被拉出来
    
    r.html.raw_html  # 相当于r.content
    
    r.pq  # <class 'pyquery.pyquery.PyQuery'>对象,想用PyQuery时用
    

    2. html对象方法

    r.html.find('CSS选择器')  # 查找,返回的是 [element对象1,element对象2,...]
    r.html.find('CSS选择器',first=True)  # 只找第一个,返回的是 element对象
    
    r.html.xpath('xpath选择器')
    r.html.xpath('‘xpath选择器',first = True)
    
    r.html.search('模板')  # 只找第一个,返回的是 result对象
    	r.html.search('<dt><a href="{}">{}</a></dt>')  --> <Result ('/', '首页') {}>
    	r.html.search('<dt><a href="{}">{}</a></dt>')[1]  --> 首页
        r.html.search('<dt><a href="{src}">{name}</a></dt>')['src']  --> /
        
    r.html.search_all('模板')  # 返回的是 [result对象1,result对象2...]
    	r.html.search_all('<dt><a>{}</a></dt>')  --> [<Result ('分类',) {}>, <Result ('秒懂百科',) {}>, <Result ('特色百科',) {}>, <Result ('用户',) {}>, <Result ('权威合作',) {}>]
        # 可以通过for循环遍历获取
        for i in r.html.search_all('<dt><a>{name}</a></dt>'):
            print(i['name'])
            
    r.html.render()  # 调用浏览器内核,对页面进行渲染得到新的结果替换  r.html.html = 渲染后html文本
    

    3. Element对象及属性

    ele = r.html.find('CSS选择器',first=True)  # 返回的Element对象
    
    ele.absolute_links  # 绝对路径
    ele.links  # 相对路径
    ele.text  # 文本信息
    ele.html  # 带标签的文本信息
    ele.attrs  # 属性
    ele.find('CSS选择器')  # 继续往下找,返回的Element对象
    ele.search('模板')  # 返回result对象
    ele.search_all('模板')  # 返回[result对象1,result对象2,...]
    

    4. r.html.render()参数

    script = """
        ()=>{
        	return document.charset
    	}	
    """
    
    scrolldown:n  # 往下翻几页
    
    sleep:n  # 渲染完后睡几秒,如果与scolldown一起使用时,表示隔几秒翻一页
    
    keep_page:True/False  # 允许通过r.html.page与浏览器交互,阻止关闭浏览器
        
    **参数:改浏览器参数**
    session =  HTMLSession(
    	brower_args = [
            '--no-sand',  # 以最高权限运行浏览器
            '--user-agent=XXXX'  # 设置浏览器请求头的语法
        ],headless = False  # 修改无头浏览器,这里需要修改源码
    )
    """修改源码:
    1.点HTMLSession进去,在BaseSession的__init__方法中加个参数 headless = True
    2.在__init__函数中加上self.__headless = headless
    3.在 async def browser方法中self._browser = (...)中的 "headless=True" 改成 "headless=self.__headless"
    """
    
    # 示例:
    script = """
    ()=>{
    var a = document.querySelector('#query')
    var b = a.getBoundingClientRect()
    return {'x':b.x,'y':b.y}
    }
    """
    print(r.html.render(script=script,))
    
    # 绕过网站对webdriver的检测
    from requests_html import HTMLSession
    
    session = HTMLSession(
        browser_args=[
            '--no-sand',
            '--user-agent=XXXX'
        ], headless=False
    )
    
    url = 'https://baike.baidu.com/item/海康威视/6048387?fr=aladdin'
    
    r = session.request(method='get', url=url)
    # 绕过网站对webdriver的检测,如果不设置navigator.webdriver为true,而浏览器为undefined
    script ="""
    ()=>{
        Object.defineProperties(navigator,{
            webdriver:{
                get:()=>undefined
            }
        })
    }
    """
    url = 'http://jd.com'
    r = session.get(url=url)
    r.html.render(script=script,sleep=10)
    

    5. 与浏览器交互 r.html.page.XXX

    from requests_html import HTMLSession
    
    session = HTMLSession(
        browser_args=[
            '--no-sand',
            '--user-agent=XXX'
        ], headless=False
    )
    url = 'http://www.baidu.com'
    r = session.get(url=url)
    script = """
        ()=>{
        Object.defineProperties(navigator,{
            webdriver:{
                get:()=>undefined
            }
        })
        }
    """
    r.html.render(keep_page=True, sleep=5)
    
    # 定义异步函数执行
    async def run():
        my_dic = await r.html.page.evaluate('''
        () =>{
            var a = document.querySelector('#kw')
            var b = a.getBoundingClientRect()
            return {'x':b.x,'y':b.y,'width':b.width,'height':b.height}
            }''')  # 执行js代码
        print(my_dic)
        
        await r.html.page.screenshot({
            'path': '1.png',
            # 'clip': {'x': 100, 'y': 100, 'width': 100, 'height': 100}
            'clip':my_dic
        })  # 截图,await表示等待结束;path表示保存路径;clip截图位置和大小,四个参数缺一不可
    	
        await r.html.page.cookies()  # 获取cookie
        
        await r.html.page.type('#kw','程序员',{'delay':1000})  # 填写内容,第一个参数是选择器,第二个是内容,delay表示输入字符的时间间隔
        
       	await r.html.page.click('[class="soutu-btn"]',{'button':'left','clickCount':1,'delay':0})  # 点击事件,left表示左键;clickCount表示点击的次数,delay表示点击时间间隔
    
        await r.html.page.waitFor(1000)  # 睡几秒.以毫秒为单位
        
        await r.html.page.hover("li[class='category-item']")  # 悬浮,括号内写CSS选择器
    
        await r.html.page.focus('#login_field')  # 聚焦,参数是CSS选择我器
        
        await r.html.page.waitForSelector('css选择器')  # 等待选择器加载完成
    
    try:
        session.loop.run_until_complete(run())  # 执行异步函数
    finally:
        session.close()
    
    

    6. 键盘事件 r.html.page.keyboard.XXX

    r.html.page.keyboard.down('Shift')  # 按下键
    r.html.page.keyboard.up('Shift')  # 抬起键
    r.html.page.keyboard.press('ArrowLeft')  # 按下抬起
    r.html.page.keyboard.type('喜欢你啊',{'delay':100})  # 输入内容,delay为每个字符的时间间隔
    

    7. 鼠标事件 r.html.page.mouse.XXX

    r.html.page.mouse.click(x,y,{
        'button':'left',
        'click':1
        'delay':0
    })  # 鼠标点击
    r.html.page.mouse.down({'button':'left'})  # 鼠标按下
    r.html.page.mouse.up({'button':'left'})  # 鼠标抬起
    r.html.page.mouse.move(x,y,{'steps':1})  # 鼠标移动,从当前位置移动x,y。steps表示移动的步数
    
  • 相关阅读:
    idea 控制到不能输出中文
    后台学习
    carthage和cocoapods
    如何优雅地调试
    从一次内存峰值说起
    多线程单线程,同步异步,并发并行,串行队列并行队列,看这里就对了
    iOS网络层设计感想
    iOS团队风格的统一
    AFNetworking二次封装的那些事
    UITextFiled,UITextView长度限制
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11696121.html
Copyright © 2020-2023  润新知