周总结

0922内容概要

  • 作业讲解之正则解析红牛分公司数据

  • 作业讲解之爬取糗图图片数据

  • 爬取优美图库高清图片

  • 爬取梨视频视频数据

  • openpyxl模块

    专门用于操作excel表格 也是很多操作excel表格模块的内部模块
    

0922内容详细

作业讲解之正则解析红牛分公司数据

import requests
import re

# 1.朝页面发送get请求获取页面数据
res = requests.get("http://www.redbull.com.cn/about/branch")
# 2.分析数据特征 书写相应正则
# 2.1.正则解析分公司名称
title_list = re.findall('<h2>(.*?)</h2>', res.text)
# 2.2.正则解析分公司地址
addr_list = re.findall("<p class='mapIco'>(.*?)</p>", res.text)
# 2.3.正则解析分公司邮编
email_list = re.findall("<p class='mailIco'>(.*?)</p>", res.text)
# 2.4.正则解析分公司电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", res.text)

res = zip(title_list, addr_list, email_list, phone_list)  # 拉链方法
print(list(res))  # 将迭代器转换成普通的列表

作业讲解之爬取糗图图片数据

import requests
from bs4 import BeautifulSoup
import os

if not os.path.exists(r'糗图图片'):
    os.mkdir(r'糗图图片')


def get_img(url):
    # 1.发送get请求获取页面数据
    res = requests.get(url)
    # 2.解析库bs4
    soup = BeautifulSoup(res.text, 'lxml')
    # 3.研究标签特征 获取图片链接
    img_tag_list = soup.find_all(name='img', attrs={'class': 'illustration'})
    for img in img_tag_list:
        img_src = img.get('src')
        full_src = 'https:' + img_src
        # 朝图片完整的地址发送请求保存数据
        res1 = requests.get(full_src)
        img_name = full_src.rsplit('/')[-1]
        file_path = os.path.join(r'糗图图片', img_name)
        with open(file_path, 'wb') as f:
            f.write(res1.content)
        print('图片:%s 保存成功' % img_name)


for i in range(1, 5):
    base_url = "https://www.qiushibaike.com/imgrank/page/%s/" % i
    get_img(base_url)

"""
1.换一种筛选数据的方式
	1.1.正则
	1.2.先找div然后for循环查找里面的img
"""

爬取优美图库高清图片

import requests
from bs4 import BeautifulSoup
import os

if not os.path.exists(r'优美图片库'):
    os.mkdir(r'优美图片库')

# 1.朝主页面发送get请求
res = requests.get('https://www.umei.cc/bizhitupian/diannaobizhi/')
'''当使用.text方法之前最好先确认一下页面数据是否乱码'''
res.encoding = 'utf-8'  # 容易忽略
# 2.获取二次详情页地址链接
soup = BeautifulSoup(res.text, 'lxml')
# 由于页面上有很多列表标签 我们需要先进行区分 所以先找上一层div标签
div_tag = soup.find(name='div', attrs={'class': 'TypeList'})
# 先获取所有的li标签
li_list = div_tag.find_all(name='li')  # ['li>a','li>a',...]
# for循环一个个li标签 获取内部a标签
# 提前定义根目录地址
base_url = 'https://www.umei.cc'
for li in li_list:
    a_tag = li.find(name='a')
    a_link = a_tag.get('href')
    a_full_link = base_url + a_link
    # 朝一个个链接地址发送请求
    res1 = requests.get(a_full_link)
    '''由于我们只需要链接 并且发现链接没有字符 全是英文 所以此处不需要考虑'''
    soup1 = BeautifulSoup(res1.text, 'lxml')
    # 筛选出页面上的图片src地址
    img_tag = soup1.select('div.ImageBody img')  # 列表
    for img in img_tag:
        src = img.get('src')
        # 朝图片的地址发送请求获取图片数据
        res2 = requests.get(src)
        file_path = os.path.join(r'优美图片库', src[-10:])
        with open(file_path, 'wb') as f:
            f.write(res2.content)
        print('图片:%s 下载成功' % file_path)

 """
 1.每个人爬取自己喜欢的分类
 	每一行代码都必须写注释
 """

爬取梨视频视频数据

import requests
from bs4 import BeautifulSoup

# 定义根目录地址
base_url = 'https://www.pearvideo.com/'

