在学习和使用的过程中,我是使用 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') |
![]() | 2 yh7gdiaYW 2019-07-25 01:05:20 +08:00 Puppeteer |
3 Rorshach 2019-07-25 01:31:37 +08:00 可以用 splash,这个是异步的,比 selenium 快吧,还可以试试 Phantom JS 这种无界面浏览器 不过如果每个页面要 1~2 分钟才能得到代码,应该不是框架的问题吧…… |
4 shuangyeying 2019-07-25 07:27:40 +08:00 via Android 你去看看要爬的网页有没有引用墙外的资源,如果有的话,可能这就是加载慢的原因了。另外可以装上广告屏蔽插件再试试。 |
![]() | 5 Leigg 2019-07-25 07:51:29 +08:00 via Android 可以改浏览器参数,只是你不会。 get 方法默认是阻塞到浏览器加载完才向下执行,如果加载失败这个窗口也用不了。但是有可能浏览器已经加载出想要的内容,还是没停下,这时候想要操作浏览器就必须改个参数。晚点发上来 |
6 nullboy 2019-07-25 08:05:13 +08:00 Puppeteer。但是真心不会写 node,现在是大部分工作是 python+selenium 实现的,部分限制 selenium 的功能用 puppeteer |
7 lzxz1234 2019-07-25 08:46:31 +08:00 如果是 python 可以考虑下 pyspider |
![]() | 9 Jaho 2019-07-25 08:51:29 +08:00 |
![]() | 10 sep1025 2019-07-25 08:56:06 +08:00 requests-html,集成 pyppeteer |
11 foxyier 2019-07-25 09:18:18 +08:00 selenium,设置不加载图片之类的东西,应该很快的 |
![]() | 12 momocraft 2019-07-25 09:22:33 +08:00 selenium 是不是停好久了 puppeteer 挺香的 |
![]() | 13 ClericPy 2019-07-25 09:34:47 +08:00 有 selenium 写爬虫从始至终都是很傻的行为吧, phantomjs 作者放弃开发了, selenium 还活着 楼主直接用 chrome 远程调试那个 cdp 协议吧, chrome devtools protocol 简单的用 http/socket 请求就可以操作 chrome, 用 js 实现不断翻页, 用 cdp 里的 Network 截取流量判断是否最后一页 你不给个例子, 也不好给你看看示例代码 |
![]() | 14 kidlfy 2019-07-25 09:38:22 +08:00 还是 puppeteer 吧 是 chrome 团队维护的靠谱点 |
![]() | 15 tohearts 2019-07-25 09:48:31 +08:00 我使用的是 splash, 异步配异步 |
16 fank99 2019-07-25 10:05:30 +08:00 splash |
![]() | 17 momocraft 2019-07-25 10:35:34 +08:00 如果你实在不想写 node,找人写个 puppeteer 打开网页返回 html 的服务也没几行 不过里面出错你无法 debug |
![]() | 18 shawndev 2019-07-25 10:37:05 +08:00 puppeteer |
![]() | 19 Vegetable 2019-07-25 11:00:35 +08:00 你先浏览器正常加载一下看看多久能加载完好吗 |
![]() | 20 Leigg 2019-07-25 14:54:35 +08:00 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 2019-07-25 15:42:48 +08:00 个人用 splash,感觉不好用,看了楼上现在马上去试试 pyppeteer |
![]() | 23 wersonliu9527 2019-07-25 20:16:17 +08:00 不是很多加载都是 xhr 请求来的么 0.0 |
![]() | 24 greatbody 2019-07-25 22:25:52 +08:00 |
25 alienlu19870911 2019-07-25 23:11:57 +08:00 请教一下大家,pyppeteer 怎么在多线程下调用,想用这个替代 selenium,但在多线程下调用总是会报错,错误是需要运行在主线程。 |
![]() | 26 shuang 2019-07-26 08:57:56 +08:00 Puppeteer+1 有个需求要对网页的某个区域生成缩略图就是用 Puppeteer 实现的,时间大概在 700ms 至 3000ms 之间 不知道是不是服务器性能差异的问题,感觉 windows 比 linux 速度要快一些 |
![]() | 27 KuroNekoFan 2019-07-26 11:23:58 +08:00 headless browser 都行吧,甚至 jsdom 都行 |
28 wongyusing 2019-07-26 13:57:00 +08:00 为什么不分析网页的构造形式呢?? 鼠标下拉也只是在请求不同也页面。 一般下拉也就是两种情况, 请求 json 数据,通过在 css 或 js 的模板进行渲染。 请求一小段 html 格式,通过元素选择器添加到网页中。 Seleium 这样的轮子讲真,真的很慢。 不过用来实现登陆生成 cookie 池还是比较好的 |
29 bantianys 2019-08-24 21:38:39 +08:00 之前也遇到这样的问题。无头模式时快时慢,好像是和 wait 的里面的一个参数有关系,似乎是轮询元素是否存在的频率?既不大清楚了。 |