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.爬取校花网视频