爬虫最新的库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('模板')
posted @ 2020-03-20 14:31  莫贞俊晗  阅读(1016)  评论(0编辑  收藏  举报