春江暮客

春江暮客的个人学习分享网站

利用docker实现命令行下使用浏览器渲染js网页

2021-12-08 技术
利用docker实现命令行下使用浏览器渲染js网页

在使用scrapy爬取网页时,由于很多网站采用js渲染的方式,直接诶获取源代码是获取不到需要的网页内容的,此时往往采用selenium驱动浏览器来获取网页内容非常合适。但是有一个问题就是这种情况下需要本地安装浏览器,还非的用非root运行,于是采用docker的方式提供服务chrome服务,并采用selenium驱动获取渲染后的网页内容。

运行chrome的docker容器

通过搜索知道docker hub上容器是selenium/standalone-chrome,在本地已经安装了docker的情况下,直接将该服务运行与14444号端口上,这里安全起见,只允许本地访问。

docker run -itd --name=chrome  -p 127.0.0.1:14444:4444 --shm-size="2g" selenium/standalone-chrome

参数非常简单,只配置了后端运行,端口映射,shm大小

selenium 调用远程服务抓取网页

selenium 的webdrive有Remote参数指定远程地址

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from scrapy.selector import Selector

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # example
driver = webdriver.Remote("http://127.0.0.1:14444/wd/hub", options=options)
driver.get("https://www.bobobk.com")

# 等待页面中的文章标题链接真正渲染出来
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//article/header/h1/a"))
)

hrefs = Selector(text=driver.page_source).xpath("//article/header/h1/a/@href").extract()
for  url in hrefs:
    print(url)
#https://www.bobobk.com/833.html
#https://www.bobobk.com/621.html
#https://www.bobobk.com/852.html
#https://www.bobobk.com/731.html
#https://www.bobobk.com/682.html
#https://www.bobobk.com/671.html
#https://www.bobobk.com/523.html
#https://www.bobobk.com/521.html
#https://www.bobobk.com/823.html
#https://www.bobobk.com/512.html

driver.quit()

示例中采用本网站作为目标,实际验证中使用javascript渲染的网站均可完美抓取

总结

采用docker形式提供浏览器的服务,可以很好地解决网页是由js实时渲染从而导致无法获取需要的网页内容的问题。

标签

1024 12306 ablang adsense agents.md ai ai-agent ai-agents ai-seo algorithm amp antibodies apparmor argparse automation backup bash batch-processing binarycif bioinformatics biopython blockchain boltz bootstrapping boxes bubblewrap c-index cca cdn chatgpt checkpoint cli cloudflare codex cofoldarena copy cpu监控 cron csv cuda curl data-leakage data-processing data-quality data-validation datascience datavisualization datetime debugging deployment desktop-app devtools disk-space disown dns docker dovecot download electron encoding esm esm2 esm3 esmc esmfold2 faceswap fasta fastmcp faulthandler ffmpeg file-descriptors file-io flashppi flask folium frontend game generator git github-actions google google-research grep gzip harness hls html http hugo imports indexnow javascript jev json jsonl just k-means kaggle langfuse leecode linux list litellm llm llms.txt logging logs lollipop lsof m3u8 machine-learning macos manacher matplotlib mcp mirror mmcif model-evaluation monitoring mp3 mp4 mpnn multiomics mutation mysql nanobert nanobodies networkx nginx normalize numpy ollama omegatherm pandas password pathlib pdb pep-723 phaser pillow pip postfix preprocessing print protein-alignment protein-design protein-embeddings protein-interactions protein-language-models protein-stability protein-structure proxy pydantic pyecharts pyqt python python3 r raincloud reproducibility requests reservoir-sampling rfoptimization rg ripgrep rosettafold3 roundcube rrsi rsi rsync s-tui sampling scale scikit-learn scrapy screen seaborn security selenium seo sequence-identity sha256 shell signals sklearn socket solana somaticsignatures spl sqlite ssh standardize static-site subprocess symlink sysadmin system-one tarfile tcp tensorflow tkinter tls toml tron tronpy troubleshooting turtle typesafe-ai ubuntu usdt uv vhhbert vite webp wordcloud wordpress workflow yaml zipfile zoneinfo 后台 寓言 概率 经济 贸易 迅雷解析 钱包

友情链接

其它