Tuesday, December 2, 2008

出差时写的一个抓取baidu图片的东东






使用了多线程但没有处理同步。 
正则表达式是用kodos弄出来的,这个工具使用起来比较顺手。 
Java代码 复制代码
  1. #!/usr/bin/env python  
  2. #coding=cp936  
  3.   
  4. import re  
  5. import urllib  
  6. import thread  
  7. import time  
  8.   
  9. #url_part1 = '''http://images.google.cn/images?q='''  
  10. #url_part2 = '''&svnum=10&hl=zh-CN&lr=&newwindow=1&start='''  
  11. #url_part3 = '''&sa=N'''  
  12. url_part1 = '''http://image.baidu.com/i?z=0&cl=2&ct=201326592&sn=&lm=-1&cm=1&sc=0&bu=&rn=16&tn=baiduimage&word='''  
  13. url_part2 = '''&pn='''  
  14.   
  15.   
  16. def nextpage(keywords,start):  
  17.     return url_part1 + urllib.quote(keywords) + url_part2 + str(start)  
  18.   
  19. #compile_obj = re.compile(r'dyn.Img\("http://(.)+","","","')  
  20. compile_obj = re.compile(r'<a href="http://image.baidu.com/ir\?t=1&u=http://(.)+&f=http://')  
  21.   
  22. def parseurl(content):  
  23.     ret = []  
  24.     match_objs = compile_obj.finditer(content)  
  25.     for match in match_objs:  
  26.         url = match.group().split('&')[1][2:]  
  27.         ret.append(url)  
  28.     return ret  
  29.   
  30. #exitdic = {}  
  31.   
  32. def downimg(url,exitdic):  
  33.     filename = url.split('/')[-1]  
  34.     #print url,'---->',filename  
  35.     urllib.urlretrieve(url,filename)  
  36.     exitdic[url].acquire()  
  37.   
  38. def download(url):  
  39.     exitdic = {}  
  40.     print '开始下载页面: ' + url  
  41.     conn = urllib.urlopen(url)  
  42.     content = conn.read()  
  43.     conn.close()  
  44.     urls = parseurl(content)  
  45.     for url in urls:  
  46.         print url  
  47.         exitdic[url] = thread.allocate_lock()  
  48.         thread.start_new(downimg,(url,exitdic))  
  49.       
  50.     for key in exitdic.keys():  
  51.         while not exitdic[key].locked():  
  52.             #time.sleep(200)  
  53.             pass  
  54.     print '完成一页'  
  55.   
  56. #抓取关键字为vista的图片,抓取范围为查询结果的第48页  
  57. if __name__ == '__main__':  
  58.     for i in range(4,8):  
  59.         url = nextpage('vista',i*16)  
  60.         download(url)  
  61.       
  62.     print 'OK'  


#!/usr/bin/env python
#coding=cp936

import re
import urllib
import thread
import time

#url_part1 = '''http://images.google.cn/images?q='''
#url_part2 = '''&svnum=10&hl=zh-CN&lr=&newwindow=1&start='''
#url_part3 = '''&sa=N'''
url_part1 = '''http://image.baidu.com/i?z=0&cl=2&ct=201326592&sn=&lm=-1&cm=1&sc=0&bu=&rn=16&tn=baiduimage&word='''
url_part2 = '''&pn='''


def nextpage(keywords,start):
    return url_part1 + urllib.quote(keywords) + url_part2 + str(start)

#compile_obj = re.compile(r'dyn.Img\("http://(.)+","","","')
compile_obj = re.compile(r'<a href="http://image.baidu.com/ir\?t=1&u=http://(.)+&f=http://')

def parseurl(content):
    ret = []
    match_objs = compile_obj.finditer(content)
    for match in match_objs:
        url = match.group().split('&')[1][2:]
        ret.append(url)
    return ret

#exitdic = {}

def downimg(url,exitdic):
    filename = url.split('/')[-1]
    #print url,'---->',filename
    urllib.urlretrieve(url,filename)
    exitdic[url].acquire()

def download(url):
    exitdic = {}
    print '开始下载页面: ' + url
    conn = urllib.urlopen(url)
    content = conn.read()
    conn.close()
    urls = parseurl(content)
    for url in urls:
        print url
        exitdic[url] = thread.allocate_lock()
        thread.start_new(downimg,(url,exitdic))
    
    for key in exitdic.keys():
        while not exitdic[key].locked():
            #time.sleep(200)
            pass
    print '完成一页'

#抓取关键字为vista的图片,抓取范围为查询结果的第4到8页
if __name__ == '__main__':
    for i in range(4,8):
        url = nextpage('vista',i*16)
        download(url)
    
    print 'OK'


No comments: