动态网页抓取(这世上如果有天堂,天堂应该是图书馆的模样(图))
优采云 发布时间: 2022-03-13 18:00动态网页抓取(这世上如果有天堂,天堂应该是图书馆的模样(图))
如果这个世界上有天堂,天堂应该就像一个图书馆。---【阿根廷】豪尔赫·路易斯·博尔赫斯
好开心,终于可以批量下载茜茜公主的照片了,好漂亮的女人啊!因为刘亦菲在这个页面上的星图画墙是动态页面,直接阅读页面内容是无法获取图片信息的,所以我们需要另辟蹊径。
在解决动态网页时,我们通常可以采取以下两种方法:
1.通过抓包工具分析js和ajax的请求,模拟请求获取js加载的数据(对于小白来说还是有难度的)。
2.调用浏览器内核获取加载网页的源代码,然后解析源代码。
本文主要使用selenium+python+BeautifulSoup的结构来抓图。
a) Selenium 是一种用于模拟浏览器和进行自动化测试的工具。它提供了一组 API 来与真正的浏览器内核交互。使用起来也比较简单。
b)BeautifulSoup是一个解析网页信息的工具,可以从网页中过滤出我们想要的东西。
项目目的:从刘亦菲的图片栏中抓取图片并存储在电脑上
一。使用 selenium 模拟打开浏览器
1driver = webdriver.Firefox()
2driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')
3
1 *二、解析网页信息*
2
我们先按F12查看网页的评论信息,通过图片定位评论元素。可以看到下图:
通过分析几张图片的信息,我们发现每张图片的信息格式都是一样的,所以我们可以通过BeautifulSoup找到
元素节点,然后通过访问其子节点两次,获得到图像的链接,即“src”信息。
三、使用PIL模块存储图片
上面是通用模块,下面是程序代码:
1#-*-coding:utf-8 -*-
2from selenium import webdriver
3from selenium.webdriver.common.keys import Keys
4from selenium.webdriver.support.ui import WebDriverWait
5from bs4 import BeautifulSoup
6from PIL import Image
7import urllib2
8import StringIO
9import time
10
11
12driver = webdriver.Firefox()
13driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')
14soup = BeautifulSoup(driver.page_source)
15all = soup.find_all("div", class_="img-container")
16time.sleep(2)
17count =0
18number=0
19for each in all:
20 number+=1
21 picUrl = each.contents[0].contents[0]['src']
22 print picUrl
23 try:
24 imgString=urllib2.urlopen(picUrl).read()
25 im=Image.open(StringIO.StringIO(imgString))
26 except:
27 continue
28 count += 1
29 print count
30 imgPath='/home/fiona/fei/photo/'+ str(count)+'.jpg'
31 im.save(imgPath)
32
33print number
34driver.quit()
35
1 提取出来的图片如下:
2
项目问题:
一页有60多张照片,但只拍了30张。我不知道原因。有知道的可以给我留言,谢谢!
参与信息:
(好文章)