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 相关文章推荐
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
pyqt5简介及安装方法介绍
Jan 31 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
Django中Middleware中的函数详解
Jul 18 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python实现处理mysql结果输出方式
Apr 09 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
php简单日历函数
2015/10/28 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
python设置中文界面实例方法
2020/10/27 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
日语专业个人的求职信
2013/12/03 职场文书
抽奖活动主持词
2014/03/31 职场文书
环境卫生倡议书
2014/08/29 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript