爬虫-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
}
})
}
'''