python学习第四天

爬虫原理:
什么是爬虫?
爬虫指的是爬数据
什么是互联网?
由一堆网络设备把一台一台的计算机互联到一起
互联网建立的目的:数据的传递与数据的共享
上网的全过程:
-普通用户:
打开浏览器-->往目标站点发送请求-->接受响应数据-->渲染到页面上
-爬虫程序
模拟浏览器-->往目标站点发送请求-->接受响应数据-->提取有用数据-->保存到本地数据库
浏览器发送的什么请求?
http协议请求:
-请求url:
-请求方式:
get,POST

-请求头:
cookies
user-agent
host




爬虫全过程:
1、发送请求
-request请求
-selenium模块
2、获取响应数据
3、解析并提取数据
-RE
-bs4(BeautufulSoup4)
4、保存数据
-MongoDB
1、3、4需要手动写

-爬虫框架
Scrapy(基于面向对象)

爬取梨视频:
1、分析网站的视频源地址
2、通过request网视频源地址发送请求
3、获取视频的二进制流,并保存到本地

1、爬取整个梨视频里面的视频链接
'''
访问url
    https://www.pearvideo.com/
请求方式:
    Get
请求头:
    user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

'''
import requests
import re
response =requests.get(url="https://www.pearvideo.com/")
print(response.status_code)
#print(response.text)

#re.findall('正则匹配规则','解析文本',"正则模式")
#re.S:全局模式(对整个文本进行匹配)
#.指的是当前位置
#*指的是查找所有

'''
<a href="video_1543373"
<a href="video_(.*?)"  #提取1543373
'''

#获取主页视频详情ID
res=re.findall('<a href="video_(.*?)"',response.text,re.S)
print(res)

for m_id in res:
    detail_url='http://www.pearvideo.com/video_'+m_id
    print(detail_url)

2、爬取整个详情页视频内容:

import requests
import re #正则模块
#uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串
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)
    #print(res)

    detail_url_list=[]  #存放所有视频链接
    for m_id in res:
        #拼接详情页url
        detail_url = 'http://www.pearvideo.com/video_' + m_id
        #print(detail_url)
        detail_url_list.append(detail_url)  #把每个视频链接添加进去

    #print(detail_url_list)
    return detail_url_list

#解析详情页获取视频url
def parse_detail(text):
    '''
    (.*?):提取括号内容
    .*?:直接匹配
    <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style=" 100%; height: 100%;"></video>
    正则:<video.*?src="(.*?)"

正则:srcUrl="(.*?)"
    '''

    movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0]
    #print(movie_url)
    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加回车键
    #1、对主页发送请求
    index_res=get_page(url='http://www.pearvideo.com/')
#2、对主页进行解析,获取详情页id
    detail_url_list=parse_index(index_res.text)
    #print(detail_url_list)
        #3、对每个详情页发送url请求
    for detail_url in detail_url_list:
         detail_res=get_page(url=detail_url)
         #print(detail_res.text)
         movie_url=parse_detail(detail_res.text)
         print(movie_url)

         save_movie(movie_url)

3、采用多线程方法对详情页视频爬取:

import requests
import re #正则模块
#uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串
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)
    #print(res)

    detail_url_list=[]  #存放所有视频链接
    for m_id in res:
        #拼接详情页url
        detail_url = 'http://www.pearvideo.com/video_' + m_id
        #print(detail_url)
        detail_url_list.append(detail_url)  #把每个视频链接添加进去

    #print(detail_url_list)
    return detail_url_list

#解析详情页获取视频url
def parse_detail(text):
    '''
    (.*?):提取括号内容
    .*?:直接匹配
    <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style=" 100%; height: 100%;"></video>
    正则:<video.*?src="(.*?)"

正则:srcUrl="(.*?)"
    '''

    movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0]
    #print(movie_url)
    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加回车键
    #1、对主页发送请求
    index_res=get_page(url='http://www.pearvideo.com/')
#2、对主页进行解析,获取详情页id
    detail_url_list=parse_index(index_res.text)
    #print(detail_url_list)
        #3、对每个详情页发送url请求
    for detail_url in detail_url_list:
         detail_res=get_page(url=detail_url)
         #print(detail_res.text)
         movie_url=parse_detail(detail_res.text)
         print(movie_url)

         save_movie(movie_url)

