js抓取网页内容(运行chrome的docker容器有什么作用?参数指定远程地址)
优采云 发布时间: 2021-12-09 11:05js抓取网页内容(运行chrome的docker容器有什么作用?参数指定远程地址)
使用scrapy抓取网页时,由于很多网站使用js渲染,无法直接通过获取源码获取需要的网页内容。这时候经常使用selenium驱动的浏览器来获取网页。内容很贴切。但是有一个问题,这种情况下需要在本地安装浏览器,而且不是非root运行,所以chrome服务通过docker方式提供,使用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 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")
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
示例中以这个网站为目标,实际验证中javascript渲染的网站可以完美捕获
总结
使用docker提供浏览器服务,可以很好的解决网页被js实时渲染,导致无法获取需要的网页内容的问题。