这是小白学习笔记....大神勿喷。

本次学习糗事百科的网络爬虫。

http://blog.csdn.net/pleasecallmewhy/article/details/8932310

因为那个糗事百科网页改版了,content类中已经没有title...所以源码也有所改动。

所以找到一个改进版的

http://blog.csdn.net/u011350541/article/details/52264073

感谢以上作者的无私分享。

改进源码:

# -*- coding: utf-8 -*-      import urllib2
import urllib
import re
import thread
import time
import json  #----------- 加载处理糗事百科 -----------
class Spider_Model:      def __init__(self):      self.page = 1      self.pages = []      self.enable = False      # 将所有的段子都扣出来,添加到列表中并且返回列表      def GetPage(self,page):      myUrl = "http://m.qiushibaike.com/hot/page/" + page      user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'     headers = { 'User-Agent' : user_agent }     req = urllib2.Request(myUrl, headers = headers)     myResponse = urllib2.urlopen(req)    myPage = myResponse.read()  # print myPage  unicodePage = myPage.decode("utf-8")  # 找出所有class="content"的div标记      #re.S是任意匹配模式,也就是.可以匹配换行符      myItems = re.findall('<div.*?class="content">(.*?)</div>',unicodePage,re.S)  items = []  # print myItems  # print str(myItems).decode('string_escape')  # print json.dumps(myItems, encoding="UTF-8", ensure_ascii=False)  # for item in myItems:  #     # item 中第一个是div的标题,也就是时间  #     # item 中第二个是div的内容,也就是内容  #     items.append([item[0].replace("\n",""),item[1].replace("\n","")])  # print myItems  # print str(myItems).decode('string_escape')  # print str(myItems).encode("UTF-8")  # print myItems[0]  return myItems  # 用于加载新的段子      def LoadPage(self):      # 如果用户未输入quit则一直运行      while self.enable:      # 如果pages数组中的内容小于2个  # print len(self.pages)  if len(self.pages) < 2:  try:      # 获取新的页面中的段子们      myPage = self.GetPage(str(self.page))  self.page += 1      self.pages.append(myPage)  except:      print '无法链接糗事百科!'      else:      time.sleep(5)  # def ShowPage(self,nowPage,page):  #     print u'第%d页' % page,json.dumps(nowPage, encoding="UTF-8", ensure_ascii=False)  def ShowPage(self,nowPage,page):  i = 0  # print len(nowPage)  for i in range(0,len(nowPage)):  if i < len(nowPage):  print u'第%d页,第%d个故事' %(page,i) ,nowPage[i].replace("\n\n","")  i += 1  else:  break  def Start(self):      self.enable = True      page = self.page  print u'正在加载中请稍候......'  # 新建一个线程在后台加载段子并存储      thread.start_new_thread(self.LoadPage,())  #----------- 加载处理糗事百科 -----------      while self.enable:      # 如果self的page数组中存有元素      if self.pages:      nowPage = self.pages[0]  del self.pages[0]  self.ShowPage(nowPage,page)      page += 1      #----------- 程序的入口处 -----------
print u"""
---------------------------------------   程序:糗百爬虫   版本:0.3   作者:why   日期:2014-06-03   语言:Python 2.7   操作:输入quit退出阅读糗事百科   功能:按下回车依次浏览今日的糗百热点
---------------------------------------
"""    print u'请按下回车浏览今日的糗百内容:'
raw_input(' ')
myModel = Spider_Model()
myModel.Start()

  

这个源码是可以跑的,但是我跑有点问题。

会出现乱码。

接下来学习并尝试找出原因。

#重新跑了几次后

再跑就不会出现乱码了....好奇怪

但出现了

UnicodeEncodeError: 'gbk' codec can't encode character u'\u22ef' in position 13: illegal multibyte sequence
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr

对于这种错误,查了一下,发现

http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/

这个帖子讲得很详细。

PS:编码知识

再贴一个讲计算机编码的知乎帖子~

https://www.zhihu.com/question/23374078

讲python编码的帖子

http://lukejin.iteye.com/blog/598303

简而言之:

unicode是信源编码,对字符集数字化;

utf8是信道编码,为更好的存储和传输。

又跑了几次,又出现乱码....