# 1.发送get请求获取页面数据
res = requests.get('https://www.pearvideo.com/category_31')
# 2.使用bs4模块解析
soup = BeautifulSoup(res.text, 'lxml')
# 3.研究视频详情链接
li_list = soup.select('li.categoryem')
# 4.循环获取每个li里面的a标签
for li in li_list:
    a_tag = li.find(name='a')
    a_href_link = a_tag.get('href')  # video_1742158
    # second_link = base_url + a_href_link  # https://www.pearvideo.com/video_1742158
    '''研究发现详情页视频数据并不是直接加载的 也就意味着朝上述地址发送get请求没有丝毫作用'''
    """
    video_1742158
    内部动态请求的地址
        https://www.pearvideo.com/videoStatus.jsp?contId=1742158&mrd=0.9094028515390931
            contId: 1742158
            mrd: 0.9094028515390931  0到1之间的随机小数
    动态请求之后返回的核心数据
        https://video.pearvideo.com/mp4/adshort/20210920/1632283823415-15771122_adpkg-ad_hd.mp4
    真实视频地址
        https://video.pearvideo.com/mp4/adshort/20210920/cont-1742158-15771122_adpkg-ad_hd.mp4
    """
    # 通过研究发现详情页数据是动态加载的 所以通过network获取到地址
    video_id = a_href_link.split('_')[-1]
    headers = {
        "Referer": "https://www.pearvideo.com/video_%s" % video_id
    }
    res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                        params={'contId': video_id},
                        headers=headers
                        )
    data_dict = res1.json()
    src_url = data_dict['videoInfo']['videos']['srcUrl']
    systemTime = data_dict['systemTime']
    # https://video.pearvideo.com/mp4/adshort/20210920/1632285084621-15771122_adpkg-ad_hd.mp4
    '''如何替换核心数据 通过研究发现systemTime是关键'''
    real_url = src_url.replace(systemTime, 'cont-%s' % video_id)
    # 作业完成

防爬措施之防盗链

校验当前请求从何而来 如果是本网站则允许访问如果是其他网址则拒绝
在请求头中有一个专门用于记录从何而来的键值对
	referer建

0923内容概要

  • 作业讲解
  • python操作表格
  • 爬取二手房数据并写入表格
  • 爬取汽车之家新闻数据并写入表格
  • 爬取豆瓣电源Top250数据并写入表格

0923内容详细

作业讲解

梨视频多页数据爬取思路
import requests
from bs4 import BeautifulSoup
import os
import time

if not os.path.exists(r'梨视频数据'):
    os.mkdir(r'梨视频数据')


def get_video(n):
    # 1.先朝一个固定的url发送请求 获取到只有html标签的页面  重点描述分析过程
    res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start=%s' % n)
    # 2.解析页面数据获取到详情页的链接地址
    soup = BeautifulSoup(res.text, 'lxml')
    # 3.研究视频详情链接
    li_list = soup.select('li.categoryem')
    # 4.循环获取每个li里面的a标签
    for li in li_list:
        a_tag = li.find(name='a')
        a_href_link = a_tag.get('href')  # video_1742158
        '''研究发现详情页视频数据并不是直接加载的 也就意味着朝上述地址发送get请求没有丝毫作用'''
        """
        video_1742158
        内部动态请求的地址
            https://www.pearvideo.com/videoStatus.jsp?contId=1742158&mrd=0.9094028515390931
                contId: 1742158
                mrd: 0.9094028515390931  0到1之间的随机小数
        动态请求之后返回的核心数据
            https://video.pearvideo.com/mp4/adshort/20210920/1632283823415-15771122_adpkg-ad_hd.mp4
        真实视频地址
            https://video.pearvideo.com/mp4/adshort/20210920/cont-1742158-15771122_adpkg-ad_hd.mp4
        """
        # 通过研究发现详情页数据是动态加载的 所以通过network获取到地址
        video_id = a_href_link.split('_')[-1]
        # 防盗链
        headers = {
            "Referer": "https://www.pearvideo.com/video_%s" % video_id
        }
        res1 = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                            params={'contId': video_id},
                            headers=headers
                            )
        data_dict = res1.json()
        src_url = data_dict['videoInfo']['videos']['srcUrl']
        systemTime = data_dict['systemTime']
        # https://video.pearvideo.com/mp4/adshort/20210920/1632285084621-15771122_adpkg-ad_hd.mp4
        '''如何替换核心数据 通过研究发现systemTime是关键'''
        real_url = src_url.replace(systemTime, 'cont-%s' % video_id)

        res2 = requests.get(real_url)
        file_path = os.path.join(r'梨视频数据', '%s.mp4' % video_id)
        with open(file_path, 'wb') as f:
            f.write(res2.content)
        time.sleep(0.5)


for n in range(12, 48, 12):
    get_video(n)

openpyxl模块

