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表示移动的步数
posted @ 2019-10-18 01:31  Never&say&die  阅读(378)  评论(0编辑  收藏  举报