技术选型

下载器是Requests

解析使用的是正则表达式

效果图:

准备好各个包

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

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

1.requests下载页面

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

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



就像下面这样:

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

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

2.except RequestException:捕捉异常

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

  1. try:
  2. response = requests.get(url)
  3. if response.status_code == 200:
  4. return response.content.decode("utf-8")
  5. return None
  6. except RequestException:
  7. return None

更多异常介绍官网

http://www.python-requests.org/en/master/_modules/requests/exceptions/#RequestException

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

代码如下:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. from requests.exceptions import RequestException
  4. def get_one_page(url):
  5. try:
  6. response = requests.get(url)
  7. if response.status_code == 200:
  8. return response.content.decode("utf-8")
  9. return None
  10. except RequestException:
  11. return None
  12. def main():
  13. url = 'https://coding.imooc.com/?page=1'
  14. html = get_one_page(url)
  15. print(html)
  16. if __name__ == '__main__':
  17. main()

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

接着,就是解析页面

3.正则表达式介绍

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

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

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

参数:

pattern:编译过的正则表达式

html:用response.content.decode("utf-8")得到的页面内容

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

完整代码:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import re
  4. from requests.exceptions import RequestException
  5. def get_one_page(url):
  6. try:
  7. response = requests.get(url)
  8. if response.status_code == 200:
  9. return response.content.decode("utf-8")
  10. return None
  11. except RequestException:
  12. return None
  13. def parse_one_page(html):
  14. pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">'
  15. '(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>'
  16. '(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>'
  17. '(.*?)</p>.*?</div>',re.S)
  18. items = re.findall(pattern,html)
  19. for item in items:
  20. yield {
  21. 'teacher': item[0],
  22. 'title': item[1],
  23. 'grade': item[2],
  24. 'people':item[3],
  25. 'score': item[4],
  26. 'describe': item[5]
  27. }
  28. def main():
  29. url = 'https://coding.imooc.com/?page=1'
  30. html = get_one_page(url)
  31. for item in parse_one_page(html):
  32. print(item)
  33. if __name__ == '__main__':
  34. main()

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

4.保存文件操作

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

代码如下:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import re
  4. import json
  5. from requests.exceptions import RequestException
  6. def get_one_page(url):
  7. try:
  8. response = requests.get(url)
  9. if response.status_code == 200:
  10. return response.content.decode("utf-8")
  11. return None
  12. except RequestException:
  13. return None
  14. def parse_one_page(html):
  15. pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">'
  16. '(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>'
  17. '(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>'
  18. '(.*?)</p>.*?</div>',re.S)
  19. items = re.findall(pattern,html)
  20. for item in items:
  21. yield {
  22. 'teacher': item[0],
  23. 'title': item[1],
  24. 'grade': item[2],
  25. 'people':item[3],
  26. 'score': item[4],
  27. 'describe': item[5]
  28. }
  29. def write_to_file(content):
  30. with open('imooctest.txt','a',encoding='utf-8') as f:
  31. f.write(json.dumps(content,ensure_ascii=False)+'\n')
  32. f.close()
  33. def main():
  34. url = 'https://coding.imooc.com/?page=1'
  35. html = get_one_page(url)
  36. for item in parse_one_page(html):
  37. print(item)
  38. write_to_file(item)
  39. if __name__ == '__main__':
  40. main()

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

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

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

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

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

主函数可以类似这样:

for i in range(4):

main(i+1)

完整代码:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import re
  4. import json
  5. from requests.exceptions import RequestException
  6. from multiprocessing import Pool
  7. def get_one_page(url):
  8. try:
  9. response = requests.get(url)
  10. if response.status_code == 200:
  11. return response.content.decode("utf-8")
  12. return None
  13. except RequestException:
  14. return None
  15. def parse_one_page(html):
  16. pattern = re.compile('<div class="box">.*?lecturer-info.*?<span>(.*?)</span>.*?shizhan-intro-box.*?title=".*?">'
  17. '(.*?)</p>.*?class="grade">(.*?)</span>.*?imv2-set-sns.*?</i>'
  18. '(.*?)</span>.*?class="big-text">(.*?)</p>.*?shizan-desc.*?>'
  19. '(.*?)</p>.*?</div>',re.S)
  20. items = re.findall(pattern,html)
  21. for item in items:
  22. yield {
  23. 'teacher': item[0],
  24. 'title': item[1],
  25. 'grade': item[2],
  26. 'people':item[3],
  27. 'score': item[4],
  28. 'describe': item[5]
  29. }
  30. def write_to_file(content):
  31. with open('imoocAll.txt','a',encoding='utf-8') as f:
  32. f.write(json.dumps(content,ensure_ascii=False)+'\n')
  33. f.close()
  34. def main(page):
  35. url = 'https://coding.imooc.com/?page='+str(page)
  36. html = get_one_page(url)
  37. # parse_one_page(html)
  38. # print(html)
  39. for item in parse_one_page(html):
  40. print(item)
  41. write_to_file(item)
  42. if __name__ == '__main__':
  43. pool = Pool()
  44. pool.map(main,[i+1 for i in range(4)])
  45. # for i in range(4):
  46. # main(i+1)

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

