赞
踩
项目的需要,需要在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。