4.3 网络爬虫实例02 2021-06-17
·
上一章我们学习了爬虫基础,留了扩展训练:
- 怎么把图片存储到本地的文件夹下
- 获取列表里每条数据的详情页信息
- 保存数据为Excel
这一章就上面三个展开详细的讲述:
仍以https://www.ilync.cn/这个网站为例,我们上一章已经讲述了怎么爬取列表上的数据,那么每个列表里的详细数据怎么拿到呢?
课程图片点击进去,打开了一个新的页面,如下图:
我们所需要的详细信息就是框出来的,发现有一个class名为fcz的span标签,那么我们就可以用上一章学习的知识来获取对应的内容了:

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

那么接下来我们就在昨天的代码基础上新增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)