阶段学习总结之07 爬虫案例汇总

概要

  • 爬糗图百科(正则/bs4)

  • 爬取优美图库的高清图片

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

  • 爬取豆瓣电影top250

  • 爬取链接二手房数据

  • 爬取汽车之家新闻数据

  • 防盗链

  • 利用openpyxl操作Excel文件


 详情

  • 爬糗图百科(正则/bs4)

     正则

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

     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)
View Code
  • 爬取优美图库的高清图片

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
  • 爬取梨视频汽车视频数据

# 引入发送网络请求的模块
import requests
# 引入处理HTML文件的模块
from bs4 import BeautifulSoup
# 引入文件操作模块
import os
# 引入时间模块
import time

# 1.判断存放视频的目录是否存在,不存在则自动创建
if not os.path.exists(r'梨视频_Car'):
    os.mkdir(r'梨视频_Car')

def getVideo(n):
    """
        获取梨视频汽车板块全部视频方法
        参数n : 起始视频索引
    """
    # 1.梨视频汽车板块和主页的url
    carUrl = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start={}'.format(n)
    baseUrl = 'https://www.pearvideo.com/'
    # 2.向梨视频汽车板块发送get请求
    carRes = requests.get(carUrl)
    # 3.针对梨视频汽车板块的网页构造html解析器
    carSoup = BeautifulSoup(carRes.text, 'lxml')
    # 4.获取所有存放视频的li标签
    liList = carSoup.find_all(name='li', attrs={'class': 'categoryem'})
    # 5.获取a标签的href值,同时也是视频编号
    videoDetailList = [li.a.get('href') for li in liList]
    # 6.循环视频编号
    for video in videoDetailList:
        # 主动延迟
        time.sleep(1)
        # 7.获取视频编号
        videoCode = video
        # 8.获取视频id
        videoId = videoCode.split('_')[-1]
        # 9.向视频链接发送请求
        videoRes = requests.get('https://www.pearvideo.com/videoStatus.jsp',
                                params={'contId': videoId},
                                headers={'referer': baseUrl + videoCode}
                                )
        # 9.将返回结果反序列化
        dataJson = videoRes.json()
        # 10.获取视频链接
        srcUrl = dataJson.get('videoInfo').get('videos').get('srcUrl')
        # 11.需要获取真实链接
        realUrl = srcUrl.replace(dataJson.get('systemTime'), 'cont-{}'.format(videoId))
        # 12.向真实视频链接发送请求
        realVideoRes = requests.get(realUrl, stream=True)
        # 13.拼接文件路径
        filePath = os.path.join(r'梨视频_Car', '{}.mp4'.format(videoId))
        # 14.以写模式打开文件
        with open(filePath, 'wb') as f:
            # 16.按行读取视频
            for line in realVideoRes.iter_content():
                f.write(line)
        print('视频{}下载成功!!!'.format(videoId))

"""调用此方法"""
for n in range(12, 48, 12):
    getVideo(n)
View Code
  •  爬取豆瓣电影top250

import time
from openpyxl import Workbook
import requests
from bs4 import BeautifulSoup
import re


def getMovies(n, ws):
    """
        获得豆瓣电影top250
        参数 n: 页码
    """
    # 1.指定基础网址
    baseUrl = 'https://movie.douban.com/top250?start={}'.format(n * 25)
    # 2.发送get请求获得豆瓣电影top250首页
    res = requests.get(baseUrl,
                        headers={
                            'referer': 'https://movie.douban.com/top250?start=0',
                            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
                        })
    # 3.构造针对豆瓣电影top250首页的解析器
    soup = BeautifulSoup(res.text, 'lxml')
    # 4.获取电影列表的祖先标签 class为item的div标签
    divItemTags = soup.select('div.item')
    # 5.循环存放电影的li标签
    for movie in divItemTags:
        time.sleep(1)
        # 6.获取电影名称
        title = movie.span.text
        # 7.获取电影导演和主演混合的文本
        dmText = movie.select('div.bd')[0].p.text
        # 8.获取导演姓名
        director = re.findall('导演: (.*?) ', dmText)[0]
        # 9.获取主演姓名(可能为空)
        mainActor = ''
        if len(re.findall('主演: (.*?) ', dmText)) > 0:
            mainActor = re.findall('主演: (.*?) ', dmText)[0]
        # 10.获取评分
        ratingNum = movie.select('span.rating_num')[0].text
        # 11.获取评价人数
        ratingCount = movie.select('div.star span')[3].text
        # 12.获取座右铭(可能为空)
        motto = ''
        if len(movie.select('p.quote>span.inq')) > 0:
            motto = movie.select('p.quote>span.inq')[0].text
        # 13.将电影相关信息添加至excel文件相关表末尾
        ws.append([title, director, mainActor, ratingNum, ratingCount, motto])


"""爬取电影排行"""
# 1.新建excel文件对象
wbMovie = Workbook()
# 2.创建工作表
ws250 = wbMovie.create_sheet('豆瓣电影top250')
# 3.定义表头
ws250.append(['电影名称', '导演姓名', '主演姓名', '评分', '评价人数', '座右铭'])
# 4.输入需要的页数
pageNum = int(input('想看几页的电影排行:').strip())
# 5.调用方法
for page in range(pageNum):
    getMovies(int(page), ws250)
# 6.保存表格文件
wbMovie.save(r'豆瓣电影top250_{}.xlsx'.format(time.strftime('%Y-%m-%d')))
View Code
  • 爬取链接二手房数据

import time
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# 1.创建Excel表格文件
wbHouse = Workbook()
# 2.创建工作表
ws1 = wbHouse.create_sheet('某地区二手房', 0)
ws1.append(['房屋名称', '详情链接', '小区名称', '区域名称',
            '详细信息',
            '关注人数', '发布时间', '总价(万元)', '单价(元/平)'])

def handleInfo(info):
    """
        分割详细信息
        户型,大小,朝向,装修程度,楼层,年代,楼型
    """
    details = info.split('|').strip()
    if not len(details) == 7:
        details[0] = info

    return details

def getTwoHandHouse(city, area, n):
    """
            获取特定地区房屋信息
            房屋名称,详情链接,小区名称,区域名称,详细信息(可拆分),关注人数,发布时间,总价,单价
        """
    # 1.指定网站url
    twoHandUrl = 'https://{}.lianjia.com/ershoufang/{}/pg{}/'.format(city, area, n)
    # 2.定义请求头
    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"
    }
    # 3.发送请求
    resBS = requests.get(twoHandUrl, headers=headers)
    # 4.利用解析库筛选数据
    soup = BeautifulSoup(resBS.text, 'lxml')
    # 5.找到显示房屋信息的列表
    houseList = soup.select('ul.sellListContent>li')
    # 6.循环当页所有房屋
    for house in houseList:
        # 1.获取存放名称、链接的a标签
        aTag = house.select('div.title>a')[0]
        if not aTag:
            continue
        # 获取房屋名称
        houseName = aTag.text
        # 获取详情链接
        link = aTag.get('href')
        # 2.获取存放小区、地区的div标签
        divPosiTag = house.select('div.positionInfo')[0]
        posi = divPosiTag.text.split('-')
        # 根据是否有不可分割的位置信息,做不同处理
        if len(posi) == 2:
            estateName = posi[0]
            estateArea = posi[1]
        elif len(posi) == 1:
            estateName, estateArea = posi[0]
        else:
            estateName, estateArea = ''
        # 3.获取存放详细信息的div标签
        divInfoTag = house.select('div.houseInfo')[0]
        # 获取详细信息
        info = divInfoTag.text
        # 分割详细信息
        # detail =handleInfo(info)
        # 4.获取关注度与发布时间的div标签
        divFollowTag = house.select('div.followInfo')[0]
        focusTime = divFollowTag.text
        # 获取关注人数
        peopleNum = focusTime.split('/')[0].strip()
        # 获取发布时间(多少天以前)
        publishTime = focusTime.split('/')[1].strip()
        # 5.获取总价标签
        divTotalTag = house.select('div.totalPrice')[0]
        # 获取总价
        totalPrice = divTotalTag.span.text
        # 6.获取单价标签
        divUnitTag = house.select('div.unitPrice')[0]
        # 获取单价
        unitPrice = divUnitTag.text.strip('元/平')
        ''' 主动延迟 '''
        time.sleep(1)
        # 7.将数据添加至Excel表格文件
        ws1.append([houseName, link, estateName, estateArea, info,
                   peopleNum, publishTime, totalPrice, unitPrice])

num = int(input('请输入需要的二手房页数: ').strip())
# 按页获取二手房
for n in range(1, num):
    getTwoHandHouse('sh', 'baoshan', n)

# 保存文件
wbHouse.save('二手房.xlsx')
View Code
  • 爬取汽车之家新闻数据

import time
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# 1.创建Excel表格文件
wbCar = Workbook()
# 2.创建工作表
ws1 = wbCar.create_sheet('汽车之家新闻', 0)
ws1.append(['标题', '详情链接', '图标', '发布时间', '简介'])

def getCarNews(n):
    """
        获取汽车之家新闻相关信息
        标题、链接、图标、发布时间、简介
    """
    # 1.指定汽车之家新闻网的链接
    carNewsUrl = 'https://www.autohome.com.cn/news/{}/#liststart'.format(n)
    # 2.定义请求头
    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"
    }
    # 2.向汽车之家发送请求
    carRes = requests.get(carNewsUrl, headers=headers)
    # 3.避免乱码,按照响应设置字符编码
    carRes.encoding = 'GBK'
    # 4.构造html文件解析器
    carSoup = BeautifulSoup(carRes.text, 'lxml')
    # 5.先查找存放新闻信息的li标签
    newsList = carSoup.select("ul.article>li")
    for news in newsList:
        # 1.获取链接
        aTag = news.find('a')
        if not aTag:
            continue
        link = 'https:' + aTag.get('href')
        # 2.获取标题
        if not aTag.find('h3'):
            continue
        title = aTag.find('h3').text
        # 3.获取发布时间
        if not aTag.select('span.fn-left'):
            continue
        pubTime = aTag.select('span.fn-left')[0].text
        # 4.获取图标
        img = ''
        if aTag.find('img'):
            img = 'https:' + aTag.find('img').get('src')
        # 5.获取简介
        desc = ''
        if aTag.find('p'):
            desc = aTag.find('p').text
        print(link, '\n',
              title, '\n',
              img, '\n',
              pubTime, '\n',
              desc, '\n',
              '******************')
        # 6.将数据添加到Excel表格文件
        ws1.append([title, link, img, pubTime, desc])
        # 主动延迟
        time.sleep(1)


# 输入想要获取的新闻数目
pageNum = input('请输入想要获取的汽车新闻的数量(页): ').strip()
# 按页获取新闻
for n in range(1, pageNum):
    # 调用爬取汽车之家新闻信息的函数
    getCarNews()
# 保存文件
wbCar.save('车闻.xlsx')
View Code
  • 防盗链

防爬措施:校验当前请求从何而来
1.本网站   - >  允许访问
2.其他网址 - >  拒绝

在请求头中有一个专门用于记录来源的键值对
    referer : 本网站地址
  • 利用openpyxl操作Excel文件

1、excel文件具有两种不同的后缀名。

  03版本之前    .xls

  03版本之后    .xlsx

2、利用Python代码操作Excel表格文件的模块有很多种。

  openpyxl:近几年较流行,可用于操作03版本之后的excel文件,对于之前的老版本兼容性不好

  xlrd、xlwt:分别控制对Excel表格文件的读取和写入,可操作任意版本的表格

3、Excel本质并不是一个文件,将其后缀改为.zip可以看到,Excel表格是由多个文件组成的文件夹,类似于网页。

openpyxl模块并不是内置模块,需要从其他地址下载。
  pip3 install openpyxl

创建文件

1、使用表格需要先引入模块

from openpyxl import Workbook

2、创建一个Workbook对象(Excel文件)

wb = Workbook()

3、创建一个或多个工作表(sheet)

ws1 = wb1.create_sheet('第一张表')
ws2 = wb1.create_sheet('第二张表')

4、保存文件

wb.save(r'001.xlsx')

5、创建工作表的时候可以指定顺序

ws3 = wb1.create_sheet('第三张表', 0)

6、返回当前被创建的工作表对象

# 修改工作表名字
ws3.title = '表名被改了哦!'
# 修改工作表名称的样式
ws3.sheet_properties.tabColor = "1072BA"
# 查看当前excel文件所有的工作表名称,返回列表
print(wb1.sheetnames)

创建表相当于文件操作中的写模式(w),会将原有内容全部删除再重新创建新内容!!!

向Excel表格写入数据

1、引入创建Excel表格文件的方法

from openpyxl import Workbook

2、创建一个Workbook对象(Excel文件)

wb2 = Workbook()
ws2 = wb.create_sheet('数据统计', 0)
# 写入方式1
    ws2['A1'] = 111   
        ws2['A2'] = 222
# 写入方式2 # cell表示单元格对象
    ws2.cell(column=2, row=3, value=2233)
# 写入方式3 # 适用于批量写入数据,空值用None或者''代替
    ws2.append(['序号', '姓名', '年龄', '性别'])
    ws2.append([1, 'Leoric', '', 'male'])
    ws2.append([2, None, 18, 'female'])
    '''append方法按照行录入数据'''
    #也可以写入计算公式
    ws2['A9'] = '=SUM(A2:A8)'
# 保存文件
wb2.save(r'002.xlsx')

从Excel表格文件读取数据

1、引入加载Excel表格文件的方法

from openpyxl import load_workbook

2、指定要读取的Excel表格文件

rb = load_workbook(r'2.xlsx')

3、查看全部工作表名,选择要操作的表

print(rb.sheetnames)

4、指定要操作的工作表

ws3 = rb['数据统计']
# 读取方式1
    ws3['B3'].value # 2233
    ws3['A9'].value # =SUM(A2:A8)
# 读取方式2
    工作表对象名.cell(row=行序,column=列序).value

5、也可以按照行或者列读取

# 按行读取
for row in ws3.rows:
  for r in row:
    print(r.value)
# 按列读取
for col in ws3.columns:
  for c in col:
    print(c.value)

如果读取数据的时候需要读数据的值而不是公式本身!!!

# 加载表的时候指定data_only参数为真
rb = load_workbook(r'002.xlsx', data_only=True)

 

posted @ 2021-09-26 13:11  Leguan001  阅读(68)  评论(0)    收藏  举报