美文网首页我爱编程
(七)通过 selenium 模拟浏览器爬取 JS 动态内容

(七)通过 selenium 模拟浏览器爬取 JS 动态内容

作者: 交易狗二哈 | 来源:发表于2017-03-24 20:43 被阅读505次

    一、爬取今日头条新闻

    为什么要这么爬请看 获取JS动态内容
    既然 selenium 能模仿浏览器的行为,那么我们直接用这个库来爬取网页,肯定也是很简单的事情。缺点就是既然是模拟浏览器行为,那速度是比直接用 json 请求慢得多
    那我们可以写出爬取代码了。这里用 css selecter 定位

    >>> from selenium import webdriver
    >>> driver = webdriver.PhantomJS()
    >>> driver.get('http://www.toutiao.com/')
    >>> for i in driver.find_elements_by_css_selector('#carouselList > ul > li> a > img'):
        print(i.get_attribute("src"))
    
        
    http://p1.pstatp.com/origin/18a1001128770b4c8365
    http://p3.pstatp.com/origin/178100075f23a040ecb5
    http://p1.pstatp.com/origin/18a300112cfd26c2c6df
    http://p9.pstatp.com/origin/18a5001110bbcae17326
    http://p3.pstatp.com/origin/1781000760173eb00269
    http://p3.pstatp.com/origin/17810007602775eb7d1d
    >>> for i in driver.find_elements_by_css_selector('#carouselList > ul > li> a'):
        print(i.get_attribute("href"))
    
        
    http://www.toutiao.com/group/6399973251997040897/
    http://www.toutiao.com/group/6399911996251357442/
    http://www.toutiao.com/group/6400082968694440194/
    http://www.toutiao.com/group/6399868819300778242/
    http://www.toutiao.com/group/6400084033762705666/
    http://www.toutiao.com/group/6399915188623343874/
    
    >>> for i in driver.find_elements_by_css_selector('#carouselList > ul > li > a > p'):
        print(i.text)
    
        
    
    
    
    他是上帝送给球迷的足球精灵 37岁生日快乐
    
    
    >>> len(driver.find_elements_by_css_selector('#carouselList > ul > li > a > p'))
    6
    >>> 
    

    出现了个问题,图片和新闻的 url 链接我们成功爬取到了,但标题 title 6个却只显示了一个。尝试了几种定位方法,结果还是一样。
    把 page_source 传进 BeautifulSoup,倒是可以。
    有空再接着研究是哪出问题了

    二、爬取今日头条美女图片

    接着向上篇一样,来爬取今日头条图片

    >>> from selenium import webdriver
    >>> driver = webdriver.PhantomJS()
    >>> driver.get('http://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3')
    >>> a = driver.find_elements_by_class_name('J_title')
    >>> len(a)
    20
    >>> for i in a:
        print(i.text)
    
        
    气质美女,优雅长裙,贵妇风范
    青涩少女甜美乖萌牛仔背带裙
    高雅清丽,超气质女神
    摄影:有一种可远观而不可亵玩焉
    温婉优雅女子窈窕无双居家美照
    气质卷发允儿淡雅迷人
    三位可爱的 气质非凡 颜值较高 楚楚风韵 你喜欢哪一个
    时尚美女爱摄影,不开美颜相机算我服
    醉爱你妹——那无比清纯白嫩可口的妹妹
    白裙飘飘伊人若仙子
    人像摄影:原来穿旗袍还是短发更耐看
    别人的单眼皮
    17黑色系 永远是人们心中的大爱
    「人像摄影」短裙黑丝 混血气质小魔女
    摄影:可爱小清新与熟女的对决,你选谁胜出?
    摄影:忧郁惹人怜惜的
    棚拍旗袍
    T疯子摄影:90后清纯可爱的
    席地而坐,随性的姑娘有气质
    美艳至极靓妹
    >>> b =driver.find_elements_by_class_name('img-wrap')
    >>> for i in b:
        print(i.get_attribute('href'))
    
        
    http://www.toutiao.com/group/6399967413135884545/
    http://www.toutiao.com/group/6399875937064272129/
    http://www.toutiao.com/group/6399511749808095746/
    http://www.toutiao.com/group/6399741308898132225/
    http://www.toutiao.com/group/6400243707849244930/
    http://www.toutiao.com/group/6400238927080390914/
    http://www.toutiao.com/group/6399718234816741633/
    http://www.toutiao.com/group/6399832980781629697/
    http://www.toutiao.com/group/6399866594214904066/
    http://www.toutiao.com/group/6399716443810496769/
    http://www.toutiao.com/group/6400085128462516482/
    http://www.toutiao.com/group/6400180716161253633/
    http://www.toutiao.com/group/6399949700431003905/
    http://www.toutiao.com/group/6399936693873737986/
    http://www.toutiao.com/group/6399757089493025025/
    http://www.toutiao.com/group/6399803425404436738/
    http://www.toutiao.com/group/6399716046782431489/
    http://www.toutiao.com/group/6399712965301715202/
    http://www.toutiao.com/group/6399724047525150977/
    http://www.toutiao.com/group/6399723310598799618/
    

    图片内容的链接很轻松就获取到了,接下去我们只要进去每个网页,获取里面的图片下载链接就行了。如果再用 selenium 进去每个网页去下载图片,这效率显然是很慢的,干脆用 requests 吧。这项小工作在这就不再重复了,前面我们爬静态网页已经做过很多了。
    我们现在来研究下另一个重要的问题,就是如何获取更多的图片网页链接。
    在这个网站中,可以看到只有把浏览器拉到底部,才能显示更多的图片。如何做到呢

    # 拉到顶部
    >>> driver.execute_script("window.scrollBy(0,document.body.scrollTop=0)","")
    # 拉到底部
    >>> driver.execute_script("window.scrollBy(0,document.body.scrollHeight)","")
    >>> driver.execute_script("window.scrollBy(0,document.body.scrollHeight=10000)","")
    >>> driver.execute_script("window.scrollBy(0,document.body.scrollTop)","")
    >>> import time
    >>> time.sleep(3)
    >>> b = driver.find_elements_by_class_name('J_title')
    >>> len(b)
    120
    

    以上是通过 execute——script 执行 js 脚本操作。
    也可以通过 ActionChains 模拟鼠标操作。
    那么每次下拉都可以获得 20 个图片网址。
    所以总的思路如下

    (一)、用 selenium 模拟浏览器登陆网页
    (二)、模拟浏览器中下拉页面到底部,不断加载更多图片网址
    (三)、在 selenium 定位元素,找出标题及图片网址
    (四)、对每个图片网址用 requests 请求,提取所有图片下载链接
    (五)、下载图片

    并不是很难,就懒得写代码啦

    相关文章

      网友评论

        本文标题:(七)通过 selenium 模拟浏览器爬取 JS 动态内容

        本文链接:https://www.haomeiwen.com/subject/sufqottx.html