Linux下使用 headless 浏览器

项目的需要,需要在Linux下跑headless的浏览器,能执行页面的javascript代码,初始的想法是用selenium,但selenium并发量上可能会有比较大的瓶颈,所以还是考虑API的方式,搜索到 requests_html 满足需求。

了解下了原理,其实requests_html调用的headless浏览器也是通过pyppeteer 启动 chrome,

这个安装起来比selenium简单多了,如果本机没有安装chrome 的话,调用pyppeteer的时候,会自动下载chrome, 参考如下完整代码。

from requests_html import HTMLSession
import logging

logging.basicConfig(filename="jscc.log", level=20,
                            format='%(asctime)s %(name)s %(levelname)s %(module)s:%(lineno)d %(message)s')

logging.info("Start access process")
# 此处设置proxy是浏览器维度的,此处设置了,后面的get, post,render 都会走此proxy
session = HTMLSession(browser_args=['--no-sandbox', '--proxy-server=http://th.proxy.com:30000'])
logging.info("start chrome")


headers = {
            'Connection': 'close',
            'User_Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
        }

for i in range(1,10):
    try:
        logging.info("i:"+str(i))
        # 如果浏览器维度没有设置proxy,也可以这里设置proxy,这里设置的话,只有这个请求走proxy, 
        # 后面的render不会走proxy
        r = session.get('https://www.baidu.com/',timeout=120,headers=headers)
        logging.info("get done")
        #模拟浏览器渲染页面,此处可以解析页面中的javascript代码
        r.html.render()
        logging.info("render done")
    except:
        logging.exception("jxe:")

几个问题:

1、在浏览器维度设置代理服务器的话,pyppeteer不支持账号密码的代理,如果使用带账号密码的代理会出现下面错误。解决办法是使用不带账号密码的代理,如果不得不用的话,哪里就本机搭建个代理服务器,让本机的代理服务器和真实代理服务器做验证。然后设置pyppeteer 走本机代理。

pyppeteer.errors.PageError: net::ERR_NO_SUPPORTED_PROXIES

2. 出现 pyppeteer.errors.BrowserError: Unexpectedly chrome process closed  

   有两种解决方法: a. 修改 requests-html 源代码。增加

browser = pyppeteer.launch(headless=True, args=['--no-sandbox']),如下图

async def _async_render(*, url: str, script: str = None, scrolldown, sleep: int, wait: float, reload, content: Optional[str], timeout: Union[float, int]):
            try:
                browser = pyppeteer.launch(headless=True, args=['--no-sandbox'])
                page = await browser.newPage()

     b. 在浏览器启动的时候,加入参数;

session = HTMLSession(browser_args=['--no-sandbox', '--proxy-server=http://xxx.xxx.com:30000'])

 3. 出现如下错误:while loading shared libraries: libXss.so.1: cannot open shared object file: No s, 安装好下面包就行,

yum install libXScrnSaver*

如果还不行,说明环境变量设置有问题。通过下面命令查找libXss.so.1所在目录,把找到的路径加入到环境变量。假如找到的路径为/lib64/libXss.so.1

find / -name libXss.so.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值