今天,学习了爬虫的基础知识,尝试着写了本人的第一个小爬虫——爬取糗百上的热门段子。一开始自己做的是爬取1-35页,每页20条段子的作者、点赞数和内容,代码很简陋,贴在下面:

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ziv·chan' import requests
import re user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36'
headers = {
'User-Agent' : user_agent
}
i = 1
for page in range(1,36):
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
html = requests.get(url,headers=headers)
html.encoding = 'utf-8'
# print html pattern = re.compile('div class="articl.*?" alt="(.*?)"/>.*?content">\n{2,}(.*?)\n{2,}</div>.*?number">(.*?)</i>',re.S)
items = re.findall(pattern,html.text)
for item in items:
replaceBr = re.compile('<br/>')
text = re.sub(replaceBr,'\n',item[1])
print i
i+=1
print u'发布者:' + item[0].strip()
print u'内容:' + text.strip()
print u'点赞数:' + item[2].strip()
print '\n'
page+=1

后改进如下(自己对类和函数的把握还是太差,中间错了好多~~):

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ziv·chan' import requests
import re class QSBK: def __init__(self):
self.pageIndex = 1
self.user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36'
self.headers = {'User-Agent' : self.user_agent}
self.Stories = []
self.enable = False def getPagecode(self,pageIndex):
url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
html = requests.get(url,headers=self.headers)
html.encoding = 'utf-8'
pageCode = html.text
return pageCode def getPageItems(self,pageIndex):
pageCode = self.getPagecode(pageIndex)
pattern = re.compile('div class="articl.*?" alt="(.*?)"/>.*?content">\n{2,}(.*?)\n{2,}</div>.*?number">(.*?)</i>',re.S)
items = re.findall(pattern,pageCode)
pageStories = []
for item in items:
replaceBr = re.compile('<br/>')
text = re.sub(replaceBr,'\n',item[1])
pageStories.append([item[0].strip(),text.strip(),item[2].strip()])
return pageStories def loadPage(self):
if self.enable == True:
if len(self.Stories) < 2:
pageStories = self.getPageItems(self.pageIndex)
if pageStories:
self.Stories.append(pageStories)
self.pageIndex += 1 def getOneStory(self,pageStories,page):
for story in pageStories:
input = raw_input()
self.loadPage()
if input == 'Q':
self.enable = False
return
print u"第%d页\t发布人:%s\t赞:%s\n%s" %(page,story[0],story[2],story[1]) def start(self):
print u"正在读取糗事百科,按回车查看新段子,Q退出"
self.enable = True
self.loadPage()
nowpage = 0
while self.enable:
if len(self.Stories) > 0:
pageStories = self.Stories[0]
nowpage += 1
del self.Stories[0]
self.getOneStory(pageStories,nowpage) spider = QSBK()
spider.start()

学到了:

模拟浏览器请求,一定要添加‘headers’验证,正则消除空行‘ \n{2,} ’,

正则过滤多余标签:

 replaceBr = re.compile('<br/>')
text = re.sub(replaceBr,'\n',content)

需要提高的地方:类和函数,复杂的正则,编码问题。

正则表达式的有关说明:

1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。

2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。

3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

部分内容参考静觅

本人的第一篇正式博客,才发现以前学知识学得太糙了,很多都不记得了,那就重新开始,记录下点点滴滴,fighting!

Python爬虫实战(一)的更多相关文章

  1. 【图文详解】python爬虫实战——5分钟做个图片自动下载器

    python爬虫实战——图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,(没看的先去看!!)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap sho ...

  2. Python爬虫实战(4):豆瓣小组话题数据采集—动态网页

    1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据 ...

  3. Python爬虫实战(2):爬取京东商品列表

    1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...

  4. Python爬虫实战四之抓取淘宝MM照片

    原文:Python爬虫实战四之抓取淘宝MM照片其实还有好多,大家可以看 Python爬虫学习系列教程 福利啊福利,本次为大家带来的项目是抓取淘宝MM照片并保存起来,大家有没有很激动呢? 本篇目标 1. ...

  5. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  6. Python爬虫实战七之计算大学本学期绩点

    大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的 ...

  7. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  8. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  9. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  10. Python爬虫实战三之实现山东大学无线网络掉线自动重连

    综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...

随机推荐

  1. Vim的多窗口模式管理

    Vim中的多窗口打开 vim中,默认的多窗口打开,是横向分割窗口. 进入vim编辑器以后,可以通过new命令,新建一个子窗口 :new  “新建一个未命名窗口 :new name "新建一个 ...

  2. NYOJ-569最大公约数之和

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=569 此题目可以用筛选法的思想来做,但是用到一个欧拉函数 gcd(1,12)=1,gcd( ...

  3. WIN7 64位上 MYSQL的ODBC一些个人理解

    最近电脑中毒了,无奈之下把32位的xp换成了64位的win7,无聊耗时的搭完开发环境,装了vs6.0(忽略掉一切的不兼容),装完64位的mysql(“mysql-5.6.10-winx64.zip”) ...

  4. 关于 submit 按钮的 onclick 验证事件,第一次验证失败,第二次 submit 按钮失效的原因解析

    今天在做一个生成订单的简单验证页面 主要功能:实现点击提交按钮后,先在页面上用JavaScript验证信息是否输入完全,不完全不允许提交,待输入完全后,才可以提交 页面:如下页面,可以看到,当文本框有 ...

  5. 跨域信息传递postMessage

    var sendToParent = function(event, data, listener) { var message = { event: event, data: data, liste ...

  6. java反射新的应用

    利用java反射动态修改运行中对象的私有final变量,不管有没有get方法获取这个私有final变量. spring aop 本质是cglib,动态代理 可以做很多事情 query.addCrite ...

  7. Code First研究学习1_Reverse Enginner Code First

    最近因为公司需要,自己开始研究Code First,之前还是听说过这个,也知道是代码优先的意思!至于具体怎么的代码优先,我的理解如下! 在听说code  first的时候,心里也就觉得怪了,是怎么将M ...

  8. iOS中使用图片作为颜色的背景图

    Objective-C: [UIColor colorWithPatternImage:[UIImage imageNamed:@"jpg"]]; Swift: UIColor(p ...

  9. C#结课报告

    Revision History Date Issue Description Author 18/May/2015 v1.0 Initial creation 邓彪翼 模拟图书馆的查询系统 1.ob ...

  10. phpMyAdmim无法打开或空白页面问题解决

    环境:windows环境 安装方式:appserv 安装完appserv之后,发现phpMyAdmin无法打开,具体表现为输入root用户名和密码之后长时间无法进入管理页面或进入之后一片空白.这种情况 ...