爬虫-requests-html

文档

https://cncert.github.io/requests-html-doc-cn/#/

安装

pip install requests-html

简单使用

from requests_html import HTMLSession

session = HTMLSession()
r = session.get(url='https://search.jd.com/Search?keyword=显卡&enc=utf-8&suggest=2.his.0.0&wq=&pvid=2abde6628c7841d78f46d8e412e04b61')
goods = r.html.find('.gl-item')
for i in goods:
    print(i.text)

Element

#首先获取一个element对象
element = r.html.find('.gl-item',first=True)

#获取element里面的文本内容 str
element.text

#获取所有的attributes dict
element.attrs

#获取element的html内容 str
element.html

#获取element里的子element list
element.find('a') 

#search,类似re的.*? Result
print(good.search('<span class="p-{}-{}">广告</span>'))

#xpath
element.xpath('a')

支持js

内部使用的是pyppeteer而不是selenium,更小众,但是被反爬的概率更小

第一次调用会下载一个Chromium

#默认重新发起一次请求
r.html.render()

#使用内存中的
r.html.render(reload=False)

#请求完成会替换原先的r.html.html

关于使用render的基本设置

如果运行render报错

#运行下面的命令
pyppeteer-install

#或者去pyppeteer的chromium_downloader.py里面去打印
print(chromiumExecutable['win64'])

根据下载地址下载,和安装地址安装(安装为上一级目录)

参数设置

session = HTMLSession(
    browser_args=[
        '--no-sand',
        '--user-agent=XXXXX'
    ],
    headless=False
)

如何设置有头

#默认是无头浏览器,如果想要设置成有头需要修改源码进行设置
#加上一个headless=True的默认参数
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=True):
        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
        
#在修改browser的默认参数为传递进来的参数
    @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        
 
#然后就可以正常设置有头和无头

render参数

更多

.render(.....)     

**参数:**

script:
'''
( ) => {

js代码

js代码
}
'''

#需要设置为True,否则后面无法使用r.html.page,这个是与浏览器交互的关键
keep_page(bool)

反爬

#如果是内核的话undefined,如果使用webdriver的话为True
                            绕过网站对webdriver的检测:
                            '''
                            () =>{
                                Object.defineProperties(navigator,{
                                webdriver:{
                                    get: () => undefined
                                    }
                                })
                            }
                            '''

参考链接

https://www.jianshu.com/p/bd828b9cf74d

相关推荐