爬取futurelearn课程网上的课程信息

前言

上一篇博客因为写的比较急,个人原因,导致很多地方不完善,具体功能也没有进行说明,这一篇

算是对上一篇的完善,以及对静态网页爬取的一个总结。

要求,计划

爬取futurelearn课程网中subjects类别中science-engineering-and-maths-courses课程中全部课程,

其中,每个课程需要爬取‘课程名‘, ‘课程性质与阶段学习‘, ‘介绍‘, ‘话题‘, ‘开始时间‘, ‘服务对象‘, ‘老师‘,

‘课程创作人‘等具体内容

初始URL:https://www.futurelearn.com/subjects/science-engineering-and-maths-courses

爬取要求:

点开一个课程查看需要爬取的具体内容:

爬取思路

(1)通过requests请求网页。

(2)解析首页内容,将首页所有课程的URL爬取下来,并保存在列表中。

(3)遍历所有的URL,解析每个课程页面,获取里面的内容,并将每个课程的内容放入单独的列表中,

最后将所有列表存在一个大列表中,此时列表为两层。

(4)将列表里的内容存入CSV文件中。

示意图:

整个项目包括四大块:

(一)请求

1 def getHTMLText(url, code =‘utf-8‘):
2     try:
3         r = requests.get(url, timeout=30)
4         r.raise_for_status()
5         r.encoding = r.apparent_encoding
6         return r.text
7     except:
8         print("获取失败")

(二)获得所有课程URL

遇到的重大问题:请求得到URL多于要求的课程URL,并且爬取到的链接有多于的内容,导致部分

链接不能解析。

要得到的是courses里面的课程

多于的不合要求的

解决方案:遍历子网页,剔除多于的链接,并且将有多余内容链接里的内容替换为null

 1 def getCourseList(lst, html):
 2     soup = BeautifulSoup(html, ‘html.parser‘)
 3     div_href = soup.find_all(‘div‘, class_=‘m-grid-of-cards m-grid-of-cards--compact‘)
 4     cop = re.compile(‘href="(.*?)">‘)
 5     href_get = re.findall(cop, str(div_href))
 6     z = ""
 7     # print(href_get)
 8     # print(type(href_get))
 9     for i in href_get:
10         j = ‘courses‘
11         m = r‘" role="button‘
12         if j in i:
13             if m in i:
14                 i = i.replace(m, z)
15             # print("https://www.futurelearn.com"+i)
16             else:
17                 pass
18             # print("https://www.futurelearn.com"+i)
19             i = "https://www.futurelearn.com" + i
20             lst.append(i)
21
22         else:
23             pass
24     # print(lst)
25     return lst

(三)获得课程信息

遇到的重大问题:(1)测试过程中有的内容只有属于自己的标签,有的内容用同一个标签,循环爬取时没有

将同一标签的内容柔和在一起。(比如课程性质与阶段学习里面有四个相同标签需要爬取)

解决方案:在for循环外定义空字符串,循环依次添加到一个字符串中

(2)爬取所有课程同一标签内容时,存在有的课程没有这项内容,导致产生异常

解决方案:通过try—except方法解决异常,并将一串“********”的字符填进去,防止某些在某些课程列表中

缺少数据,导致存入数据异常。

 1 def CourseList(lst, list_1):
 2
 3     for i in lst:
 4         list_ = []
 5         url = i
 6         r = requests.get(url, timeout=30)
 7
 8         r.encoding = r.apparent_encoding
 9         html = r.text
10         x = BeautifulSoup(html, ‘html.parser‘)
11
12         for i in x.find_all(‘h1‘, class_=‘m-dual-billboard__heading‘) :
13             list_.append(i.text)
14         # print(list_)
15
16         a_1 = ‘‘
17         for a in x.find_all(‘span‘, class_=‘m-key-info__content‘):
18             a_1 += a.text
19         list_.append(a_1)
20         # print(list_1)
21
22         b_1 = ‘‘
23         for b in x.find(‘div‘, class_="a-content a-content--tight").find_all(‘p‘):
24             b_1 += b.text
25         list_.append(b_1)
26         # print(list_)
27
28         c = x.find(‘section‘, class_=‘a-section a-section--alt-adjacent‘).find(‘div‘, class_=‘a-content‘)
29         list_.append(c.text)
30         # print(list_)
31
32         d = x.find(‘section‘, class_=‘a-section‘, id=‘section-dates‘).find(‘p‘, class_=‘u-responsive-alignment‘)
33         list_.append(d.text)
34         # print(list_)
35
36         e = x.find(‘section‘, class_=‘a-section‘, id=‘section-requirements‘).find(‘p‘)
37         list_.append(e.text)
38         # print(list_)
39
40         f_1 = ‘‘
41         try:
42
43             for f in x.find(‘section‘, class_=‘a-section‘, id=‘section-educators‘).find_all(‘p‘):
44                 f_1 += f.text
45             list_.append(f_1)
46         except:
47
48             list_.append(‘********‘)
49         # print(list_)
50
51         for g in x.find(‘div‘, class_="a-content a-content--contiguous-top").find(‘p‘):
52             list_.append(g)
53         list_1.append(list_)
54         # print(list_1)
55     return list_1

