requests-html是比较新的爬虫库,作者和requests是同一个作者
pip install requests-html
我们可以在安装的时候看到他安装了lxml,reuqests,bs4…我们常用的解析和爬取的库都分装在他里面
from requests_html import HTMLSession
session = HTMLSession()
#用法和requests.session实例化的对象用法一模一样,也会自动保存返回信息
#相比reuqests,他多了对于response.html这个属性
注意点
:发默认发送的的是无头浏览器
,且他如果用render调用浏览器内核
推荐Python大牛在线分享技术 扣qun:855408893
领域:web开发,爬虫,数据分析,数据挖掘,人工智能
零基础到项目实战,7天学习上手做项目
修改源码
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'
]
)
#这样你就可以直接定义他是什么浏览器发送请求啦
#利用模块进行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对象是
from requests_html import HTMLSession
session =HTMLSession()
response = session.get('https://www.baidu.com')
#为了大家好理解就这个response
所有的路径都会转成绝对路径
返回
返还路径原样
.base标签里的路径,如果没有base标签,就是当前url
返回字符串字符串内包含有标签
返回字符串字符串内不包含有标签爬取什么小说新闻之类的超级好用!
解码格式,注意这里是response.html的encoding,你如果只只设置了response.encoding对这个encoding毫无影响
相当于r.content
返回二进制
返回PyQuery对象,个人不怎么用这个库所有不写结论
下面response对象我就简写成 r了
用css选择器找对象
获取全部
语法
:r.html.find(‘css选择器’)
返回值
:[element对象1,。。。。。] 是个列表
只获取第一个
语法`:r.html.find(‘css选择器’,first = True)
返回值
:element对象
用xpath选择器找对象
获取全部
语法
:r.html.xpath(‘xpath选择器’)
返回值
:[Element对象1,。。。。。] 是列表
只获取第一个
语法`:r.html.xpath(‘xpath选择器’,first = True)
返回值
:Element对象
类似用正则匹配,就是把正则里面的(.*?)
变成{}
语法
:r.html.search(‘模板’)
模板一:(‘xx{}xxx{}’)
获取:获取第一个
:r.html.search(‘模板’)[0]其他以此类推
模板二:(‘xxx{name}yyy{pwd}’)
获取:获取第一个
:r.html.search(‘模板’)[‘name’]其他以此类推
用法和search一样
返回值: 【result对象,result对象,】
他其实就是封装了pyppeteer
你如果不了解pyppeteer
,那可以想想Selenium
就是模拟浏览器访问