2019.6.14

昨日回顾
爬虫原理:
什么是爬虫
爬虫指的是爬取数据

什么是互联网
由一堆网络设备把一台一台的计算机互联到一起

互联网建立的目的
数据的传递与共享

上网的全过程:
-普通用户
打开浏览器—>往目标站点发送请求—>接受响应数据—>渲染到页面上

-爬虫程序
模拟浏览器—>往目标站点发送请求—>接受响应数据—>


-请求方式:
GET、POST

-请求头
cookies
user-agent
host


爬虫的全过程:
1、发送请求(请求库)
-requests模块
-selenium模块

2、获取相应数据(服务器返回)

3、解析并提取数据(解析库)
-bs4(BeautifulSoup4)
-Xpath

4、保存数据(存储库)MongoDB
-MongoDB

1、3、4需要手动写

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

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


今日内容
requests模块的详细应用
selenium模块


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

 

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="width: 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)
View Code

 

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="width: 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)
View Code

 

4、requests模块的详细应用

'''
访问发现知乎
请求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)
View Code

 

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}\n'
    print(data)

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

 

今日作业

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

from lxml import etree

 
import requests

#爬取基本的豆瓣TOP250信息

#伪装浏览器,headers可以从开发人员工具中找到User-Agent

headers={ 

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

 } 

def getResqutes(): 

    urls=["https://movie.douban.com/top250?start={}".format(str(i)) for i in range(0,250,25)] 

    for url in urls: 

        data=requests.get(url,headers=headers) #此处是请求

        html=etree.HTML(data.text) #网页的解析

        count=html.xpath("//div[@class='item']") #这里是共有的xpath

        for info in count: 

            title=info.xpath("div[2]/div[1]/a/span[1]/text()")#电影名称             

            start=info.xpath("div[2]/div[2]/div/span[2]/text()")#电影星评                 

            detail=info.xpath("div[2]/div[2]/p[2]/span/text()") #电影的简介

            for title,start,detail in zip(title,start,detail): 

                result={ 

                    "title":title,    

                    "start":start, 

                    "detail":detail, 

                } 

                print(result) 

if __name__=='__main__': 

    getResqutes()
View Code

 

 

posted @ 2019-06-14 14:54  鸡肉串  阅读(188)  评论(0编辑  收藏  举报