4.3 网络爬虫实例02 2021-06-17

上一章我们学习了爬虫基础,留了扩展训练:

  1. 怎么把图片存储到本地的文件夹下
  2. 获取列表里每条数据的详情页信息
  3. 保存数据为Excel

这一章就上面三个展开详细的讲述:

仍以https://www.ilync.cn/这个网站为例,我们上一章已经讲述了怎么爬取列表上的数据,那么每个列表里的详细数据怎么拿到呢?

课程图片点击进去,打开了一个新的页面,如下图:

我们所需要的详细信息就是框出来的,发现有一个class名为fcz的span标签,那么我们就可以用上一章学习的知识来获取对应的内容了:
在这里插入图片描述

这里有一个问题是,我们怎么获取到这个地址呢?通过标签选中我们看到,这个a标签的href属性的值在加上域名就是我们所需要的详情页地址,那么现在思路就比较清晰了:

  1. 获取到href的值url,
  2. 通过url请求网页内容,
  3. 获取对应信息

在这里插入图片描述
那么接下来我们就在昨天的代码基础上新增url属性:

# 定义一个域名
http_url = 'https://www.ilync.cn/'
# 在get_soure 方法里,second_filter循环每个内容时,增加获取url:
id_str = one.find('a', class_='course-pic').attrs['href']
temp_dict['url'] = http_url + id_str

获取到url之后就可以爬取课程明细了,这里我们定义一个函数:

# 爬取课程明细数据
def get_course_det(url):
    content = get_content(url)  # 请求获取文本
    soup = BeautifulSoup(content, 'lxml')
    count_dom = soup.find('div', class_="count-show")
    count = count_dom.find_all('span', class_='fcz')
    arr = []
    for one in count:
        num = re.findall(r'\d{1,}', one.text)[0]
        arr.append(num)
    # print(arr)  ['23','12','22']
    # 这里是通过正则处理好的数据,大家可以自己每步打印一下看看,此处不做详细说明
    return arr

在get_soure 里调用:

   temp_dict['study'], temp_dict['comment'], temp_dict['collect'] = get_course_det(temp_dict['url'])  # 详细数据

由此我们就得到了详细数据。

保存图片在本地

有时我们需要保存网络图片在自己文件夹里,这个时候我们就需要两个包urllib、os,python有很多已有的很强大的包,后面在使用的时候就能遇到:

# 图片处理
from urllib import request
# 获取本地文件地址
import os 

定义一个保存图片的方法:

# 根据图片url 保存图片到本地
def save_img(url):
    """根据url获取图片名称"""
    # 如:http://pic5.ablesky.cn/content/pic/coursephoto/2019/01/13/a3b77f55-fecc-4b7e-9223-c3e0417e6f40.png
    file_name = url.split('/')[-1] # 切割获取文件名a3b77f55-fecc-4b7e-9223-c3e0417e6f40.png
    # 准备path  在当前目录下的文件夹images保存图片
    path = os.path.join('images', file_name)
    # 存储
    request.urlretrieve(url, path) # urllib 提供的方法
#在get_soure中调用:
def get_soure(content: str):
	...
	...
	...
	for one in second_filter:
		save_img(img)
	...
	...
	...	

执行可以看到,各个图片已经在我们的文件夹下了。可喜可贺。

在爬虫获取关键信息时,对我们的数据类型的基础是一个考验,因此,我们需要掌握之前讲的各种数据类型int、list、dict等,以及它们的操作方法。

保存为execl

数据保存为execl,有很多包可以用,这里我们用的是xlwt,具体的使用方法我们看下面一个例子:

import xlwt

# 创建一个workbook 设置编码为utf-8
workbook = xlwt.Workbook(encoding = 'utf-8')

# 创建一个sheet 名字是sheet1
''' 
参数:
1.工作表名称; 
2.是指单元格是否允许重设置,默认为False
'''
sheet = workbook.add_sheet('sheet1',cell_overwrite_ok=True) 

'''
# 写入excel
# sheet.write(i, j, content, style )
# 第一个参数代表行,第二个参数是列,第三个参数是内容,第四个参数是格式
参 
'''
sheet.write(0, 0, "信息来源")  # 第1行,第1列
sheet.write(0, 1, "公告日期")  # 第1行,第2列
sheet.write(0, 2, "推荐评分")  # 第1行,第3列
sheet.write(1, 0, "网络")  # 第2行,第1列
sheet.write(1, 1, "06-11")  # 第2行,第2列
sheet.write(1, 2, "5分") 

# 保存test.xls文件
workbook.save('test.xls')

test.xls:
在这里插入图片描述

xlwt还有很多用法,可以设置行高、行宽、行样式,这里只是一个基础的语法,详细API看这里。

通过上面的例子来把我们爬取的数据保存为Excel也是一样的方法:

	# 创建一个workbook 设置编码
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建一个worksheet 名字是sheet1
    sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
    # 生成标题行
    title = ['id', 'title', 'img', 'price', 'url', 'study', 'comment', 'collect']
    for i in range(1, len(title)):
        sheet.write(0, i, title[i])
     
        
    total_page = get_total_page(1)
    total = 0  # 总行数
    for num in range(1, total_page + 1):
        content = get_content(base_url + str(num))  # 请求获取文本
        infos = get_soure(content)  # 数据整理过滤
        # 写入excel
        # 参数对应 行, 列, 值
        for line in infos:            
            total += 1
            for i in range(1, len(title)):
                print(line[title[i]], 'end==')
                sheet.write(total, i, line[title[i]])
               
 	# 保存
    workbook.save('course.xls')

上一篇爬虫基础

下一章爬虫—多线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值