爬虫之较复杂案例

爬取糗图百科图片

import os # 导入os模块
import requests # 导入爬虫模块
import re # 导入re模块
import time # 导入时间模块
if  not os.path.exists(r'糗图百科图片'): # 检查'糗图百科图片'文件夹如果不存在 执行子代码
    os.mkdir(r'糗图百科图片') # 创建'糗图百科文件夹'
for i in range(1,5): # 根据观察 每个页数的变化就是尾部添加第几页 所以可以添加for循环爬取1-5页
    url="https://www.qiushibaike.com/imgrank/%s"%i # 尾部添加百分号占位符
    res=requests.get(url) # 向网址发送get请求
    res_text=res.text # 获得该网址的text文本内容
    # print(res_text)   检查内容
    list = re.findall('img src="(.*?)" alt="糗事.*"', res.text)
#print(list)
    for  name in list: # for循环该列表
        real_list='http:'+name # 给所有这个列表中的地址开头加上http:
        # print(real_list) # 检查内容
        res1=requests.get(real_list)  # 向图片地址发送请求
        time.sleep(1) # 使程序停顿一秒 缓解对方服务器压力
        res_name=real_list.rsplit('/')[-1]# 给地址从/右边做右切片取值
        file_path=os.path.join(r'糗图百科图片',res_name) # 图片文件名与文件路径拼接
        with open(file_path,'wb')as f:  # 以二进制模式写入文件
            f.write(res1.content) # 将请求到的内容以二进制单位写入文件
        print('爬取成功')

爬取优美图库

import requests # 导入爬虫模块
import os# 导入os模块
from bs4 import BeautifulSoup # 导入bs4模块
import time
if not os.path.exists(r'美女图片'): # 检查文件夹美女图片是否存在
    # 不存在则创建
    os.mkdir(r'美女图片')
url='https://www.umei.cc/meinvtupian/rentiyishu/' # 获取美女分类网址
res=requests.get(url)# 向该网址发送get请求
res.encoding='utf8'# 通过打印res.text发现有乱码现象, 所以指定字符编码为utf8
# print(res.text)
soup=BeautifulSoup(res.text,'lxml') # 使用bs4模块,对res.text进行解析
tag=soup.find(name='div',attrs={'class':'TypeList'}) # 通过观察网页得知img标签在 name=div, class=typelist中的li标签中
# print(tag)
li_list=tag.find_all(name='li') # 获得所有tag中所有li标签
base_url='https://www.umei.cc'#先定义一个底层网址
# print(li)
for li in li_list: #对li标签进行for循环
    a_tag=li.find(name='a') # 获得所有a标签
    a_link=a_tag.get('href') # 在a表中获得所有href网址
    # print(a_link)
    real_link=base_url+a_link # 将底层网址与href网址进行拼接
    # print(real_link)
    res1=requests.get(real_link) #向该图片网址发送get请求
    res1.encoding='utf8' # 经查看有乱码现象 进行转码
# print(res1.text)
    soup1=BeautifulSoup(res1.text,'lxml') # 对该网址进行解析
    img_tag=soup1.select('div.ImageBody img') # 通过该网址找到 div标签中所有class=imagebody中所有img标签
    for img in img_tag: # 对这些img进行for循环
        src=img.get('src') # 获得图片网址
    # print(src)
        res2=requests.get(src) # 向图片网址发送请求
        name=src.rsplit('/')[-1] # 给图片起名字,/向右切割
        file_path=os.path.join(r'美女图片',name) # 将美女图片与名字进行文件路劲拼接
        with open(file_path,'wb')as f: # 打开该文件路径 二进制模式写入
            f.write(res2.content)# 写入网址的二进制数据
            print('爬取成功')

爬取梨视频

import requests
from bs4 import BeautifulSoup
import os
if not os.path.exists(r'梨视频'):
    os.mkdir(r'梨视频')
base_url= 'https://www.pearvideo.com/'#先定义主网站
# 通过观察得知点击分类后 获取页面数据
url='https://www.pearvideo.com/category_8'
res=requests.get(url) # 向网站发送get请求
# print(res.text) 检查一下
soup=BeautifulSoup(res.text,'lxml') #使用bs4模块进行解析
# 通过观察网络源代码 发现视频存在于li标签
li_list=soup.select('li.categoryem ')
# print(li_list)
for li in li_list:
    a_tag=li.find(name='a')
    href=a_tag.get('href')
    # print(href)
    """
    通过观察得知该网站的网页数据不是直接加载的,朝他发请求没用 并且通过network观察网址朝另个一个网址发送get请求 复制该网址发现无法访问
    获得核心动态请求的核心数据:
     https://video.pearvideo.com/mp4/adshort/20210920/1632326942931-15771122_adpkg-ad_hd.mp4
     真正的视频网址:
     https://video.pearvideo.com/mp4/adshort/20210920/cont-1742158-15771122_adpkg-ad_hd.mp4
     所以只需要把viedio=1742158中的数字取出替换掉1632326942931这串数字即可
    """
    """
    由于有防盗链防爬措施,所以需要添加referers
    """
    id=href.split('_')[-1] # 获得数字部分
    # print(id)检查
    headers={"Referer": "https://www.pearvideo.com/video_%s" % id} #构造referer参数
    res1=requests.get('https://www.pearvideo.com/videoStatus.jsp' # 朝该网址发送get请求
                      ,params={'contId':id}  # 携带视频id参数
                      ,headers=headers # 携带请求头中的referer
                      )
    # print(res1.text)
    data=res1.json() #转换成json格式字符串
    mp4_url=data['videoInfo']['videos']['srcUrl'] # 里面是三个列表互相嵌套,先去videoinfo 再取videos 再取srcurl
    # print(mp4_url) 检查
    systemTime=data['systemTime'] # 那一串需要替换的字符就是参数systemtime
    # print(systemTime) 检查
    real_url=mp4_url.replace(systemTime,'cont-%s'% id) #把那段数字换成id  cont-不动
    # print(real_url)检查
    res2=requests.get(real_url) #朝第三次拼接的网址发送请求
    name=real_url.rsplit('t-')[-1] # 给视频取名
    file_path=os.path.join(r'梨视频',name) # 文件路径拼接
    with open (file_path,'wb') as f: #以二进制模式打开文件
        f.write(res2.content)#写入二进制模式视频
        print('爬取成功')

 

posted @ 2021-09-22 19:40  查无此人cxc  阅读(224)  评论(0)    收藏  举报