(四)将数据存入CSV文件

1 def write_dictionary_to_csv(list_1):
2     # print(list_1)
3     name = [‘课程名‘, ‘课程性质与阶段学习‘, ‘介绍‘, ‘话题‘, ‘开始时间‘, ‘服务对象‘, ‘老师‘, ‘课程创作人‘]
4     test = pd.DataFrame(columns=name, data=list_1)
5     test.to_csv(‘D:/test2.csv‘)

全部工程代码

  1 import requests
  2 from bs4 import BeautifulSoup
  3 import bs4
  4 import re
  5 import csv
  6 import pandas as pd
  7
  8 def getHTMLText(url, code =‘utf-8‘):
  9     try:
 10         r = requests.get(url, timeout=30)
 11         r.raise_for_status()
 12         r.encoding = r.apparent_encoding
 13         return r.text
 14     except:
 15         print("获取失败")
 16
 17 # 爬取基本列表
 18 def getCourseList(lst, html):
 19     soup = BeautifulSoup(html, ‘html.parser‘)
 20     div_href = soup.find_all(‘div‘, class_=‘m-grid-of-cards m-grid-of-cards--compact‘)
 21     cop = re.compile(‘href="(.*?)">‘)
 22     href_get = re.findall(cop, str(div_href))
 23     z = ""
 24     # print(href_get)
 25     # print(type(href_get))
 26     for i in href_get:
 27         j = ‘courses‘
 28         m = r‘" role="button‘
 29         if j in i:
 30             if m in i:
 31                 i = i.replace(m, z)
 32             # print("https://www.futurelearn.com"+i)
 33             else:
 34                 pass
 35             # print("https://www.futurelearn.com"+i)
 36             i = "https://www.futurelearn.com" + i
 37             lst.append(i)
 38
 39         else:
 40             pass
 41     # print(lst)
 42     return lst
 43
 44
 45 def CourseList(lst, list_1):
 46
 47     for i in lst:
 48         list_ = []
 49         url = i
 50         r = requests.get(url, timeout=30)
 51
 52         r.encoding = r.apparent_encoding
 53         html = r.text
 54         x = BeautifulSoup(html, ‘html.parser‘)
 55
 56         for i in x.find_all(‘h1‘, class_=‘m-dual-billboard__heading‘) :
 57             list_.append(i.text)
 58         # print(list_)
 59
 60         a_1 = ‘‘
 61         for a in x.find_all(‘span‘, class_=‘m-key-info__content‘):
 62             a_1 += a.text
 63         list_.append(a_1)
 64         # print(list_1)
 65
 66         b_1 = ‘‘
 67         for b in x.find(‘div‘, class_="a-content a-content--tight").find_all(‘p‘):
 68             b_1 += b.text
 69         list_.append(b_1)
 70         # print(list_)
 71
 72         c = x.find(‘section‘, class_=‘a-section a-section--alt-adjacent‘).find(‘div‘, class_=‘a-content‘)
 73         list_.append(c.text)
 74         # print(list_)
 75
 76         d = x.find(‘section‘, class_=‘a-section‘, id=‘section-dates‘).find(‘p‘, class_=‘u-responsive-alignment‘)
 77         list_.append(d.text)
 78         # print(list_)
 79
 80         e = x.find(‘section‘, class_=‘a-section‘, id=‘section-requirements‘).find(‘p‘)
 81         list_.append(e.text)
 82         # print(list_)
 83
 84         f_1 = ‘‘
 85         try:
 86
 87             for f in x.find(‘section‘, class_=‘a-section‘, id=‘section-educators‘).find_all(‘p‘):
 88                 f_1 += f.text
 89             list_.append(f_1)
 90         except:
 91
 92             list_.append(‘********‘)
 93         # print(list_)
 94
 95         for g in x.find(‘div‘, class_="a-content a-content--contiguous-top").find(‘p‘):
 96             list_.append(g)
 97         list_1.append(list_)
 98         # print(list_1)
 99     return list_1
100 def write_dictionary_to_csv(list_1):
101     # print(list_1)
102     name = [‘课程名‘, ‘课程性质与阶段学习‘, ‘介绍‘, ‘话题‘, ‘开始时间‘, ‘服务对象‘, ‘老师‘, ‘课程创作人‘]
103     test = pd.DataFrame(columns=name, data=list_1)
104     test.to_csv(‘D:/test2.csv‘)
105
106 def main():
107     star_url = "https://www.futurelearn.com/subjects/science-engineering-and-maths-courses"
108     infoList = []
109     list_1 = []
110     url = star_url
111     # file_name_ = ‘courses‘
112     html = getHTMLText(url)
113     getCourseList(infoList, html)
114     CourseList(infoList, list_1)
115     write_dictionary_to_csv(list_1)
116 main()

