爬虫实战进阶

概要

  • 爬糗图百科汇总

  • 爬取优美图库高清图片

  • 爬取梨视频汽车视频数据

  • 防盗链

 


 详细

  • 补充

拉链方法

# 将多个列表按索引分别组合成元组放入迭代器中
iter = zip(list1,list2,list3,list4)
list(iter)
  • 爬糗图百科汇总

# 正则
import requests
import os
import re

# 1.图片在网页上,直接发送请求即可
qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/')
resText = qiushiRes.text
# 2.通过正则匹配糗图
imgList = re.findall('<img src="(.*?)" alt="糗事.*"', resText)
# 3.判断是否存在存放图片文件夹,不存在则创建
if not os.path.exists(r'糗图'):
    os.mkdir(r'糗图')
# 4.循环获得的图片
for imgLink in imgList:
    # 5.组合图片链接
    realLink = "https:"+imgLink
    # 6.向图片链接发送get请求,返回流文件
    image = requests.get(realLink, stream=True)
    # 7.新建图片文件
    with open(r'糗图\{}'.format(imgLink.split('/')[-1]), 'wb') as f:
        # 8.逐行写入
        for line in image.iter_content():
            f.write(line)
# bs4模块
import requests
from bs4 import BeautifulSoup
import os
# 1.图片在网页上,直接发送请求即可
qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/')
resText = qiushiRes.text
# 2.构造解析器对象
soup = BeautifulSoup(resText, 'lxml')
# 3.判断是否存在存放图片文件夹,不存在则创建
if not os.path.exists(r'糗图'):
    os.mkdir(r'糗图')
# 34.查找图片
imgTagList = soup.find_all(name='img', attrs={'class': 'illustration'})
for img in imgTagList:
    # 4.拼接完整链接
    realLink = 'https:' + img.get('src')
    # 5.向图片链接发送get请求,返回流文件
    image = requests.get(realLink, stream=True)
    # 6.新建图片文件
    with open(r'糗图\{}'.format(img.get('src').split('/')[-1]), 'wb') as f:
        # 8.逐行写入
        for line in image.iter_content():
            f.write(line)

  •  爬取优美图库高清图片

https://www.umei.cc/katongdongman/dongmantupian/
1.先在空白处右键点击查看网页源代码
2.发现页面上的小图链接在网页中,该网站的图片采用直接加载的方式
3.模拟朝该地址发送get请求获取动漫图片首页
4.分析返回结果发现主页面图片与动漫推荐下的图片在class不同的div页面布局标签下,可根据这个特点加以区分
5.利用bs4模块(或正则表达式)筛选图片标签,这里从区分度高的div标签往下找
6.查找div标签下的li列表标签
7.发现其下img标签中的是小图地址,不需要;观察发现点击a标签中的地址能打开图片详情页
8.循环li列表标签,获取这些a标签中链接与网站头拼接成完整链接
9.查看详情页源代码,存在大图链接,是直接加载的
10.分析页面发现class为ImageBody的div标签下的img标签为大图
11.循环向该标签的src链接发送请求,将返回结果保存至指定目录,这是单页图片

import requests
from bs4 import BeautifulSoup
import os
import time

# 1.判断存放图片的目录是否存在,不存在则自动创建
if not os.path.exists(r'动漫图片'):
    os.mkdir(r'动漫图片')
# 2.图片首页地址
pageUrl = 'https://www.umei.cc/katongdongman/dongmantupian/'
# 3.向该地址发送get请求
res = requests.get(pageUrl)
# 4.指定合适的字符编码
res.encoding = 'UTF-8'
# 5.构造html解析器
soup = BeautifulSoup(res.text, 'lxml')
# 6.筛选图片所在的页面布局标签
divTag = soup.find(name='div', attrs={'class': 'TypeList'})
# 7.筛选页面布局下的列表标签
liList = divTag.find_all(name='li')
# 8.获取每个a标签的href属性
imgDetailTag = [li.a.get('href') for li in liList]
# 9.将每个href属性值补全成完整网址(图片详情页)
imgDetailUrlList = ['https://www.umei.cc'+imgDetailUrl for imgDetailUrl in imgDetailTag]
# 10.循环图片详情页
for imgDetail in imgDetailUrlList:
    # 11.向图片详情页发送请求
    res1 = requests.get(imgDetail)
    # 12.对图片详情页构造html解析器
    soupD = BeautifulSoup(res1.text, 'lxml')
    # 13.获取img标签
    imgBigTag = soupD.select('div.ImageBody img')
    # 14.select返回结果需要循环,获取图片链接
    for imgBig in imgBigTag:
        # 15.设置时间延迟
        time.sleep(1)
        print(imgBig.get('src'))
        # 16.向大图链接发送请求
        img = requests.get(imgBig.get('src'), stream=True)
        # 17.拼接文件路径
        filePath = os.path.join(r'动漫图片', imgBig.get('src').split('/')[-1])
        # 18.保存图片
        with open(filePath, 'wb') as f:
            for line in img.iter_content():
                f.write(line)
