(七)通过 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 请求,提取所有图片下载链接
(五)、下载图片

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容