我一步步进行调试,可是却是可以正常运行的,每一页都可以显示出来。

但是跑起来却是正常显示几页后,就乱码了。

不知道为什么....

///

1.正则表达式

不展开学习,一次性看完会有点乱。

就说一下这个源码里面的。

因为要找出百科里面的段子,所以看了一下网页的html源代码。是这样的。

所以我们就要找<div class = "content">....</div>中间的东西。

就要用到re.findall()

用法:re.findall(pattern, string[, flags]):  返回列表。

举个栗子,eg:

relink为搜索条件

info为搜索目标

然后本次源码如下:

myItems = re.findall('<div.*?class="content">(.*?)</div>',unicodePage,re.S)

意思就是:

在unicodePage中用'<div.*?class="content">(.*?)</div>'这个正则表达式来搜索一切

匹配我们的条件<div class = "content">....</div>的部分,并把搜索结果放进myItems列表中。

2.print的问题

主要针对这条

print u'第%d页,第%d个故事' %(page,i) ,nowPage[i].replace("\n\n","")

%d为占位符,就是先占着一个位置,后面再填充回去。

填充内容就在后面的()里面,就是%d对应page,第二个%d对应 i 。

然后接着输出nowPage[i].replace("\n\n","")

.replace()表示将nowPage[i]里的两个换行符"\n\n"替换成没有东西" "。

这样做的原因是 每行可以显示一则段子。

/

经过调试

大致了解整个源码怎么运行...

后台有一个加载网页的线程LoadPage(),用len(self.pages)是否大于2来进行判断是否加载存储网页,每次只加载一个网页,就是20个段子。

主进程则是显示网页的作用,把第一次加载下来的网页放进列表nowpage里,然后删除self.pages,使它的长度len(self.pages)又回复到1。

接着,后面的线程又可以进行第二次加载,然后在cmd显示出第一次加载的网页段子。

转载于:https://www.cnblogs.com/IrisLee/p/5808866.html

Python 爬虫学习2相关推荐

  1. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

  2. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  3. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  4. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  5. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  6. 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. 从入门到入土:Python爬虫学习|实例练手|爬取猫眼榜单|Xpath定位标签爬取|代码

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  10. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. [C++] 指向常量的指针 VS 指针类型的常量
  2. Ubunt_配置_start
  3. 为什么Spring Boot项目引入依赖的时候可以不指定依赖的版本号
  4. 畅享音视频技术饕餮盛宴,就在LiveVideoStackCon 上海站
  5. 看似杂乱无序的随机运动.....
  6. 【bfs】神殿(jzoj 2296)
  7. 安装 SharePoint 2013 Foundation
  8. Spring-tx-TransactionDefinition/TransactionAttribute
  9. php内容模型概念,方便新建各种类型表
  10. DHCP+NAT+IP隧道
  11. bootstrap按钮组(二)
  12. Zabbix之Python发送邮件
  13. Atitit 高性能架构之道 attilax著 艾龙 著 1. 应用服务与数据隔离 2 2. 负载均衡你问题 2 2.1. 用户的请求由谁来转发到到具体的应用服务器 2 2.2. 有什么转发的算法
  14. 查看最大的10个文件
  15. Excel高级函数应用总结
  16. 统计学常用概念:T检验、F检验、卡方检验、P值、自由度
  17. 数据库查询时报错com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: ‘1.7725000000E10‘ in column ‘17‘ is outs
  18. MongoDB数据库的下载, 安装与配置
  19. windows server 2012 r2 搭建企业文件共享存储
  20. 理解梅尔频谱(mel spectrogram)

热门文章

  1. 会计电算化常考题目二
  2. UVA 694-The Collatz Sequence
  3. 奖金67万!2020 中国计算机学会大数据与计算智能大赛启动!
  4. 太赞了!性能超越谷歌MobileNet!ECCV2020重磅推出MobileNeXt !
  5. 收藏 | Python必备技能之 25个Matplotlib常用代码!
  6. 重磅汇总!2015-2019学硕国家线走势情况!
  7. 基于注意力机制的seq2seq网络
  8. 算法训练和模型部署如何避免多次重写数据预处理代码
  9. 从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写
  10. 关于分辨率和地图打印的一些问题