View Code

  •  爬取梨视频汽车视频数据

https://www.pearvideo.com/category_31
1.先在空白处右键点击查看网页源代码
2.发现页面上的视频信息在网页中,该网站的视频链接、名称等是直接加载的
3.模拟向梨视频汽车板块网址发送get请求
4.分析返回结果发现视频链接是一个个li标签下的a标签的href值
5.由于同类li只用于存放视频,从这些li标签定位a标签即可
6.补全a标签中的链接,点击,是视频详情页,查询该网页源代码
7.视频详情页中视频不是直接加载的,无需向该网页发送请求
8.通过network找到二次加载的地址,并向其发送get请求,返回错误信息,说明该网站有防爬措施
9.在请求头中添加referer字段说明请求来源
10.向该视频链接发送请求并反序列化
11.拿到的视频链接无法访问
12.分析可知中间有一段被系统时间替换
请求返回的链接:
https://video.pearvideo.com/mp4/short/20210922/1632319206999-15771638-hd.mp4
13.利用视频编号将其替换回来从而获取真实连接:
https://video.pearvideo.com/mp4/adshort/20210922/cont-1742228-15771122_adpkg-ad_hd.mp4
14.向该链接发送请求并将返回的视频保存至本地

    

import requests
from bs4 import BeautifulSoup
import os
import time

# 1.判断存放视频的目录是否存在,不存在则自动创建
if not os.path.exists(r'梨视频_Car'):
    os.mkdir(r'梨视频_Car')
# 2.指定梨视频汽车板块主界面url
mainUrl = 'https://www.pearvideo.com/category_31'
# 3.模拟向梨视频汽车板块发送get请求
mainRes = requests.get(mainUrl)
# 4.构造html解析器
mainSoup = BeautifulSoup(mainRes.text, 'lxml')
# 5.循环li标签
liList = mainSoup.find_all(name='li', attrs={'class': 'categoryem'})
# 6.获取a标签的href值,同时也是视频编号
videoDetailList = [li.a.get('href') for li in liList]
# 7.设置基础网站
baseUrl = 'https://www.pearvideo.com/'
# 8.虽然无需向详情页发送请求,视频链接的请求参数需要a标签的href值作为视频编号
for videoCode in videoDetailList:
    # 9.主动设置时间延迟
    time.sleep(1)
    # 10.向视频详情页动态加载的地址发送get请求
    videoId = videoCode.split('_')[-1]
    videoRes = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                            params={'contId': videoId},
                            headers={'referer': baseUrl + videoCode}
                            )
    # 11.将返回结果反序列化
    dataJson = videoRes.json()
    # 12.获取视频链接,但是无法访问
    srcUrl = dataJson.get('videoInfo').get('videos').get('srcUrl')
    # 13.需要获取真实链接
    realUrl = srcUrl.replace(dataJson.get('systemTime'), 'cont-{}'.format(videoId))
    # 14.向真实视频链接发送请求
    realVideoRes = requests.get(realUrl, stream=True)
    # 15.拼接文件路径
    filePath = os.path.join(r'梨视频_Car', realUrl.split('/')[-1] )
    # 16.将视频写入指定路径的文件
    with open(filePath, 'wb') as f:
        # 17.逐行写入
        for line in realVideoRes.iter_content():
            f.write(line)
    print('{}下载成功'.format(videoId))
View Code

  • 防盗链

防爬措施:校验当前请求从何而来
1.本网站   - >  允许访问
2.其他网址 - > 拒绝
在请求头中有一个专门用于记录来源的键值对
referer:本网站地址

 

posted @ 2021-09-22 16:35  Leguan001  阅读(64)  评论(0)    收藏  举报