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表示移动的步数