V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

[爬虫]请教各位高手,除了 Seleium 的方法,还有什么现成轮子方法可以获得渲染后的网页代码?

  •  
  •   qazwsxkevin · 2019-07-25 00:35:06 +08:00 · 5418 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在学习和使用的过程中,我是使用 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
    
    29 条回复    2019-08-24 21:38:39 +08:00
    sivacohan
        1
    sivacohan  
       2019-07-25 00:48:36 +08:00 via iPhone
    加上这个试试。
    options.add_argument('--no-proxy-server')
    yh7gdiaYW
        2
    yh7gdiaYW  
       2019-07-25 01:05:20 +08:00
    Puppeteer
    Rorshach
        3
    Rorshach  
       2019-07-25 01:31:37 +08:00
    可以用 splash,这个是异步的,比 selenium 快吧,还可以试试 Phantom JS 这种无界面浏览器
    不过如果每个页面要 1~2 分钟才能得到代码,应该不是框架的问题吧……
    shuangyeying
        4
    shuangyeying  
       2019-07-25 07:27:40 +08:00 via Android
    你去看看要爬的网页有没有引用墙外的资源,如果有的话,可能这就是加载慢的原因了。另外可以装上广告屏蔽插件再试试。
    Leigg
        5
    Leigg  
       2019-07-25 07:51:29 +08:00 via Android
    可以改浏览器参数,只是你不会。
    get 方法默认是阻塞到浏览器加载完才向下执行,如果加载失败这个窗口也用不了。但是有可能浏览器已经加载出想要的内容,还是没停下,这时候想要操作浏览器就必须改个参数。晚点发上来
    nullboy
        6
    nullboy  
       2019-07-25 08:05:13 +08:00
    Puppeteer。但是真心不会写 node,现在是大部分工作是 python+selenium 实现的,部分限制 selenium 的功能用 puppeteer
    lzxz1234
        7
    lzxz1234  
       2019-07-25 08:46:31 +08:00
    如果是 python 可以考虑下 pyspider
    lozzow
        8
    lozzow  
       2019-07-25 08:50:26 +08:00 via iPhone
    @nullboy 我记得我个日本老哥写了一个 py 版本的
    Jaho
        9
    Jaho  
       2019-07-25 08:51:29 +08:00
    python 有 pyppeteer 啊 为啥你们都说都推荐去写 node 至于速度问题 不至于要 1-2 分钟吧
    附: http://bb.jaho.fun/Pyppeteer.html
    防踩坑
    sep1025
        10
    sep1025  
       2019-07-25 08:56:06 +08:00
    requests-html,集成 pyppeteer
    foxyier
        11
    foxyier  
       2019-07-25 09:18:18 +08:00
    selenium,设置不加载图片之类的东西,应该很快的
    momocraft
        12
    momocraft  
       2019-07-25 09:22:33 +08:00
    selenium 是不是停好久了
    puppeteer 挺香的
    ClericPy
        13
    ClericPy  
       2019-07-25 09:34:47 +08:00
    有 selenium 写爬虫从始至终都是很傻的行为吧, phantomjs 作者放弃开发了, selenium 还活着

    楼主直接用 chrome 远程调试那个 cdp 协议吧, chrome devtools protocol
    简单的用 http/socket 请求就可以操作 chrome, 用 js 实现不断翻页, 用 cdp 里的 Network 截取流量判断是否最后一页

    你不给个例子, 也不好给你看看示例代码
    kidlfy
        14
    kidlfy  
       2019-07-25 09:38:22 +08:00
    还是 puppeteer 吧 是 chrome 团队维护的靠谱点
    tohearts
        15
    tohearts  
       2019-07-25 09:48:31 +08:00
    我使用的是 splash, 异步配异步
    fank99
        16
    fank99  
       2019-07-25 10:05:30 +08:00
    splash
    momocraft
        17
    momocraft  
       2019-07-25 10:35:34 +08:00
    如果你实在不想写 node,找人写个 puppeteer 打开网页返回 html 的服务也没几行

    不过里面出错你无法 debug
    shawndev
        18
    shawndev  
       2019-07-25 10:37:05 +08:00
    puppeteer
    Vegetable
        19
    Vegetable  
       2019-07-25 11:00:35 +08:00
    你先浏览器正常加载一下看看多久能加载完好吗
    Leigg
        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)
    拿去吧。
    Threeinchtime
        21
    Threeinchtime  
       2019-07-25 15:42:48 +08:00
    个人用 splash,感觉不好用,看了楼上现在马上去试试 pyppeteer
    pmispig
        22
    pmispig  
       2019-07-25 17:55:30 +08:00
    @momocraft pyppeteer 无法在 headless 下载文件,请问怎么解决。。
    wersonliu9527
        23
    wersonliu9527  
       2019-07-25 20:16:17 +08:00
    不是很多加载都是 xhr 请求来的么 0.0
    greatbody
        24
    greatbody  
       2019-07-25 22:25:52 +08:00
    https://github.com/getgauge/taiko
    这个是 ThoughtWorks 出的一款 nodejs 的测试工具,本质上是无头浏览器。
    供参考。
    alienlu19870911
        25
    alienlu19870911  
       2019-07-25 23:11:57 +08:00
    请教一下大家,pyppeteer 怎么在多线程下调用,想用这个替代 selenium,但在多线程下调用总是会报错,错误是需要运行在主线程。
    shuang
        26
    shuang  
       2019-07-26 08:57:56 +08:00
    Puppeteer+1
    有个需求要对网页的某个区域生成缩略图就是用 Puppeteer 实现的,时间大概在 700ms 至 3000ms 之间
    不知道是不是服务器性能差异的问题,感觉 windows 比 linux 速度要快一些
    KuroNekoFan
        27
    KuroNekoFan  
       2019-07-26 11:23:58 +08:00
    headless browser 都行吧,甚至 jsdom 都行
    wongyusing
        28
    wongyusing  
       2019-07-26 13:57:00 +08:00
    为什么不分析网页的构造形式呢??
    鼠标下拉也只是在请求不同也页面。
    一般下拉也就是两种情况,
    请求 json 数据,通过在 css 或 js 的模板进行渲染。
    请求一小段 html 格式,通过元素选择器添加到网页中。

    Seleium 这样的轮子讲真,真的很慢。
    不过用来实现登陆生成 cookie 池还是比较好的
    bantianys
        29
    bantianys  
       2019-08-24 21:38:39 +08:00
    之前也遇到这样的问题。无头模式时快时慢,好像是和 wait 的里面的一个参数有关系,似乎是轮询元素是否存在的频率?既不大清楚了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:55 · PVG 00:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.