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 相关文章推荐
用Python写一个无界面的2048小游戏
May 24 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
python socket 聊天室实例代码详解
Nov 14 Python
python创建子类的方法分析
Nov 28 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Python能做什么
Jun 02 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
Python爬虫代理池搭建的方法步骤
Sep 28 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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
php中如何执行linux命令详解
2018/11/06 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
Python检测生僻字的实现方法
2016/10/23 Python
Python操作Excel之xlsx文件
2017/03/24 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
Python3生成手写体数字方法
2018/01/30 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
python脚本第一行如何写
2020/08/30 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
机关门卫岗位职责
2013/12/30 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
甜品店创业计划书
2014/09/21 职场文书
签证工作证明模板
2015/06/15 职场文书
python获取带有返回值的多线程
2022/05/02 Python