
在学习和使用的过程中,我是使用 Seleium+chromedriver 去 driver.page_source 获得渲染后的 html 代码,不知道为什么,用 chromedriver 去 get 网页,webdriver 通常一个页面需要 1~2 分钟才能结束进程得到 html 代码,一两个页面没什么问题,现在批量,就很花时间(这个现象好像也不少人跟我一样的情况,我换电脑,换 chromedriver 版本,甚至换个城市换个运营商都是这样,笑~)
回到问题本身,我其实就是需要找其它什么轮子,可以去获取一个渲染后的页面 html ?(渲染就是鼠标把网页从顶部滚到底部,js 执行完了,网页就渲染好了,不需要其它什么操作)
#使用 Chrome 获取网页代码成 Str def GetChromeLinkSourcetoStr(link): optiOns= webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('blink-settings=imagesEnabled=false') driver = webdriver.Chrome(optiOns=options) wait = WebDriverWait(driver, 10) driver.maximize_window() driver.get(link) tmpStr = driver.page_source return tmpStr 1 sivacohan PRO 加上这个试试。 options.add_argument('--no-proxy-server') |
3 Rorshach Jul 25, 2019 可以用 splash,这个是异步的,比 selenium 快吧,还可以试试 Phantom JS 这种无界面浏览器 不过如果每个页面要 1~2 分钟才能得到代码,应该不是框架的问题吧…… |
4 shuangyeying Jul 25, 2019 via Android 你去看看要爬的网页有没有引用墙外的资源,如果有的话,可能这就是加载慢的原因了。另外可以装上广告屏蔽插件再试试。 |
5 Leigg Jul 25, 2019 via Android 可以改浏览器参数,只是你不会。 get 方法默认是阻塞到浏览器加载完才向下执行,如果加载失败这个窗口也用不了。但是有可能浏览器已经加载出想要的内容,还是没停下,这时候想要操作浏览器就必须改个参数。晚点发上来 |
6 nullboy Jul 25, 2019 Puppeteer。但是真心不会写 node,现在是大部分工作是 python+selenium 实现的,部分限制 selenium 的功能用 puppeteer |
7 lzxz1234 Jul 25, 2019 如果是 python 可以考虑下 pyspider |
9 Jaho Jul 25, 2019 |
10 sep1025 Jul 25, 2019 requests-html,集成 pyppeteer |
11 foxyier Jul 25, 2019 selenium,设置不加载图片之类的东西,应该很快的 |
12 momocraft Jul 25, 2019 selenium 是不是停好久了 puppeteer 挺香的 |
13 ClericPy Jul 25, 2019 有 selenium 写爬虫从始至终都是很傻的行为吧, phantomjs 作者放弃开发了, selenium 还活着 楼主直接用 chrome 远程调试那个 cdp 协议吧, chrome devtools protocol 简单的用 http/socket 请求就可以操作 chrome, 用 js 实现不断翻页, 用 cdp 里的 Network 截取流量判断是否最后一页 你不给个例子, 也不好给你看看示例代码 |
14 kidlfy Jul 25, 2019 还是 puppeteer 吧 是 chrome 团队维护的靠谱点 |
15 tohearts Jul 25, 2019 我使用的是 splash, 异步配异步 |
16 fank99 Jul 25, 2019 splash |
17 momocraft Jul 25, 2019 如果你实在不想写 node,找人写个 puppeteer 打开网页返回 html 的服务也没几行 不过里面出错你无法 debug |
18 shawndev Jul 25, 2019 puppeteer |
19 Vegetable Jul 25, 2019 你先浏览器正常加载一下看看多久能加载完好吗 |
20 Leigg Jul 25, 2019 via Android @Leigg from selenium.webdriver.common.desired_capabilities import DesiredCapabilities desired_capabilities = DesiredCapabilities.CHROME # 修改页面加载策略 # none 表示将 br.get 方法改为非阻塞模式,在页面加载过程中也可以给 br 发送指令,如获取 url,pagesource 等资源。 desired_capabilities["pageLoadStrategy"] = "none" driver = webdriver.Chrome(chrome_optiOns=chrome_options, executable_path=chrome_driver_path, desired_capabilities=desired_capabilities) 拿去吧。 |
21 Threeinchtime Jul 25, 2019 个人用 splash,感觉不好用,看了楼上现在马上去试试 pyppeteer |
23 wersonliu9527 Jul 25, 2019 不是很多加载都是 xhr 请求来的么 0.0 |
24 greatbody Jul 25, 2019 |
25 alienlu19870911 Jul 25, 2019 请教一下大家,pyppeteer 怎么在多线程下调用,想用这个替代 selenium,但在多线程下调用总是会报错,错误是需要运行在主线程。 |
26 shuang Jul 26, 2019 Puppeteer+1 有个需求要对网页的某个区域生成缩略图就是用 Puppeteer 实现的,时间大概在 700ms 至 3000ms 之间 不知道是不是服务器性能差异的问题,感觉 windows 比 linux 速度要快一些 |
27 KuroNekoFan Jul 26, 2019 headless browser 都行吧,甚至 jsdom 都行 |
28 wongyusing Jul 26, 2019 为什么不分析网页的构造形式呢?? 鼠标下拉也只是在请求不同也页面。 一般下拉也就是两种情况, 请求 json 数据,通过在 css 或 js 的模板进行渲染。 请求一小段 html 格式,通过元素选择器添加到网页中。 Seleium 这样的轮子讲真,真的很慢。 不过用来实现登陆生成 cookie 池还是比较好的 |
29 bantianys Aug 24, 2019 之前也遇到这样的问题。无头模式时快时慢,好像是和 wait 的里面的一个参数有关系,似乎是轮询元素是否存在的频率?既不大清楚了。 |