Python爬虫-进程池方式爬取头条视频
来源:互联网 发布:索爱w580c软件 编辑:程序博客网 时间:2024/06/05 11:02
首先进入今日头条视频首页。
分析网页
其中href属性下的连接就是我们需要下载的视频。
在下载全部视频之前应该分析一下单视频下载的方法。
下载一个视频
首先查看单个视频的网页页面
我们需要获取var mp4下的视频。但是这个语句应该是JS的?可以使用正则匹配到连接。
def get_video_url(url): try: res = requests.get(url) if res.status_code != 200: print('视频详情页请求失败') return None print('视频详情页请求成功 : ' + video_title) res.encoding = 'utf-8' link = re.findall(r'var mp4 = "(.*.mp4?)";', res.text)[0] link = 'http:' + link return link except Exception: print('视频详情页请求失败') return None
这个函数的返回值就是需要下载的视频连接。
file_path = '{0}/{1}.{2}'.format('D:/1', video_title, 'mp4') with open(file_path, 'wb') as f: #必须是wb f.write(data) f.close()
这样就可以下载单个视频了。
下载首页全部视频
具体正则方式,详见网页html格式。
#单进程使用def get_urls(): try: res = requests.get('http://video.eastday.com/') if res.status_code != 200: print('视频主页请求失败') return None print('获取视频主页') res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser') links = soup.find_all('a', pdata=re.compile("index.*")) #所有带视频的标签 都带index这些 例如pdata="index|jlp|12|0" for link in links: if not re.findall('.*/a/.*', link['href']): #页面因为最上面的 是类型分类 不带/a/ 视频全部带 continue # if re.compile(link['href']) if not re.findall('http://video.eastday.com/', link['href']): #有一部分视频没有http://video.eastday.com/ 只有后面一部分 link['href'] = 'http://video.eastday.com/' + link['href'] #对于每一个主页的url都有一个具体页面 get_video_url(link['href'], link['title']) except Exception: print('视频主页请求失败') return None
这样下载的方式比较慢,按顺序下载。
为了提高效率,可以考虑进程池方式。
进程池方式下载视频
假如直接加上进程池,相当于每个进程都同时开始下载同一个。。我们应该根据pool.map传入不同参数让不同的进程下载不同的部分。
我们观察可以知道视频主页分为:主题部分、娱乐、记录片等等。
比如这个轻松一刻的代码部分:
我们可以定义一个字典类型,根据参数让不同进程完成不同部分下载。
还有一个比较重要的是。我们对于不同板块需要重新获取该板块的所有url。
具体代码如下:
#进程池使用def get_urls_(item_index): try: res = requests.get('http://video.eastday.com/') if res.status_code != 200: print('视频主页请求失败') return None print('获取视频主页') res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser') item_dict = { '1' : 'w100 clr pt25', #6个板块 '2' : 'main funny mt10', '3' : 'main mt10 consult', '4' : 'main mt10 entertainment', '5' : 'main mt10 Blog', '6' : 'main mt10 record', } #这里就相当于不同进程(1-6号进程) 执行不同板块的url下载工作 html_all = soup.find_all('div', class_=re.compile(item_dict[str(item_index)])) soup_items = BeautifulSoup(str(html_all[0]), 'html.parser') # 加上str!!! 还有它是列表!!! soup_items = soup_items.find_all('a', pdata=re.compile("index.*")) for item in soup_items: if not re.findall('.*/a/.*', item['href']): continue if not re.findall('http://video.eastday.com/', item['href']): item['href'] = 'http://video.eastday.com/' + item['href'] get_video_url(item['href'], item['title']) except Exception: print('视频主页请求失败') return Noneif __name__=='__main__': groups = [x for x in range(0, 6)] pool = Pool() pool.map(get_urls_, groups) #需要执行的 加上条件
调试代码
可以看到是同时执行,而不是顺序执行。提高效率。
阅读全文
1 0
- Python爬虫-进程池方式爬取头条视频
- python爬虫:爬取慕课网视频
- python 爬虫视频网站
- python爬虫-多进程
- python 爬虫视频网站(二)
- Python 爬虫 爬取视频
- Python 使用进程池下载视频
- python 多进程爬虫案例
- 【python 视频爬虫】python下载头条视频
- python爬虫下载极客学院视频
- Python爬虫-爬取腾讯小视频
- python爬虫脚本下载YouTube视频
- Python学习之多进程并发爬虫
- python爬虫学习多进程下载图片
- Python爬虫学习笔记--多进程用法
- python爬虫——多进程multiprocessing
- python scrapy多进程新闻爬虫
- Python多进程协程爬虫----1
- 线程同步
- RecyclerView
- java HTTP请求URL 获取其跳转后地址及参数
- ionic XMLHttpRequest cannot load http://localhost:8080/...
- 对一段有趣代码分析
- Python爬虫-进程池方式爬取头条视频
- 重写
- VS2010 调试窗口一闪而过解决方法
- react-native使用PanResponder实现pinch手势
- 经验
- 在Tomcat中发布web项目
- mui 图片预览(2)
- 双链表
- mysql使用的 I/O 调度方法