"""
1.excel文件的后缀名针对版本的不同是不同的
	03版本之前:.xls
	03版本之后:.xlsx
2.在python能够操作excel表格的模块有很多
	openpyxl模块
		最近几年比较流行的模块 
			该模块可以操作03版本的之后的文件
			针对03版本之前的兼容性可能不太好
	xlrd、wlwt模块
		xlrd控制读文件 wlwt控制写文件
			该模块可以操作任何版本的excel文件
3.excel本质并不是一个文件
	修改excel文件后缀名至.zip即可查看
"""
# 下载第三方模块
	pip3 install openpyxl

创建文件

"""在使用openpyxl模块操作excel文件的时候一定要确保文件是关闭状态"""
from openpyxl import Workbook

# 1.创建一个对象
wb = Workbook()

# 3.创建多个工作簿
wb1 = wb.create_sheet('学生表')
wb2 = wb.create_sheet('课程表')
# 4.还可以指定工作簿的顺序
w3 = wb.create_sheet('老师表', 0)
# 5.create_sheet方法会返回当前被创建的工作簿对象
w3.title = '教师表'  # 工作簿名称支持二次修改
w3.sheet_properties.tabColor = "1072BA"  # 修改工作簿名称样式
print(wb.sheetnames)  # 查看当前excel文件所有的工作簿名称

# 2.保存文件
wb.save(r'1.xlsx')

如何写数据

from openpyxl import Workbook

wb = Workbook()
wb1 = wb.create_sheet('数据统计', 0)
# 写入数据方式1
# wb1['A1'] = 111
# wb1['A2'] = 222
# 写入数据方式2
# wb1.cell(column=1, row=3, value=333)  # cell意思是单元格
# 写入数据方式3
wb1.append(['序号', '姓名', '年龄', '性别'])  # 定义表头数据
wb1.append([1, 'jason', 28, 'male'])  # 存储表单数据
wb1.append([2, 'tony', 38, 'female'])  # 存储表单数据
wb1.append([3, 'kevin', 28, 'male'])  # 存储表单数据
wb1.append([4, 'kevin1', 'male'])  # 存储表单数据
wb1.append([5, 'kevin2', 'female'])  # 存储表单数据
wb1.append([5, 'kevin2', '', 'female'])  # 存储表单数据
wb1.append([5, 'kevin2', 88, None])  # 存储表单数据
"""
append是按照行数一行行录入数据
"""

# 写入计算公式
wb1["A9"] = '=sum(A2:A8)'


wb.save(r'2.xlsx')

如何读数据

from openpyxl import load_workbook

# 1.指定要读取的表格文件
wb = load_workbook(r'2.xlsx', data_only=True)
# 2.先查看工作簿名称 并指定你要操作的工作簿
# print(wb.sheetnames)  # ['数据统计', 'Sheet']
# 3.指定操作的工作簿
wb1 = wb['数据统计']  # wb1指代的就是数据统计的工作簿

# 读取数据的方式1
# print(wb1['B2'].value)  # 获取普通数据
# print(wb1['A9'].value)  # 获取公式  =SUM(A2:A8)
"""
如果在读取数据的时候不想获取公式本身而是公式的结果需要指定data_only参数
       wb = load_workbook(r'2.xlsx', data_only=True)
"""
# 读取数据的方式2
# print(wb1.cell(row=3, column=2).value)


# for row in wb1.rows:
#     for r in row:
#         print(r.value)

# for col in wb1.columns:
#     for c in col:
#         print(c.value)


# 获取最大的行数和列数
print(wb1.max_row)  # 9
print(wb1.max_column)  # 4

openpyxl实战案例

爬取豆瓣top250电源名单
	1.需要电影名称、导演主演、评分、评价人数、座右铭(不是所有的电影都有)
    	需要在表格中先创建上述五个字段
    2.自己选择写入数据的方式
    # 豆瓣对IP的访问频率有非常严格的限制 最好加延迟

0924内容概要

  • 作业讲解
  • 爬取链接二手房数据并写入文件
  • 爬取汽车之家新闻数据并写入文件
  • xpath解析器
  • xpath爬取猪八戒数据

0924内容详细

作业讲解

import requests

proxies = {
    'http': '114.99.223.131:8888',
    'http': '119.7.145.201:8080',
    'http': '175.155.142.28:8080'
}

res = requests.get('https://movie.douban.com/top250',
                   headers={
                       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
                   },
                   proxies=proxies
                   )
# 1.退出账户 返回登录界面 研究登录的地址以及携带的数据 代码发送请求获取cookie
# 2.使用IP代理池访问(不推荐使用)
print(res.text)

爬取链接二手房数据并写入文件

1.先研究单页数据的爬取
2.再研究多页数据的爬取
3.最后研究如何写入文件  # 2 3步骤可以交换顺序 可能更简单
'''一定要将复杂的功能拆分成多个简单的小步骤'''
# 前戏 先发现一些小规律
	https://sh.lianjia.com/ershoufang/
            省市
    https://sh.lianjia.com/ershoufang/pudong/
        							区
    