简单python爬虫案例(爬取慕课网全部实战课程信息)的更多相关文章

  1. Python爬虫之爬取慕课网课程评分

    BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...

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

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

  3. Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

  4. Python爬虫,爬取腾讯漫画实战

    先上个爬取的结果图 最后的结果为每部漫画按章节保存 运行环境 IDE VS2019 Python3.7 先上代码,代码非常简短,包含空行也才50行,多亏了python强大的库 import os im ...

  5. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  6. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  7. 网络爬虫之定向爬虫:爬取当当网2015年图书销售排行榜信息(Crawler)

    做了个爬虫,爬取当当网--2015年图书销售排行榜 TOP500 爬取的基本思想是:通过浏览网页,列出你所想要获取的信息,然后通过浏览网页的源码和检查(这里用的是chrome)来获相关信息的节点,最后 ...

  8. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  9. Python爬虫之爬取站内所有图片

    title date tags layut Python爬虫之爬取站内所有图片 2018-10-07 Python post 目标是 http://www.5442.com/meinv/ 如需在非li ...

随机推荐

  1. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  2. Java 并发:学习Thread 类

    Java 中 Thread类 的各种操作与线程的生命周期密不可分,了解线程的生命周期有助于对Thread类中的各方法的理解.一般来说,线程从最初的创建到最终的消亡,要经历创建.就绪.运行.阻塞 和 消 ...

  3. Codeforces 976F

    题意略. 思路:为了保证每个点都有至少k条边覆盖,我们可以让二分图的左半边与源点s相连,连容量为indegree[i] - k的边(如果正着想不好想,我们可以想它的反面, 限制它反面的上限,从而保证我 ...

  4. 栅格数据的批量镶嵌(附Python脚本)

    栅格数据的批量镶嵌(附Python脚本) 博客小序:在数据处理的过程中,会遇到需要大量镶嵌的情况,当数据较多时手动镶嵌较为麻烦,自己最近对分省的DEM数据进行镶嵌,由于利用python进行镶嵌较为方便 ...

  5. C#开发BIMFACE系列10 服务端API之获取文件下载链接

    系列目录     [已更新最新开发文章,点击查看详细] 通过BIMFACE控制台或者调用服务接口上传文件成功后,默认场景下需要下载该源文件,下载文件一般需要知道文件的下载链接即可.BIMACE平台提供 ...

  6. matplotlib 库的使用

    1.问题描述: 在学习kaggle经典学习项目Titanic,进行数据可视化处理时,对于每个特征进行相关性分析(也就是绘制pearson correlation heatmap )热力相关性矩阵时, ...

  7. 牛客小白月赛6 E 对弈 思维

    链接:https://www.nowcoder.com/acm/contest/136/E来源:牛客网 题目描述 善弈者谋势,不善弈者谋子.                               ...

  8. webpack多页应用架构系列(一):一步一步解决架构痛点

    这系列文章讲什么? 前些时间,写过一个项目,前后端分离,没有借助任何框架,项目页面特别的多,页面都是html直接写的,许多公共html,写了好多处,有一个地方需要改就得改好多地方,js也是随意写,每个 ...

  9. WS的发布与调用

    WebService—CXF整合Spring实现接口发布和调用过程  https://www.cnblogs.com/domi22/p/8094517.html   spring 集成cxf 第二弹( ...

  10. 关于git使用的几点理解

    1.git为分布式的版本控制系统,有远程仓库和本地仓库,远程仓库和本地仓库之间建立关联关系后,可将本地仓库的更新push(相当于是内容同步)到远程仓库进行保存,远程仓库的作用相当于一个最终代码备份的地 ...