• 爬虫过程及原理
#爬虫原理: #什么是爬虫? #爬虫指的是爬取数据 #什么是互联网? #由一堆网络设备把一台一台的计算机互联到一起 #互联网建立的目的 #数据的传递与数据的共享 #上网的全过程 #普通用户 #打开浏览器->往目标站点发送请求->接收响应过程->渲染到页面上 #爬虫程序 #模拟浏览器-》往目标站点发送请求-》接收响应数据-》提取有用数据-》保存到本地数据库 #浏览器发送的是什么请求? #http协议的请求 #请求url #请求方式: #GET、POST #请求头: #cookies #user—agent #host #爬虫全过程: #1、发送请求 #2、获取数据(服务器返回) #3、解析并提取数据 #4、保存数据 #1、3、4需要手写 #爬取梨视频: #1、分析网站的视频源地址 #2、通过request网站视频源地址发送请求 #3、获取视频的二进制流,并保存到本地。 #爬虫的全过程: #1、发送请求(请求库) #——request模块 #——selenium模块 #2、获取响应数据(服务器返回) #3、解析并提取数据(解析库) #——bs4(BeautifulSoup4) #——Xpath #4、保存数据(存储库) #——MongoDB #1、3、4需要手写 #——爬虫框架 #——Scrapy(基于面向对象) import requests import re #正则模块 # # #对梨视频详情页发送请求,获取响应视频 response =requests.get(url='https://www.pearvideo.com/') print(response.status_code) print(response.text) # #<a href="video_1315018" # #<a href="video"_(.*?) # #re.findall(正则匹配规则,解析文本,正则模式) # #re.S:全局模式(对整个文本进行编辑) # res=re.findall('<a href="video_(.*?)"',response.text,re.S) print(res) # for m_id in res: detail_url='https://www.pearvideo.com/video_'+m_id print(detail_url) import requests import re #正则模块 import uuid #导入线程池模块 #爬虫三部曲 #1、发送请求 def get_page(url): response=requests.get(url) return response #2、解析数据 #解析主页获取的梨视频详情ID def parse_index(text): res=re.findall('<a href="video_(.*?)"',text,re.S) detail_url_list=[] for m_id in res: detail_url='https://www.pearvideo.com/video_'+m_id detail_url_list.append(detail_url) return detail_url_list def parse_detail(text): movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0] return movie_url #3、保存数据 def save_movie(movie_url): response=requests.get(movie_url) with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(response.content) f.flush() if __name__ == '__main__': # main+回车 index_res = get_page(url='https://www.pearvideo.com/') detail_url_list = parse_index(index_res.text) for detail_url in detail_url_list: detail_res = get_page(url=detail_url) movie_url = parse_detail(detail_res.text) print(movie_url) save_movie(movie_url)
• 视频获取
import requests import re #正则模块 import uuid #导入线程池模块 from concurrent.futures import ThreadPoolExecutor #线程池限制50个线程 pool=ThreadPoolExecutor(50) #爬虫三部曲 #1、发送请求 def get_page(url): print(f'开始异步任务:{url}') response=requests.get(url) return response #2、解析数据 ##解析主页获取的梨视频详情ID def parse_index(res): response=res.result() res=re.findall('<a href="video_(.*?)"',response.text,re.S) for m_id in res: detail_url='https://www.pearvideo.com/video_'+m_id pool.submit(get_page,detail_url).add_done_callback(parse_detail) def parse_detail(res): response=res.result() movie_url=re.findall('srcUrl="(.*?)"',response.text,re.S)[0] pool.submit(get_page, movie_url).add_done_callback(save_movie) #3保存数据 def save_movie(res): movie_res=res.result() #把视频写到本地 with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(movie_res.content) print(f'视频下载结束:{movie_res.url}') f.flush() if __name__ == '__main__': url='https://www.pearvideo.com/' pool.submit(get_page,url).add_done_callback(parse_index)
爬取梨视频的结果:
• 今日作业
爬取豆瓣TOP250部电影信息:
https://movie.douban.com/top250
PS: 提取电影详情页url、图片链接、电影名称、
电影评分、评价人数、导演、主演、电影上映时间、简介
代码:
import requests import re headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'} zhengze = '<div class="item">.*?href="(.*?)">.*?src="(.*?)" .*?<span class="title">(.*?)</span>.*?导演: (.*?)<br>(.*?) .*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价.*?<span class="inq">(.*?)</span>' def get_every_page(url): response = requests.get(url, headers=headers) movie_content = re.findall(zhengze, response.text, re.S) for every_movie in movie_content: movie_url, movie_jpg, name, director, time, point, num, abstract = every_movie director1 = director.split('&n')[0] star = director.split('&n')[-1].split('主')[-1].split('演')[-1].split(':')[-1].lstrip() data = '名称:{}, 电影链接:{}, 图片:{}, 导演:{}, 主演:{}, 时间:{}, 得分:{},评论人数:{}, 简介:{}'.format(name, movie_url, movie_jpg, director1, star, time[-4:], point, num, abstract ) with open('douban.txt', 'a', encoding='utf-8') as f: f.write(data + '\n') if __name__ == '__main__': for i in range(0, 226, 25): url = f'https://movie.douban.com/top250?start={i}&filter=' get_every_page(url)
爬取结果:
等。
• 今日总结
加深了对数据爬取的基本原理和过程的理解,在老师的带领下第一次学会了爬取视频,领略到了爬取视频的强大功能。
高级语言的学习是一门需要实践的过程,只有加强动手编程的能力,才有学习去的动力。