Requests-html解析库的使用

Requests-html解析库的使用

常见的解析库:re正则,bs4,pyppeteer(驱动浏览器内核),lxml
    
安装:pip install requests-html    
    
from requests_html import HTMLSession,HTML

#可视化设置
"""
session = HTMLSession(
    browser_args=[
    '--no-sand',
    '--user-agent=XXXXX',
    ],headless=False
)
"""


session = HTMLSession() 
response = session.request() 与requests响应基本一样

#解析response.html的属性:

response.html.absolute_links	(返回页面中所有路径为绝对路径)

			 .links			  (页面中的所有路径)

			 .base_url		   (页面中base标签的路径)

			 .html			   (解析页面布局内容)

			 .text			   (获得页面标签中的所有文本)

			 .encoding = 'gbk'	(r.html的编码方式)

			  .raw_html			(二进制页面内容)

			  .pq				(pyQuery)

            
#解析response.html的属性方法:
r.html.find('css选择器')	:返回[element对象1,...]
    
      .find('css选择器',first=True)
	  
      .xpath('xpath选择器',first=True)
        
 
#response.html的search方法
result=r.html.search(''<a href="{src}">{name}</a>'')
返回页面由上至下的第一个Result对象,通过reslut['name']方式取出值

result=r.html.search_all(''<a href="{src}">{name}</a>'')
返回页面上[Result对象1,....]


#response.html的render方法
response.html.render()
	参数:
        js注入:
            script = """
            		var a = document.querySelector("#query")
            		var b = a.getBoundingClientRect()
            		return {"x":b.x}
            		"""
        scrolldown = 10	向下滑动
	    sleep = 10 
        keep_page = False(默认为False)
        当设置为True时,阻止关闭浏览器,通过r.html.page与浏览器进行交互        	            
        如何绕过网站对webdriver的检测:(可反爬)
            script='''() =>{
                            Object.defineProperties(navigator,{
                            webdriver:{
                                    get: () => undefined
                                    }
                                })
                            }'''

        
#Element对象的方法
element=r.html.find('css选择器',first=True)

element.absolute_links
	   .links
	   .text
	   .html
	   .attrs(返回属性的集合)
	   .find('css选择器')
	   .search('模板')
	   .search_all('模板')


#r.html.page与浏览器进行交互  
首先,r.html.render(keep_page = True)
async def run():
    #交互语句
     mydic = 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 }
     }''')
	 screenshot截图,path:截图文件保存地址,clip:四个参数
     #await r.html.page.screenshot({'path':'1.png','clip':mydic})
     
     type('css选择器','内容',{'delay':100}),模拟输入框内容  
    #await r.html.page.type('#kw','东京热',{'delay':400})
        
    hover 模拟鼠标悬浮   
   	#await r.html.page.hover('li[class="category-item"]')
    
    focus模拟鼠标光标聚焦
    # await r.html.page.focus('#login_field')
    # await r.html.page.keyboard.type('935938484@qq.com')
    # await r.html.page.focus('#password')
    # await r.html.page.keyboard.type('a-new-world')
    
    模拟键盘事件
    # await r.html.page.click('[name="commit"]',{'button':'left'})
    #await r.html.page.keyboard.type('喜欢你啊aaaaa')
    #await r.html.page.keyboard.down('Shift')
    #for i in range(5):
    #    await r.html.page.waitFor(100)
    #    await r.html.page.keyboard.press('ArrowLeft')
    #await r.html.page.keyboard.up('Shift')
    #await r.html.page.keyboard.press('Backspace')
    #await r.html.page.waitFor(5000)
    
    模拟点击事件
    .click(x,y,{
                'button':'left',
                'click':1
                'delay':0
			})
			.down({'button':'left'})
			.up({'button':'left'})
			.move(x,y,{'steps':1})


try:
    session.loop.run_until_complete(run())
finally:
    session.close() 
posted @ 2019-10-17 21:17  wanjiang  阅读(1124)  评论(0编辑  收藏  举报