原文地址:https://www.cnblogs.com/yangbiao6/p/12078039.html

时间: 2024-10-13 14:37:43

爬取futurelearn课程网上的课程信息的相关文章

爬取拉钩全站的职位信息

爬虫学习到今天也告一段落了,利用一个项目把自己这几个月的所学的知识来做一次总结 项目所需要的知识比较全面,很适合练手, 一 程序目的 爬取拉钩全站的职位信息存入mysql和mongodb中 二 所用到的方法 一 利用selenium登录拉钩取得cookies 二 利用redis保存selenium登录拉钩取得cookies信息,维护一个cookie池 三 爬取西刺等免费IP网站,并用redis维护一个IP池 四 利用flask把cookies和ip分别映射到网页中,用requsets得到. 五

爬取知乎Python中文社区信息

爬取知乎Python中文社区信息,https://zhuanlan.zhihu.com/zimei 1 import requests 2 from urllib.parse import urlencode 3 from pyquery import PyQuery as pq 4 from pymongo import MongoClient 5 import json 6 import time 7 8 base_url = 'https://www.zhihu.com/api/v4/co

爬取豆瓣网图书TOP250的信息

爬取豆瓣网图书TOP250的信息,需要爬取的信息包括:书名.书本的链接.作者.出版社和出版时间.书本的价格.评分和评价,并把爬取到的数据存储到本地文件中. 参考网址:https://book.douban.com/top250 注意:使用正则表达式时,不要在Elements选项卡中直接查看源代码,因为那的源码可能经过Javascript渲染而与原始请求不同,而是需要从Network选项卡中查看源码. import re import json import time import request

爬取futurelearn课程网

1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 import re 5 import csv 6 #import pandas as pd 7 # r = requests.get("https://www.futurelearn.com/courses/climate-change-the-solutions,timeout = 30") 8 # r.encoding = r.apparent_enco

1-2 爬取猫眼票房网上的电影票房信息

1 piaofang.py 2 #-*- coding:utf-8 -*- 3 ''' 4 该脚本可以抓取猫眼票房网站上的电影票房数据 5 使用的数据为豆瓣上爬取的电影,见文件:doubanMovies_IMDBScore.csv 6 ''' 7 import requests 8 import lxml.html 9 import time 10 from pandas import DataFrame 11 import pandas as pd 12 13 headers={'User-A

Scrapy爬取慕课网(imooc)所有课程数据并存入MySQL数据库

爬取目标:使用scrapy爬取所有课程数据,分别为 1.课程名 2.课程简介 3.课程等级 4.学习人数 并存入MySQL数据库  (目标网址  http://www.imooc.com/course/list) 一.导出数据文件到本地 1.新建imooc项目 1 scrapy startproject imooc 2.修改 items.py,添加项目item 1 from scrapy import Item,Field 2 class ImoocItem(Item): 3 Course_na

使用selenium动态渲染爬取拉勾网上450个java职位的信息

开始这个小项目的时候要确保你的电脑中有装上selenium以及相应的浏览器驱动,还有别忘了Mongodb数据库 我们首先打开拉勾网的官网查看下基本的页面元素 当我在搜索框中输入java的时候,url如下,当我想用下面的url进行抓取的时候,我发现事情并不简单. 我点击下一页的时候发现,url并没有变化,所以并不能用最基本的抓取方法了,而改为ajax请求进行抓取 当我查看ajax请求的时候,发现事情又不简单的了,这个分页的请求带的参数时Form data,也就是表单形式的参数, 所以,拉勾网上的a

爬取今日头条历史图集将信息保存到MongDB,并且下载图片到本地

写在前面:学习<崔庆才_Python3爬虫入门到精通课程视频>动手写的小项目. (一) 分析页面 访问今日头条页面(https://www.toutiao.com/)在输入框中输入要搜索的关键字,搜索出的页面点击图集.要爬取的就是这里的所有图集. 查看页面的URL可以发现这是一个POST请求,然后我们就检查页面找到POST请求包,进行分析. 这个就是POST请求服务器返回的response 这是一个JSON格式的数据,复制下来放在解析器中查看.(使用jsonView) 可以看到data字段中的

利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :崔庆才 本节分享一下爬取知乎用户所有用户信息的 Scrapy 爬虫实战. 本节目标 本节要实现的内容有: 从一个大V用户开始,通过递归抓取粉丝列表和关注列表,实现知乎所有用户的详细信息的抓取. 将抓取到的结果存储到 MongoDB,并进行去重操作. 思路分析 我们都知道每个人都有关注列表和粉丝列表,尤其对于大V来说,粉丝和关注尤其更多. 如果我们从一个大V开始,首先可以获取他的个人信息,然后我们获取