博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python urllib2递归抓取某个网站下图片
阅读量:4054 次
发布时间:2019-05-25

本文共 2304 字,大约阅读时间需要 7 分钟。

需求:

抓取某个网站下图片

可定义 图片保存路径,最小图片大小域值,遍历深度,是否遍历到外站,抓取并下载图片

使用库:

urllib     【下载】

urllib2  【抓取】

urlparse  【url切分用到】

sgmllib  【html解析用到】

代码:

[python] 
  1. #!/usr/bin/python  
  2. # -*- coding:utf-8 -*-  
  3. # author: wklken  
  4. # 2012-03-17 wklken@yeah.net  
  5. #1实现url解析 #2实现图片下载 #3优化重构  
  6. #4多线程 尚未加入  
  7.   
  8. import os,sys,urllib,urllib2,urlparse  
  9. from sgmllib import SGMLParser   
  10.   
  11. img = []  
  12. class URLLister(SGMLParser):  
  13.   def reset(self):  
  14.     SGMLParser.reset(self)  
  15.     self.urls=[]  
  16.     self.imgs=[]  
  17.   def start_a(self, attrs):  
  18.     href = [ v for k,v in attrs if k=="href" and v.startswith("http")]  
  19.     if href:  
  20.       self.urls.extend(href)  
  21.   def start_img(self, attrs):  
  22.     src = [ v for k,v in attrs if k=="src" and v.startswith("http") ]  
  23.     if src:  
  24.       self.imgs.extend(src)  
  25.   
  26.   
  27. def get_url_of_page(url, if_img = False):  
  28.   urls = []  
  29.   try:  
  30.     f = urllib2.urlopen(url, timeout=1).read()  
  31.     url_listen = URLLister()  
  32.     url_listen.feed(f)  
  33.     if if_img:  
  34.       urls.extend(url_listen.imgs)  
  35.     else:  
  36.       urls.extend(url_listen.urls)  
  37.   except urllib2.URLError, e:  
  38.     print e.reason  
  39.   return urls  
  40.   
  41. #递归处理页面  
  42. def get_page_html(begin_url, depth, ignore_outer, main_site_domain):  
  43.   #若是设置排除外站 过滤之  
  44.   if ignore_outer:  
  45.     if not main_site_domain in begin_url:  
  46.       return  
  47.   
  48.   if depth == 1:  
  49.     urls = get_url_of_page(begin_url, True)  
  50.     img.extend(urls)  
  51.   else:  
  52.     urls = get_url_of_page(begin_url)  
  53.     if urls:  
  54.       for url in urls:  
  55.         get_page_html(url, depth-1)  
  56.   
  57. #下载图片  
  58. def download_img(save_path, min_size):  
  59.   print "download begin..."  
  60.   for im in img:  
  61.     filename = im.split("/")[-1]  
  62.     dist = os.path.join(save_path, filename)  
  63.     #此方式判断图片的大小太浪费了  
  64.     #if len(urllib2.urlopen(im).read()) < min_size:  
  65.     #  continue  
  66.     #这种方式先拉头部,应该好多了,不用再下载一次  
  67.     connection = urllib2.build_opener().open(urllib2.Request(im))  
  68.     if int(connection.headers.dict['content-length']) < min_size:  
  69.       continue  
  70.     urllib.urlretrieve(im, dist,None)  
  71.     print "Done: ", filename  
  72.   print "download end..."  
  73.   
  74. if __name__ == "__main__":  
  75.   #抓取图片首个页面  
  76.   url = "http://www.baidu.com/"  
  77.   #图片保存路径  
  78.   save_path = os.path.abspath("./downlaod")  
  79.   if not os.path.exists(save_path):  
  80.     os.mkdir(save_path)  
  81.   #限制图片最小必须大于此域值  单位 B  
  82.   min_size = 92  
  83.   #遍历深度  
  84.   max_depth = 1  
  85.   #是否只遍历目标站内,即存在外站是否忽略  
  86.   ignore_outer = True  
  87.   main_site_domain = urlparse.urlsplit(url).netloc  
  88.   
  89.   get_page_html(url, max_depth, ignore_outer, main_site_domain)  
  90.   
  91.   download_img(save_path, min_size)  

后续可以优化

1.使用多线程优化下载,目前多层遍历不够速度

2.使用BeautifulSoup写一个版本

3.加入图形界面......

2012-03-17

wklken

转载请注明出处:

其他相关文章链接:

http://blog.csdn.net/wklken/article/list/1

你可能感兴趣的文章
指针&数组&字符串&结构体
查看>>
Linux 内核api man 手册安装
查看>>
Linux 内核宏 container_of
查看>>
Ubuntu 安装bcompare
查看>>
电阻屏较准
查看>>
imx6 内核停止启动
查看>>
RTL8188EUS Anaroid M Porting
查看>>
omap 的framebuffer驱动程序
查看>>
android2.3 dvsdk
查看>>
QT Creater的安装配置
查看>>
QT5学习总结
查看>>
ubuntu 安装使用dbus
查看>>
QT QDbus
查看>>
android init launch
查看>>
nand booting
查看>>
android boot animation
查看>>
Python环境搭建
查看>>
Python3 基础
查看>>
Python3 基础(itcast学习笔记)
查看>>
ubuntu_fastboot
查看>>