爬蟲最新的庫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
1.absolute_links
所有的路徑都會轉成絕對路徑返回
2.links
返還路徑原樣
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('模板')