Python 爬虫学习笔记之单线程爬虫


Posted in Python onSeptember 21, 2016

介绍

本篇文章主要介绍如何爬取麦子学院的课程信息(本爬虫仍是单线程爬虫),在开始介绍之前,先来看看结果示意图

Python 爬虫学习笔记之单线程爬虫

怎么样,是不是已经跃跃欲试了?首先让我们打开麦子学院的网址,然后找到麦子学院的全部课程信息,像下面这样

Python 爬虫学习笔记之单线程爬虫

这个时候进行翻页,观看网址的变化,首先,第一页的网址是 http://www.maiziedu.com/course/list/, 第二页变成了 http://www.maiziedu.com/course/list/all-all/0-2/, 第三页变成了 http://www.maiziedu.com/course/list/all-all/0-3/ ,可以看到,每次翻一页,0后面的数字就会递增1,然后就有人会想到了,拿第一页呢?我们尝试着将 http://www.maiziedu.com/course/list/all-all/0-1/ 放进浏览器的地址栏,发现可以打开第一栏,那就好办了,我们只需要使用 re.sub() 就可以很轻松的获取到任何一页的内容。获取到网址链接之后,下面要做的就是获取网页的源代码,首先右击查看审查或者是检查元素,就可以看到以下界面

Python 爬虫学习笔记之单线程爬虫

找到课程所在的位置以后,就可以很轻松的利用正则表达式将我们需要的内容提取出来,至于怎么提取,那就要靠你自己了,尝试着自己去找规律才能有更大的收获。如果你实在不知道怎么提取,那么继续往下,看我的源代码吧

实战源代码

# coding=utf-8
 import re
 import requests
 import sys
 reload(sys)
 sys.setdefaultencoding("utf8")
 
 
 class spider():
   def __init__(self):
     print "开始爬取内容。。。"
 
    def changePage(self, url, total_page):
     nowpage = int(re.search('/0-(\d+)/', url, re.S).group(1))
     pagegroup = []
 
     for i in range(nowpage, total_page + 1):
       link = re.sub('/0-(\d+)/', '/0-%s/' % i, url, re.S)
       pagegroup.append(link)
 
     return pagegroup
 
def getsource(self, url):
  html = requests.get(url)
  return html.text
 
def getclasses(self, source):
  classes = re.search('<ul class="zy_course_list">(.*?)</ul>', source, re.S).group(1)
  return classes
 
def geteach(self, classes):
  eachclasses = re.findall('<li>(.*?)</li>', classes, re.S)
  return eachclasses
 
def getinfo(self, eachclass):
  info = {}
  info['title'] = re.search('<a title="(.*?)"', eachclass, re.S).group(1)
  info['people'] = re.search('<p class="color99">(.*?)</p>', eachclass, re.S).group(1)
  return info
 
def saveinfo(self, classinfo):
  f = open('info.txt', 'a')
 
  for each in classinfo:
    f.writelines('title : ' + each['title'] + '\n')
    f.writelines('people : ' + each['people'] + '\n\n')
 
  f.close()
 
 
if __name__ == '__main__':
 
   classinfo = []
   url = 'http://www.maiziedu.com/course/list/all-all/0-1/'
   maizispider = spider()
   all_links = maizispider.changePage(url, 30)
   for each in all_links:
     htmlsources = maizispider.getsource(each)
     classes = maizispider.getclasses(htmlsources)
     eachclasses = maizispider.geteach(classes)
 
     for each in eachclasses:
       info = maizispider.getinfo(each)
       classinfo.append(info)
 
   maizispider.saveinfo(classinfo)

以上代码并不难懂,基本就是正则表达式的使用,然后直接运行就可以看到开头我们的截图内容了,由于这是单线程爬虫,所以运行速度感觉有点慢,接下来还会继续更新多线程爬虫。

应小伙伴们的要求,下面附上requests爬虫库的安装和简单示例

首先安装pip包管理工具,下载get-pip.py. 我的机器上安装的既有python2也有python3。

安装pip到python2:

python get-pip.py

安装到python3:

python3 get-pip.py

pip安装完成以后,安装requests库开启python爬虫学习。

安装requests

pip3 install requests

我使用的python3,python2可以直接用pip install requests.

入门例子

import requests

html=requests.get("http://gupowang.baijia.baidu.com/article/283878")
html.encoding='utf-8'
print(html.text)

第一行引入requests库,第二行使用requests的get方法获取网页源代码,第三行设置编码格式,第四行文本输出。
把获取到的网页源代码保存到文本文件中:

import requests
import os

html=requests.get("http://gupowang.baijia.baidu.com/article/283878")
html_file=open("news.txt","w")
html.encoding='utf-8'
print(html.text,file=html_file)
Python 相关文章推荐
pygame播放音乐的方法
May 19 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
用python实现k近邻算法的示例代码
Sep 06 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
pandas 空数据处理方法详解
Nov 02 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
Python命令行click参数用法解析
Dec 19 Python
Python数据持久化存储实现方法分析
Dec 21 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
Python 爬虫学习笔记之正则表达式
Sep 21 #Python
Python简单实现安全开关文件的两种方式
Sep 19 #Python
Python打包可执行文件的方法详解
Sep 19 #Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 #Python
利用Python画ROC曲线和AUC值计算
Sep 19 #Python
Python文件与文件夹常见基本操作总结
Sep 19 #Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 #Python
You might like
php中explode函数用法分析
2014/11/15 PHP
PHP积分兑换接口实例
2015/02/09 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
List Installed Hot Fixes
2007/06/12 Javascript
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
python dataframe astype 字段类型转换方法
2018/04/11 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Sanic框架流式传输操作示例
2018/07/18 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
护理学中专毕业生求职信
2013/11/11 职场文书
计算机学生求职信范文
2014/01/30 职场文书
小学新教师培训方案
2014/02/03 职场文书
教师师德承诺书
2014/03/26 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python