需求分析
	名称 地址 详细信息 关注人数 发布时间 单价 总价
多页分析
	https://sh.lianjia.com/ershoufang/pudong/
    https://sh.lianjia.com/ershoufang/pudong/pg2/
    https://sh.lianjia.com/ershoufang/pudong/pg3/
     
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

wb = Workbook()
wb1 = wb.create_sheet('二手房数据')
# 先定义表头
wb1.append(['房屋名称', '详情链接', '小区名称', '区域名称', '详细信息', '关注人数', '发布时间', '总价', '单价'])


def get_info(num):
    # 1.经过分析得知页面数据直接加载
    res = requests.get('https://sh.lianjia.com/ershoufang/pudong/pg%s/' % num)
    # print(res.text)  # 2.查看是否有简单的防爬以及页面编码问题
    # 3.利用解析库筛选数据
    soup = BeautifulSoup(res.text, 'lxml')
    # 4.分析数据特征 采取相应解析措施
    # 先整体后局部 先查找所有li标签
    li_list = soup.select('ul.sellListContent>li')
    # 然后循环获取每一个li标签 再去内部筛选一个个数据
    for li in li_list:
        # 依次获取所需数据 select与findall返回的结果都是列表 find返回的是标签对象
        a_tag = li.select('div.title>a')[0]
        # 房屋名称
        title = a_tag.text
        # 详情链接
        link = a_tag.get('href')

        div_tag = li.select('div.positionInfo')[0]
        # 地址信息
        address = div_tag.text  # xxx - xxx
        res = address.split('-')
        if len(res) == 2:
            xq_name, xq_pro = res
        else:
            xq_name = xq_pro = res[0]

        div_tag1 = li.select('div.houseInfo')[0]
        # 详细信息
        # TODO:该项数据也可以做详细拆分 并且需要考虑缺失情况
        info = div_tag1.text

        div_tag2 = li.select('div.followInfo')[0]
        # 关注度及发布时间
        focus_time = div_tag2.text  # xxx / xxx
        people_num, publish_time = focus_time.split('/')

        div_tag3 = li.select('div.totalPrice')[0]
        # 总价
        total_price = div_tag3.text

        div_tag4 = li.select('div.unitPrice')[0]
        # 单价
        unit_price = div_tag4.text

        wb1.append(
            [title, link, xq_name.strip(), xq_pro.strip(), info, people_num.strip(), publish_time.strip(), total_price,
             unit_price])


for i in range(1, 5):
    get_info(i)

wb.save(r'二手房数据.xlsx')

爬取汽车之家新闻数据

需求分析
	获取新闻数据
    	新闻标题 新闻链接 新闻图标 发布时间 新闻简介
    
特性分析
	1.页面数据也存在动态加载 但是该动态加载是由js代码完成
    	第一次请求数据的时候其实就已经获取到了所有的数据只不过是通过js代码控制展示条数的
    2.页面干扰项
  
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

res = requests.get('https://www.autohome.com.cn/news/',
                   headers={
                       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
                   }
                   )
res.encoding = 'gbk'
soup = BeautifulSoup(res.text, 'lxml')
# 1.先查找所有的li标签
li_list = soup.select("ul.article>li")
# 2.循环li标签 获取内部所需数据
for li in li_list:
    a_tag = li.find('a')
    if not a_tag:
        # 当该标签内部无法获取到其他标签时 说明往下再获取其他标签就没有意义了
        continue
    # 新闻详情页链接
    link = 'https:' + a_tag.get('href')
    h3_tag = li.find('h3')
    if not h3_tag:
        continue
    # 获取新闻标题
    title = h3_tag.text
    # 简写
    # title = li.find('h3').text
    # img_tag = li.find('img')
    # 获取新闻图标
    # src = img_tag.get('src')
    # 简写
    src = li.find('img').get('src')
    # span_tag = li.find('span')
    # 获取发布时间
    # publish_time = span_tag.text
    # 简写
    publish_time = li.find('span').text
    # p_tag = li.find('p')
    # 获取文字简介
    # desc = p_tag.text
    # 简写
    desc = li.find('p').text
    # em_tag = li.find('em')
    # 获取观看次数
    # watch_num = em_tag.text
    # 简写
    watch_num = li.find('em').text
    # em1_tag = li.select('em.icon12')
    # 获取评论次数
    # comment_num = em1_tag[0].text
    # 简写
    comment_num = li.find('em', attrs={'data-class': 'icon12 icon12-infor'}).text
posted @ 2021-09-26 23:07  wddwyw  阅读(42)  评论(0编辑  收藏  举报