技术选型

下载器是Requests
解析使用的是正则表达式
效果图:

准备好各个包

# -*- coding: utf-8 -*-
import requests #第三方下载器
import re #正则表达式
import json #格式化数据用
from requests.exceptions import RequestException #做异常处理
from multiprocessing import Pool #使用多进程

开始编写代码,new一个py文件

1.requests下载页面

response =requests.get(url)
url:当前需要爬取的链接
requests.get()获取页面

这里需要注意编码的问题;

就像下面这样:

  response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return None

这样返回的就是一个string类型的数据

2.except RequestException:捕捉异常

为了代码更加健壮,我们在可能发生异常的地方做异常捕获

  try:response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return Noneexcept RequestException:return None

更多异常介绍官网
http://www.python-requests.org/en/master/_modules/requests/exceptions/#RequestException

到这里,我们就可以编写main方法进行调用程序了

代码如下:

# -*- coding: utf-8 -*-
import requests
from requests.exceptions import RequestExceptiondef get_one_page(url):try:response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return Noneexcept RequestException:return Nonedef main():url = 'https://coding.imooc.com/?page=1'html = get_one_page(url)print(html)if __name__ == '__main__':main()

这样就可以把页面下载下来了

接着,就是解析页面

3.正则表达式介绍

re.compile()方法:编译正则表达式

通过一个正则表达式字符串 编译生成 一个字符串对象

re.findall(pattern,html)方法:找到所有匹配的内容

参数:
pattern:编译过的正则表达式
html:用response.content.decode("utf-8")得到的页面内容

def parse_one_page(html):pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">''(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>''(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>''(.*?)</p>.*?</div>',re.S)items = re.findall(pattern,html)for item in items:#格式化每一条数据为字典类型的数据yield {'teacher': item[0],'title': item[1],'grade': item[2],'people':item[3],'score': item[4],'describe': item[5]}

完整代码:

# -*- coding: utf-8 -*-
import requests
import re
from requests.exceptions import RequestExceptiondef get_one_page(url):try:response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return Noneexcept RequestException:return Nonedef parse_one_page(html):pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">''(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>''(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>''(.*?)</p>.*?</div>',re.S)items = re.findall(pattern,html)for item in items:yield {'teacher': item[0],'title': item[1],'grade': item[2],'people':item[3],'score': item[4],'describe': item[5]}def main():url = 'https://coding.imooc.com/?page=1'html = get_one_page(url)for item in parse_one_page(html):print(item)if __name__ == '__main__':main()

保存解析后的数据到本地文件

4.保存文件操作

with open('imooctest.txt','a',encoding='utf-8') as fwith as :打开自动闭合的文件并设立对象f进行操作参数:imooctest.txt:文件名字a:追加方式encoding:编码格式 不这样设置可能保存的数据会乱码f.write(json.dumps(content,ensure_ascii =False)+'\n')json.dumps:将刚才被格式化后的字典转为字符串ensure_ascii =False  不这样设置可能保存的数据会乱码+'\n' 每条数据为一行

代码如下:

# -*- coding: utf-8 -*-
import requests
import re
import json
from requests.exceptions import RequestExceptiondef get_one_page(url):try:response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return Noneexcept RequestException:return Nonedef parse_one_page(html):pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">''(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>''(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>''(.*?)</p>.*?</div>',re.S)items = re.findall(pattern,html)for item in items:yield {'teacher': item[0],'title': item[1],'grade': item[2],'people':item[3],'score': item[4],'describe': item[5]}def write_to_file(content):with open('imooctest.txt','a',encoding='utf-8') as f:f.write(json.dumps(content,ensure_ascii=False)+'\n')f.close()def main():url = 'https://coding.imooc.com/?page=1'html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item)if __name__ == '__main__':main()

5.爬取所有页面并以多进程方式

分析页面,会发现,需要爬取的页面如下

https://coding.imooc.com/?page=1
https://coding.imooc.com/?page=2
https://coding.imooc.com/?page=3
https://coding.imooc.com/?page=4

我们需要构造这种格式的页面

url = 'https://coding.imooc.com/?page='+str(page)

主函数可以类似这样:
for i in range(4):
main(i+1)
完整代码:

# -*- coding: utf-8 -*-
import requests
import re
import json
from requests.exceptions import RequestException
from multiprocessing import Pooldef get_one_page(url):try:response = requests.get(url)if response.status_code == 200:return response.content.decode("utf-8")return Noneexcept RequestException:return Nonedef parse_one_page(html):pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">''(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>''(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>''(.*?)</p>.*?</div>',re.S)items = re.findall(pattern,html)for item in items:yield {'teacher': item[0],'title': item[1],'grade': item[2],'people':item[3],'score': item[4],'describe': item[5]}def write_to_file(content):with open('imoocAll.txt','a',encoding='utf-8') as f:f.write(json.dumps(content,ensure_ascii=False)+'\n')f.close()def main(page):url = 'https://coding.imooc.com/?page='+str(page)html = get_one_page(url)# parse_one_page(html)# print(html)for item in parse_one_page(html):print(item)write_to_file(item)if __name__ == '__main__':pool = Pool()pool.map(main,[i+1 for i in range(4)])# for i in range(4):#     main(i+1)

到这里,我们就能够把慕课网上面的全部实战课程的信息爬取下来,拿到这些数据,你就可以做自己喜爱的分析了

转载于:https://www.cnblogs.com/liuge36/p/9882871.html

简单python爬虫案例(爬取慕课网全部实战课程信息)相关推荐

  1. python爬虫案例-爬取当当网数据

    输入关键字,爬取当当网中商品的基本数据,代码如下: 1 # Author:K 2 import requests 3 from lxml import etree 4 from fake_userag ...

  2. Python爬虫深入 爬取当当网商品基本信息

    Python爬虫深入 爬取当当网商品基本信息 使用scrapy爬虫框架,创建爬虫项目. 基本命令: scrapy startproject dangdang scrapy genspider -l s ...

  3. python爬虫之--爬取当当网商品信息

                                    python爬虫之--爬取当当网图商品信息                                               ...

  4. 爬虫练习- 爬取转转网二手市场商品信息

    前言: 使用多进程爬虫方法爬取转转网二手市场商品信息,并将爬取的数据存储于MongoDB数据库中 本文为整理代码,梳理思路,验证代码有效性--2020.1.18 环境: Python3(Anacond ...

  5. python爬虫之爬取百度网盘

    爬虫之爬取百度网盘(python) #coding: utf8 """ author:haoning create time: 2015-8-15 "" ...

  6. Python爬虫 离线爬取当当网畅销书Top500的图书信息

    本实例还有另外的在线爬虫实现,有兴趣可点击在线爬取当当网畅销书Top500的图书信息 爬虫说明 1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法) 2.爬虫 ...

  7. Python爬虫 在线爬取当当网畅销书Top500的图书信息

    本实例还有另外的离线爬虫实现,有兴趣可点击离线爬取当当网畅销书Top500的图书信息 爬虫说明 1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法) 2.爬虫 ...

  8. python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...

  9. 使用scrapy爬虫框架爬取慕课网全部课程信息

    爬取的链接: http://www.imooc.com/course/list 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 1.安装scrapy模块 pip in ...

最新文章

  1. linux traceroute 命令 查看路由表
  2. Matlab | 空间域水印技术:LSB(Least Significant Bit):计算峰值信噪比PSNR(matlab源代码)
  3. 在Windows平台上安装Node.js及NPM模块管理
  4. 递归法实现库函数strlen
  5. py文件转exe时包含paramiko模块出错解决方法
  6. Oracle区分中文和英文,oracle中中英文段落划分实现
  7. html5自动打印图片,html2canvas生成清晰的图片实现打印代码示例
  8. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
  9. 信贷三类业务风险如何把控
  10. 卸载驱动出现:rmmod: can't change directory to '/lib/modules': No such file or directory
  11. INNO SETUP卸载程序中加入自定义窗体
  12. 通过图标来识别网站用户指纹
  13. XJad反编译工具下载链接及使用教程
  14. 匈牙利算法(Hungarian algorithm)
  15. php强类型作用,强类型php性能很彪悍
  16. springcloud常见问题
  17. python开启显卡_python查看显卡gpu信息
  18. android 苹果开发进度,IOS 锁屏音乐信息显示(进度条,歌名等信息。)
  19. File “/etc/oratab“ is not accessible.
  20. 论文---overcoming catastrophic forgetting in neural networks

热门文章

  1. 字节跳动社招面试记录,java异常处理关键字
  2. 有个码龄10年的程序员跟我说:“他编程从来不用鼠标”,我说:
  3. mysql insert 运算_MySql insert插入操作的3个小技巧分享
  4. html5 手机端分页,哪位大神可以提供个移动端h5下拉分页的方法
  5. moba寻路_MOBA代号105:道具收费 加入自动寻路等MMO元素
  6. php中时间怎么自动实现的,php怎么实现服务器时间自动跳动
  7. java 线程的可重入锁_java 多线程-可重入锁
  8. 三元一次方程组步骤_人教版数学七年级下册8.4三元一次方程组的解法精讲
  9. qpython3l使用手册_qpython3l怎么用
  10. linux命令th,Linux 第13天 文本操作命令