selenium抓取动态网页

        这世上如果有天堂,天堂应该是图书馆的模样。   ---[阿根廷]豪尔赫·路易斯·博尔赫斯

      好开心呀,终于可以把茜茜公主图片批量下载下来了,真是美丽的女子!因为此网页刘亦菲的星图粉刷墙为动态网页,直接读取网页内容是得到不图片信息的,所以我们需要另辟蹊径。


在解决动态网页中,我们通常可以采取以下两种途径:

1.通过抓包工具分析js,ajax的请求,模拟该请求获取js加载后的数据(对于小白来讲,还比较困难委屈)。

2.调用浏览器的内核,获取加载后的网页源码,然后对源码经行解析。


本文主要使用selenium+python+BeautifulSoup的结构来进行图片的抓取。

     a)selenium 是一个模拟浏览器,进行自动化测试的工具,它提供一组API可以与真实的浏览器内核交互。它的使用方法也比较简单。

    b)BeautifulSoup是一个用来解析网页信息的工具,可以从网页中过滤出我们想要的东西。


项目目的:从刘亦菲的图吧里面,抓取图片出来,并存储在电脑上

一。使用selenium,模拟打开浏览器

driver = webdriver.Firefox()
driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')

二、解析网页信息

我们先看按F12看看网页的审查信息,通过图片来进行审查元素的定位,可以看到下图:


通过分析几幅图片的信息,我们发现,每幅图片的信息格式都是一样的,所以我们可以通过BeautifulSoup找到<div class='img-container'>元素结点,然后通过访问两次它的儿子结点,获取到图片的链接,即‘src'信息。


三、使用PIL模块进行图片的存储


以上是大致模块,下面是程序代码:

#-*-coding:utf-8  -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from PIL import Image
import urllib2
import StringIO
import time


driver = webdriver.Firefox()
driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')
soup = BeautifulSoup(driver.page_source)
all = soup.find_all("div", class_="img-container")
time.sleep(2)
count =0
number=0
for each in all:
    number+=1
    picUrl = each.contents[0].contents[0]['src']
    print picUrl
    try:
        imgString=urllib2.urlopen(picUrl).read()
        im=Image.open(StringIO.StringIO(imgString))
    except:
        continue
    count += 1
    print count
    imgPath='/home/fiona/fei/photo/'+ str(count)+'.jpg'
    im.save(imgPath)

print number
driver.quit()

提取出来的图片如下:


项目问题

一个页面目测有60多张照片,但是只抓取30张下来了,不知道什么原因,有知道的可以给我留言,多谢!


参加资料:

http://selenium-python.readthedocs.org/index.html

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

http://www.cnblogs.com/chenqingyang/p/3780273.html(good article)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值