在学习和使用的过程中,我是使用 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 2019-07-25 00:48:36 +08:00 via iPhone
加上这个试试。
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 的里面的一个参数有关系,似乎是轮询元素是否存在的频率?既不大清楚了。
|