上课内容笔记
亓 2019/6/14 8:22:07
昨日回顾:
爬虫原理:
什么是爬虫?
爬虫指的是爬取数据。
什么是互联网?
由一堆网络设备把一台一台的计算机互联到-起。
互联网建立的目的?
数据的传递与数据的共享。
上网的全过程:
一普通用户
打开浏览器一>往目标站点发送请求一> 接收响应数据一>渲染到页面 上。
一爬虫程序
模拟浏览器一>往目标站点发送请求一>接收响应数据一> 提取有用的数据一> 保存到本地/教据库 。
昨日回顾:
爬虫原理:
什么是爬虫?
爬虫指的是爬取数据。
什么是互联网?
由一堆网络设备把一台一台的计算机互联到-起。
互联网建立的目的?
数据的传递与数据的共享。
上网的全过程:
一普通用户
打开浏览器一>往目标站点发送请求一> 接收响应数据一>渲染到页面 上。
一爬虫程序
模拟浏览器一>往目标站点发送请求一>接收响应数据一> 提取有用的数据一> 保存到本地/教据库 。
浏览器发送的是什么请求?
http协议的请求:
-请求url
http协议的请求:
-请求url
一请求方式:
GET、POST
一请求头:
cookies
user- agent
GET、POST
一请求头:
cookies
user- agent
host ;
爬虫的全过程:
1、发送请求(请求库)
爬虫的全过程:
1、发送请求(请求库)
_requests模块
_selenium模块
2、获取响应数据<服务器返回>
3、解析并提取数据(解析库)
_bs4 (BeautifulSoup4)
_Xpath
4、保存数据(数据库)
_MongoDB
1、3、4需要手动写
爬虫框架
Scrapy(基于面向对象)
爬取梨视频:|
1、分析网站的视频源地址
2、通过requests网视频源地址发送请求
1、分析网站的视频源地址
2、通过requests网视频源地址发送请求
3、获取视频的二进制流,并保存到本地。
1 import requests 2 import re # 正则模块 3 4 # 对梨视频详情页发生请求,获取响应值 5 response = requests.get(url='https://www.pearvideo.com/') 6 print(response.status_code) 7 print(response.text) 8 9 # re.findall('正则匹配规则','解析文本','正则模式') 10 # re.S:全局模式 (对整个文本进行匹配) 11 # .指的是当前的位置 12 # *指的是查找所有 13 ''' 14 <a href="video_1543373"> 15 <a href="video_(.*?)"> #提取所有 16 ''' 17 # 获取主页视频详情页ID 18 res = re.findall('<a href="video_(.*?)>"', response.text, re.S) 19 print(res) 20 for m_id in res: 21 # 拼接详情页url 22 detail_url = 'https://www.pearvideo.com/video_'+m_id 23 print(detail_url) 24 import requests 25 import re #正则模块 26 # uuid.uuid4() 可以根据时间戳生成一段世界上唯一的随机字符串 27 import uuid 28 29 # 爬虫三部曲 30 31 # 1.发送请求 32 def get_page(url): 33 response = requests.get(url) 34 return response 35 36 # 2.解析数据 37 # 解析主页获取视频详情页ID 38 def parse_index(text): 39 res = re.findall('<a href="video_(.*?)"', text, re.S) 40 print(res) 41 detail_url_list = [] 42 for m_id in res: 43 # 拼接详情页url 44 detail_url = 'https://www.pearvideo.com/video_'+m_id 45 detail_url_list.append(detail_url) 46 return detail_url_list 47 48 # 解析详情页获取视频url 49 def parse_detail(text): 50 movie_url = re.findall('srcUrl="(.*?)"', text, re.S)[0] 51 print(movie_url) 52 return movie_url 53 54 # 保存数据 55 def save_movie(movie_url): 56 response = requests.get(movie_url) 57 # 把视频写到本地 58 with open(f'{uuid.uuid4()}.mp4', 'wb')as f: 59 f.write(response.content) 60 f.flush() 61 if __name__ == '__main__': 62 63 # 1.对主页发送请求 64 index_res = get_page(url='https://www.pearvideo.com/') 65 # 2.对主页进行解析。获取详情页id 66 detail_url_list = parse_index(index_res.text) 67 print(detail_url_list) 68 # 3.对每个详情页Url发送请求 69 for detail_url in detail_url_list: 70 print(detail_url) 71 detail_res = get_page(url=detail_url) 72 print(detail_res) 73 # 4.解析详情页获取视频url 74 movie_url = parse_detail(detail_res.text) 75 print(movie_url) 76 # 5.保存视频 77 save_movie(movie_url)
异步爬取
1 import requests 2 import re 3 import uuid 4 from concurrent.futures import ThreadPoolExecutor 5 pool = ThreadPoolExecutor(50) 6 7 def get_page(url): 8 print(f'开始异步任务:{url}') 9 response = requests.get(url) 10 return response 11 def parse_index(res): 12 response = res.result() 13 14 res = re.findall('<a href="video_(.*?)"', response.text, re.S) 15 16 for m_id in res: 17 detail_url = 'https://www.pearvideo.com/video_'+m_id 18 pool.submit(get_page,detail_url).add_done_callback(parse_detail) 19 20 def parse_detail(res): 21 response = res.result() 22 movie_url = re.findall('srcUrl="(.*?)"', response.text, re.S)[0] 23 pool.submit(get_page, movie_url).add_done_callback(save_movie) 24 def save_movie(res): 25 movie_res = res.result() 26 27 with open(f'{uuid.uuid4()}.mp4', 'wb')as f: 28 f.write(movie_res.content) 29 f.flush() 30 if __name__ == '__main__': 31 url = 'https://www.pearvideo.com/' 32 pool.submit(get_page, url).add_done_callback(parse_index)
1 # 访问知乎 2 import requests 3 headers = { 4 'user-agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' 5 } 6 response = requests.get(url='https://www.zhihu.com/explore',headers=headers) 7 print(response.status_code) 8 with open('zhihu.html','w',encoding='utf-8')as f: 9 f.write(response.text)
爬取豆瓣电影
1 '''''' 2 ''' 3 主页: 4 https://movie.douban.com/top250 5 GET 6 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36 7 8 re正则: 9 # 电影详情页url、图片链接、电影名称、电影评分、评价人数 10 <div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价 11 ''' 12 import requests 13 import re 14 url = 'https://movie.douban.com/top250' 15 headers = { 16 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36' 17 } 18 # 1、往豆瓣TOP250发送请求获取响应数据 19 response = requests.get(url, headers=headers) 20 21 # print(response.text) 22 23 # 2、通过正则解析提取数据 24 # 电影详情页url、图片链接、电影名称、电影评分、评价人数 25 movie_content_list = re.findall( 26 # 正则规则 27 '<div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价', 28 29 # 解析文本 30 response.text, 31 32 # 匹配模式 33 re.S) 34 35 for movie_content in movie_content_list: 36 # 解压赋值每一部电影 37 detail_url, movie_jpg, name, point, num = movie_content 38 data = f'电影名称:{name}, 详情页url:{detail_url}, 图片url:{movie_jpg}, 评分: {point}, 评价人数: {num} \n' 39 print(data) 40 41 # 3、保存数据,把电影信息写入文件中 42 with open('douban.txt', 'a', encoding='utf-8') as f: 43 f.write(data)