4、对requests命令的详细使用,其中需要注意headers的反扒操作,以及如何精准定位每页的网址

'''
访问发现知乎
请求url:https://www.zhihu.com/explore
请求方式l;GET
请求头:
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

    cookie


'''
#访问知乎
import requests
# response=requests.get(url="https://www.zhihu.com/explore")
# print(response.status_code) #400
# print(response.text)#错误页面



'''
params参数
访问百度搜查蔡徐坤url
http://www.baidu.com/s?wd=安徽工程大学&pn=10
http://www.baidu.com/s?wd=安徽工程大学&pn=20
'''

from urllib.parse import urlencode
#url='https://www.baidu.com/s?wd=%E8%94%A1%E5%BE%90%E5%9D%A4'
#url='https://www.baidu.com/s?'+urlencode({"wd":"蔡徐坤"})

url='http://www.baidu.com/s?'
headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}


#在get方法中添加params参数
#response=requests.get(url,headers=headers,params={"wd":"安徽工程大学"})
response=requests.get(url,headers=headers,params={"wd":"安徽工程大学","pn":"20"})
#print(url)

with open('gongcheng2.html','w',encoding='utf-8') as f:
    f.write(response.text)

5、对豆瓣前25的电影信息进行爬取,其中包括电影详情页url、图片链接、电影名称、电影评分、评价人数

'''
主页:https://movie.douban.com/top250
    GET
    user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
re正则:
    # 电影详情页url、图片链接、电影名称、电影评分、评价人数
    <div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价

'''
import requests
import re
url="https://movie.douban.com/top250"
headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

#1、往豆瓣top250发送请求获取响应数据
response=requests.get(url,headers=headers)
#print(response.text)
#2、通过正则解析提取数据
# 电影详情页url、图片链接、电影名称、电影评分、评价人数
movie_content_list=re.findall(
    #正则规则
    '<div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价',
    #解析分析
    response.text,
    #匹配模式
    re.S
)

for movie_content in movie_content_list:
    #解压赋值
    detail_url,movie_jpg,name,point,num=movie_content
    data=f'电影名字:{name},详情页url:{detail_url},图片url:{movie_jpg},评分:{point},评价人数:{num}
'
    print(data)

    #保存数据,把电影信息写入文件中
    with open('douban.txt','a',encoding='utf-8') as f:
        f.write(data)

6、作业:

  对豆瓣前250的电影进行爬取,其中又增加两条信息为:演出人员信息、电影简介

代码如下:

import requests
import re

def crow(i):
    url = 'https://movie.douban.com/top250?start=' + str(25 * i)
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }

    # 1、往豆瓣top250发送请求获取响应数据
    response = requests.get(url, headers=headers)
    # print(response.text)
    # 2、通过正则解析提取数据
    # 电影详情页url、图片链接、电影名称、导演信息、电影评分、评价人数、电影简介
    movie_content_list = re.findall(
        # 正则规则
        '<div class="item">.*?href="(.*?)">.*?src="(.*?)" .*?<span class="title">(.*?)</span>.*?<p class="">(.*?)</p>.*?<span class="rating_num" property="v:average">(.*?)</span>.*?<span>(.*?)人评价.*?<span class="inq">(.*?)</span>',
        # 解析分析
        response.text,
        # 匹配模式
        re.S
    )

    for movie_content in movie_content_list:
        # 解压赋值
        detail_url, movie_jpg, name,actor, point, num ,brief= movie_content
        data = f'电影名字:{name},详情页url:{detail_url},图片url:{movie_jpg},演员信息:{actor},评分:{point},评价人数:{num},简介:{brief}
'
        print(data)

        # 保存数据,把电影信息写入文件中
        with open('douban.txt', 'a', encoding='utf-8') as f:
            f.write(data)


for i in range(10):

    crow(i)

得到的爬取信息

小结:通过对python的学习,了解到了更多有关Python的知识,整个过程是新奇刺激的,也大大提高对python的兴趣,同时在后面的学习中也会更加认真,争取学习到更多的知识。




原文地址:https://www.cnblogs.com/zmmm/p/11032069.html