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

    爬虫最新的库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('模板')
    
  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/gqv2009/p/12531562.html
Copyright © 2011-2022 走看看