爬取实验楼全部课程及对应链接

本文介绍了如何使用Python的requests和BeautifulSoup模块爬取实验楼网站的全部课程及链接,通过伪装头发送请求,解析HTML获取课程名称和链接,并进行持久化存储。
摘要由CSDN通过智能技术生成


前言

其实学习这种课程直接看网页比较方便,但是并不是所有人都知道这么厉害的课程网站呀!!
正好我好朋友最近不知道学点什么,索性我就把网站课程和链接爬出来,让她自己浏览,如果觉得喜欢了再去网站系统学习~
因为技术有限,所以没涉及分析、存储啥的,大家一起慢慢学习嘛~


一、前期准备

这里用到的链接是:https://www.lanqiao.cn/courses/

大致思路是:指定伪装头和url→发送请求(这里有乱七八糟各种请求)→获取相应信息

在这里插入图片描述从上面图片可以看出真正的课程链接是藏在img里的,前面有好几个div。既然要获取课程名称和链接,一会就要用find()或者find_all()去找a标签里的链接和img里的alt,而src那个只不过是个图片。

要爬取这个页面的话就需要requests模块和BeautifulSoup模块。

下面就开始时间啦!!

二、实践!

先引入requests和Beautiful

import requests
from bs4 import Beautiful

去拿人家的东西肯定第一步知道人家家在哪,第二步伪装一下啦~这个抓包过程F12 network里就可以找到啦

#指定伪装头
headers = {
	'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'	
}
#指定url
url = 'https://www.lanqiao.cn/courses/?page='+str(k)

接下来就是发送请求啥的~

response = requests.get(url=url, headers = headers)
response.raise_for_status # 看下代码状态对不
response.encoding = response.apparent_encoding   # 转换成 utf-8

获取响应数据: 因为div是在body里,a标签是在div里,alt是在img标签里,所以都要获取到才行~

demo = response.text #把获取到的页面文本化 赋值给demo
soup = BeautifulSoup(demo, "html.parser")  解析页面
div = soup.find("body").div  #从body里找div
a = div.find_all(’div‘, ’link block‘) #从div里找到class=link block的a标签

上面已经找到了a标签 那么就要找地方存储a标签里面的链接和div标签

href_list = []  #存储链接的列表
div_list = []  #存储div的列表

思路是解析页面→找到div标签→找到a标签→找到a标签里的链接并存储div标签以便后面找到alt(存名字的)

for i in a:
	href_list.append("https://www.lanqiao.cn"+i.get("href"))  #把地址存入列表
	 #因为链接是在a标签里的class为course-cover relative的div标签里 so
	div_list.append(i.find('div','course-cover relative'))

所有需要的东西都找到了,接下来就是各种保存数据 持久化存储~

img_list = []  #存储img标签的列表
names = [] #存储名字的列表
info_dict = {} #保存数据的字典

for i in div_list:
	img_list.append(i.find('img')) #寻找img标签存到列表
for i in img_list:
	names.append(i.get('alt')) # 从img标签里得到alt 名字存进去
for i in range(0,len(names)):
	info_dict[names[i]] = href_list[i]  #字典里面把链接和名字对应起来

字典已经准备好了,也就基本完成了,接下来就是遍历字典啦,因为我还是新手,所以用的方法也比较麻烦,欢迎大佬们指导我一下,缩短一下我的代码~

new_list = {}
for i in info_dict:
	new_list[names[i]] = href[i]
print[new_list]

其实本来想不要最后这块遍历,直接在info_dict后面输出它,但是不太行,所以就直接遍历啦~

三、完整代码

import requests
from bs4 import BeautifulSoup

#try...except 中的目的是为了保证未能成功抓取数据时,不会报错
try:
    for k in range(31):
        #指定伪装头
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        }
        #指定url
        url = "https://www.lanqiao.cn/courses/?page="+str(k)
        #发起请求
        response = requests.get(url=url,headers=headers)
        response.raise_for_status  # 查看状态码是否正确
        response.encoding = response.apparent_encoding   # 转换成 utf-8 的编码形式
        #获取响应数据
        demo = response.text # 获取页面内容并赋值给定义变量 demo
        soup = BeautifulSoup(demo, "html.parser")  # 解析实验楼的页面
        div = soup.find('body').div  # 用 find() 来搜索 body 中的 div 标签,然后赋值给定义变量 div
        a = div.find_all('a', 'link block')  # 搜索所有属性名为 link block 的 a 标签

        div_list = []  # 用来存储 div 标签的列表
        href_list = []  # 用来存储课程链接的列表

        for i in a:
            # 把课程地址存入 href_list 列表里
            href_list.append("https://www.lanqiao.cn" + i.get('href'))
            # 把属性名为 course-cover relative 的 div 标签存入 div_list 列表里
            div_list.append(i.find('div', 'course-cover relative'))

        img_list = []  # 用来存储 img 标签的列表
        names = []  # 用来存储课程名字的列表
        info_dict = {}  # 保存数据的字典

        for i in div_list:  # 遍历 div 标签列表
            img_list.append(i.find('img'))  # 搜索 img 标签并添加到 img_list 列表里
        for i in img_list:  # 遍历 img 标签列表
            names.append(i.get('alt'))  # 把课程名字保存到 names 列表里
        for i in range(0, len(names)):  # 遍历 names 列表的下标值
            # 把课程名字作为字典的 Key,把课程的链接作为课程的 Value,并保存到 info 字典里
            info_dict[names[i]] = href_list[i]

        new_list = {}
        for i in range(len(info_dict)): #遍历info_dict 存到新列表并输出
            new_list[names[i]] = href_list[i]
        print(new_list)

except:
    print("未能获取页面内容")

总结

以下是我对自己代码的总结~
①想爬哪个网站就先准备好url和user-agent。有的url并不是最顶上的链接,还是得去工作台找
②确定自己想要的内容是在哪部分,这篇需要的部分就是body→div→a→div、href→img→alt
③发送请求,适当的要看一下代码状态,需不需要转utf8
④获取页面内容→文本化→找需要的内容,存标签,再从标签里找东西
⑤把找到的东西存到列表
⑥如果是像这种,一个课程对应一个链接的,就要用到字典,这样存储才不会出错
⑦try…except 可以确保没能成功抓取数据的时候不会报错

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值