最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,这个程序中使用到了正则表达式(re模块),对爬回的网页进行匹配分析,最后通过urllib模块中urlretrieve()这个方法进行视频的下载,由于存在窗口,防止窗口在下载时候处于卡死状态,使用了threading模块,创建了一个线程去执行下载任务。以下是该程序的源码。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 #coding:utf-8 4 # @Date : 2016-12-28 11:18:40 5 # @Author : Donoy ([email protected]) 6 # @Link : http://www.cnblogs.com/Donoy/ 7 # @Version : $Id$ 8 9 #多线程 爬虫 10 #GUI 界面 11 12 import os 13 import requests 14 import re 15 import threading 16 from Tkinter import * 17 from ScrolledText import ScrolledText #文本滚动框 18 import urllib #这个模块中有下载的功能 19 import sys 20 #sys 模块的输出编码 格式 21 reload(sys) 22 sys.setdefaultencoding(‘utf-8‘) 23 Video_Data = [] 24 25 26 def creatWnd(): 27 global root 28 global varl 29 global text 30 31 #创建一个窗口 32 root = Tk() # 窗口 33 34 #窗口的标题 35 root.title(‘DSpider‘) 36 #文本滚动窗口 37 text = ScrolledText(root,font=(‘微软雅黑‘)) 38 text.grid() 39 40 #设置Lable 41 varl = StringVar() 42 lable = Label(root,font=(‘微软雅黑‘),fg=‘red‘,textvariable=varl) 43 lable.grid() 44 varl.set(‘Fight......‘) 45 46 #设置按钮 47 button = Button(root,text=‘开始爬取‘,font=‘黑体‘,command=begin_Thread) 48 button.grid() 49 50 #root.mainloop() # 显示窗口 51 52 def getHtmlData(url): 53 #print html.text # 网站的内容 54 #print html.status_code # 请求的返回值 55 RequestHeader = { 56 ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36‘ 57 } 58 html = requests.get(url,headers=RequestHeader) 59 #print html.text 60 return html.text 61 62 63 def getVideoUrl(html): 64 #re.S 是匹配换行符 65 Parse = re.compile(r‘(<div class="j-r-list-c">.*?</div>.*?</div>)‘,re.S) 66 context = re.findall(Parse,html) 67 Parse = re.compile(r‘data-mp4="(.*?)"‘) 68 for item in context: 69 VideoUrl = re.findall(Parse,item) 70 if VideoUrl: 71 Name_Parse = re.compile(r‘(<a href="/detail-.{8}.html">(.*?)</a>)‘,re.S); 72 VideoName = re.findall(Name_Parse,item) 73 for Name,url in zip(VideoName,VideoUrl): #zip这个内置函数就是将List重新整合一下 74 Video_Data.append([Name,url]) 75 76 77 def begin_Thread(): 78 try: 79 for i in range(10,12): 80 url = ‘http://www.budejie.com/%d‘%i 81 html = getHtmlData(url) 82 getVideoUrl(html) 83 except Exception as e: 84 raise 85 varl.set(‘一共%s个小视频,现在开始下载......‘%(len(Video_Data)/2)) 86 thread = threading.Thread(target= myThread) 87 thread.start() 88 89 90 def myThread(): 91 id = 1 92 for Data in Video_Data: 93 text.insert(END,str(id)+‘.‘+Data[0][1]+Data[1]+‘\n‘) 94 urllib.urlretrieve(Data[1],‘%s.mp4‘%Data[0][1].decode(‘utf-8‘).encode(‘gbk‘)) 95 Video_Data.pop(0) 96 id += 1 97 varl.set(‘所有的视频都下载完成‘) 98 99 100 101 def main(): 102 creatWnd() 103 root.mainloop() 104 105 106 if __name__ == ‘__main__‘: 107 main() 108 109 110
时间: 2024-10-29 19:11:40