前言
其实学习这种课程直接看网页比较方便,但是并不是所有人都知道这么厉害的课程网站呀!!
正好我好朋友最近不知道学点什么,索性我就把网站课程和链接爬出来,让她自己浏览,如果觉得喜欢了再去网站系统学习~
因为技术有限,所以没涉及分析、存储啥的,大家一起慢慢学习嘛~
一、前期准备
这里用到的链接是: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 可以确保没能成功抓取数据的时候不会报错