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命令行交互提示符的方法
Jan 14 Python
python查询sqlite数据表的方法
May 08 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
python实现定时提取实时日志程序
Jun 22 Python
python3 爬取图片的实例代码
Nov 06 Python
python根据url地址下载小文件的实例
Dec 18 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
Python2 与Python3的版本区别实例分析
Mar 30 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 Python
python中count函数知识点浅析
Dec 17 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
php数组删除元素示例
2014/03/21 PHP
php中JSON的使用方法
2015/04/30 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
动态创建类实例代码
2009/10/07 Python
python 实时遍历日志文件
2016/04/12 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
幼儿发展评估方案
2014/06/11 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
简爱读书笔记
2015/06/26 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers