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

一、爬取今日头条新闻

为什么要这么爬请看 获取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 动态内容)