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