利用Python爬取网页图片
最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:
你可能需要的工作环境:
我们这里以 sogou 作为爬取的对象。
首先我们进入搜狗图片http://pic.sogou.com/,进入壁纸分类(当然只是个例子 Q_Q),因为如果需要爬取某网站资料,那么就要初步的了解它…
进去后就是这个啦,然后 F12 进入开发人员选项,笔者用的是 Chrome。
右键图片 >> 检查
发现我们需要的图片 src 是在 img 标签下的,于是先试着用 Python 的 requests 提取该组件,进而获取 img 的 src 然后使用 urllib.request.urlretrieve 逐个下载图片,从而达到批量获取资料的目的,思路好了,下面应该告诉程序要爬取的 url 为 http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD,此 url 来自进入分类后的地址栏。明白了 url 地址我们来开始愉快的代码时间吧:
在写这段爬虫程序的时候,最好要逐步调试,确保我们的每一步操作正确,这也是程序猿应该有的好习惯。笔者不知道自己算不算个程序猿哈。线面我们来剖析该 url 指向的网页。
import requests
import urllib
from bs4 import BeautifulSoup
res = requests.get('http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD')
soup = BeautifulSoup(res.text,'html.parser')
print(soup.select('img'))
output:
发现输出内容并不包含我们要的图片元素,而是只剖析到 logo 的 img,这显然不是我们想要的。也就是说需要的图片资料不在 url 即 http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD 里面。因此考虑可能该元素是动态的,细心的同学可能会发现,当在网页内,向下滑动鼠标滚轮,图片是动态刷新出来的,也就是说,该网页并不是一次加载出全部资源,而是动态加载资源。这也避免了因为网页过于臃肿,而影响加载速度。下面痛苦的探索开始了,我们是要找到所有图片的真正的 url 笔者也是刚刚接触,找这个不是太有经验。最后找的位置 F12>>Network>>XHR>>(点击 XHR 下的文件)>>Preview。
发现,有点接近我们需要的元素了,点开 all_items 发现下面是 0 1 2 3... 一个一个的貌似是图片元素。试着打开一个 url。发现真的是图片的地址。找到目标之后。点击 XHR 下的 Headers
得到第二行
import requests import json import urllibdef getSogouImag(category,length,path):
n = length
cate = category
imgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))
jd = json.loads(imgs.text)
jd = jd['all_items']
imgs_url = []
for j in jd:
imgs_url.append(j['bthumbUrl'])
m = 0
for img_url in imgs_url:
print('***** '+str(m)+'.jpg *****'+' Downloading...')
urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')
m = m + 1
print('Download complete!')getSogouImag('壁纸',2000,'d:/download/ 壁纸 /')