python入门day4

爬虫过程及原理

#爬虫原理:
#什么是爬虫?
#爬虫指的是爬取数据
#什么是互联网?
#由一堆网络设备把一台一台的计算机互联到一起
#互联网建立的目的
#数据的传递与数据的共享
#上网的全过程
#普通用户
#打开浏览器->往目标站点发送请求->接收响应过程->渲染到页面上
#爬虫程序
#模拟浏览器-》往目标站点发送请求-》接收响应数据-》提取有用数据-》保存到本地数据库
#浏览器发送的是什么请求?
#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)
View Code

 视频获取

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)
View Code

   爬取梨视频的结果

 

今日作业

    爬取豆瓣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>(.*?)&nbsp;.*?<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)
View Code

  爬取结果:

等。

今日总结

       加深了对数据爬取的基本原理和过程的理解,在老师的带领下第一次学会了爬取视频,领略到了爬取视频的强大功能。

高级语言的学习是一门需要实践的过程,只有加强动手编程的能力,才有学习去的动力。

猜你喜欢

转载自www.cnblogs.com/yt2223/p/11031015.html