zoukankan      html  css  js  c++  java
  • 爬虫最新的库requests-html库总结

    requests-html是比较新的爬虫库,作者和requests是同一个作者

    一.安装依赖

    pip install requests-html

    我们可以在安装的时候看到他安装了lxml,reuqests,bs4......我们常用的解析和爬取的库都分装在他里面

    二. 发起请求

    from requests_html import HTMLSession
    session = HTMLSession()
    
    #用法和requests.session实例化的对象用法一模一样,也会自动保存返回信息
    #相比reuqests,他多了对于response.html这个属性
    

    注意点:发默认发送的的是无头浏览器,且他如果用render调用浏览器内核

    1.解决无头浏览器(针对反爬,如果没有做反爬无所谓)

    修改源码

    • ctrl左键进入HTMLSession

    • 我们可以看到他是继承BaseSession

    • ctrl左键进入BaseSession

      原来的源码

      class BaseSession(requests.Session):
          def __init__(self, mock_browser : bool = True, verify : bool = True,
                       browser_args : list = ['--no-sandbox']):
              super().__init__()
              if mock_browser:
              self.headers['User-Agent'] = user_agent()
      
              self.hooks['response'].append(self.response_hook)
              self.verify = verify
      
              self.__browser_args = browser_args
              self.__headless = headless
      
      		#中间没用的省略掉不是删掉
          @property
          async def browser(self):
              if not hasattr(self, "_browser"):
                  self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify), headless=True, args=self.__browser_args)
      
              return self._browser
      

      修改后的源码

      class BaseSession(requests.Session):
          """ A consumable session, for cookie persistence and connection pooling,
          amongst other things.
          """
      
          def __init__(self, mock_browser : bool = True, verify : bool = True,
                       browser_args : list = ['--no-sandbox'],headless=False):       #如果你设置成True他就是无头,且你再运行render时候不会弹出浏览器
              super().__init__()
      
              # Mock a web browser's user agent.
              if mock_browser:
                  self.headers['User-Agent'] = user_agent()
      
              self.hooks['response'].append(self.response_hook)
              self.verify = verify
      
              self.__browser_args = browser_args
              self.__headless = headless
      			#中间没用的省略掉不是删掉
          @property
          async def browser(self):
              if not hasattr(self, "_browser"):
                  self._browser = await pyppeteer.launch(ignoreHTTPSErrors=not(self.verify), headless=self.__headless, args=self.__browser_args)
      
              return self._browser
      

      其实我就做了个处理方便传一个headless进去

    对于session重新设置

    from requests_html import HTMLSession
    session = HTMLSession(
    browser_args=['--no-sand',
                  '--user-agent='xxxxx'
                 ]
    )
    #这样你就可以直接定义他是什么浏览器发送请求啦
    

    2.解决浏览器内核(针对反爬,如果没有做反爬无所谓)

    #利用模块进行js注入
    from requests_html  import HTMLSession
    
    session  =HTMLSession(.....)
    response = session.get('https://www.baidu.com')
    script='''
    ()=>{
    Object.defineProperties(navigator,{
            webdriver:{
            get: () => undefined
            }
        })}'''
    print(response.html.render(script=script))
    

    三.response.html相关属性

    这里的response对象是

    from requests_html  import HTMLSession
    session  =HTMLSession()
    response = session.get('https://www.baidu.com')
    #为了大家好理解就这个response
    

    所有的路径都会转成绝对路径返回

    返还路径原样

    3.base_url

    .base标签里的路径,如果没有base标签,就是当前url

    4.html

    返回字符串字符串内包含有标签

    5.text

    返回字符串字符串内不包含有标签爬取什么小说新闻之类的超级好用!

    6.encoding

    解码格式,注意这里是response.html的encoding,你如果只只设置了response.encoding对这个encoding毫无影响

    7.raw_html

    相当于r.content返回二进制

    8.pq

    返回PyQuery对象,个人不怎么用这个库所有不写结论

    四.response.html相关方法

    下面response对象我就简写成 r了

    1.find

    用css选择器找对象

    获取全部

    语法:r.html.find('css选择器')

    返回值:[element对象1,。。。。。] 是个列表

    只获取第一个

    语法`:r.html.find('css选择器',first = True)

    返回值:element对象

    2.xpath

    用xpath选择器找对象

    获取全部

    语法:r.html.xpath('xpath选择器')

    返回值:[Element对象1,。。。。。] 是列表

    只获取第一个

    语法`:r.html.xpath('xpath选择器',first = True)

    返回值:Element对象

    3.search(只获取第一个)

    类似用正则匹配,就是把正则里面的(.*?)变成{}

    语法:r.html.search(‘模板’)

    模板一:('xx{}xxx{}')

    获取:获取第一个:r.html.search(‘模板’)[0]其他以此类推

    模板二:(‘xxx{name}yyy{pwd}’)

    获取:获取第一个:r.html.search(‘模板’)['name']其他以此类推

    4.search_all(获取全部)

    用法和search一样

    返回值: 【result对象,result对象,】

    5.render(这个我后续单独写一个总结内容有点多)

    他其实就是封装了pyppeteer你如果不了解pyppeteer,那可以想想Selenium就是模拟浏览器访问

    五.Element对象方法及属性

    • absolute_links:绝对url
    • links:相对url
    • text:只显示文本
    • html:标签也会显示
    • attrs:属性
    • find('css选择器')
    • xpath('xapth路径')
    • .search('模板')
    • .search_all('模板')
  • 相关阅读:
    eclipse config 2 tab -> space
    APUE读书笔记-第13章-守护进程
    【转】Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
    【转】Android学习基础自定义Checkbox组件
    【转】declare-styleable的使用(自定义控件) 以及declare-styleable中format详解
    【转】android 自定义控件 使用declare-styleable进行配置属性(源码角度)
    【转】Android SwitchButton(滑动开关)
    【转】Android 如何在Eclipse中查看Android API源码 及 support包源码
    【转】如何在eclipse里关联查看android源码
    【转】setTag()/getTag()
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11693178.html
Copyright © 2011-2022 走看看