爬虫2

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

 

posted on 2019-08-08 16:12  michael-chang  阅读(146)  评论(0)    收藏  举报

导航