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

项目内容:

用Python写的糗事百科的网络爬虫。

使用方法:

新建一个Bug.py文件,然后将代码复制到里面后,双击运行。

程序功能:

在命令提示行中浏览糗事百科。

原理解释:

首先,先浏览一下糗事百科的主页:http://www.qiushibaike.com/hot/page/1

可以看出来,链接中page/后面的数字就是对应的页码,记住这一点为以后的编写做准备。

然后,右击查看页面源码:

观察发现,每一个段子都用div标记,其中class必为content,title是发帖时间,我们只需要用正则表达式将其“扣”出来就可以了。

明白了原理之后,剩下的就是正则表达式的内容了,可以参照这篇博文:

http://blog.csdn.net/wxg694175346/article/details/8929576

运行效果:

  1. # -*- coding: utf-8 -*-
  2. #---------------------------------------
  3. # 程序:糗百爬虫
  4. # 版本:0.2
  5. # 作者:why
  6. # 日期:2013-05-15
  7. # 语言:Python 2.7
  8. # 操作:输入quit退出阅读糗事百科
  9. # 功能:按下回车依次浏览今日的糗百热点
  10. # 更新:解决了命令提示行下乱码的问题
  11. #---------------------------------------
  12.  
  13. import urllib2
  14. import urllib
  15. import re
  16. import thread
  17. import time
  18.  
  19. #----------- 处理页面上的各种标签 -----------
  20. class HTML_Tool:
  21. # 用非 贪婪模式 匹配 \t 或者 \n 或者 空格 或者 超链接 或者 图片
  22. BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)")
  23.  
  24. # 用非 贪婪模式 匹配 任意<>标签
  25. EndCharToNoneRex = re.compile("<.*?>")
  26.  
  27. # 用非 贪婪模式 匹配 任意<p>标签
  28. BgnPartRex = re.compile("<p.*?>")
  29. CharToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)")
  30. CharToNextTabRex = re.compile("<td>")
  31.  
  32. # 将一些html的符号实体转变为原始符号
  33. replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(" "," ")]
  34.  
  35. def Replace_Char(self,x):
  36. x = self.BgnCharToNoneRex.sub("",x)
  37. x = self.BgnPartRex.sub("\n ",x)
  38. x = self.CharToNewLineRex.sub("\n",x)
  39. x = self.CharToNextTabRex.sub("\t",x)
  40. x = self.EndCharToNoneRex.sub("",x)
  41.  
  42. for t in self.replaceTab:
  43. x = x.replace(t[0],t[1])
  44. return x
  45. #----------- 处理页面上的各种标签 -----------
  46.  
  47. #----------- 加载处理糗事百科 -----------
  48. class HTML_Model:
  49.  
  50. def __init__(self):
  51. self.page = 1
  52. self.pages = []
  53. self.myTool = HTML_Tool()
  54. self.enable = False
  55.  
  56. # 将所有的段子都扣出来,添加到列表中并且返回列表
  57. def GetPage(self,page):
  58. myUrl = "http://m.qiushibaike.com/hot/page/" + page
  59. myResponse = urllib2.urlopen(myUrl)
  60. myPage = myResponse.read()
  61. #encode的作用是将unicode编码转换成其他编码的字符串
  62. #decode的作用是将其他编码的字符串转换成unicode编码
  63. unicodePage = myPage.decode("utf-8")
  64.  
  65. # 找出所有class="content"的div标记
  66. #re.S是任意匹配模式,也就是.可以匹配换行符
  67. myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
  68. items = []
  69. for item in myItems:
  70. # item 中第一个是div的标题,也就是时间
  71. # item 中第二个是div的内容,也就是内容
  72. items.append([item[0].replace("\n",""),item[1].replace("\n","")])
  73. return items
  74.  
  75. # 用于加载新的段子
  76. def LoadPage(self):
  77. # 如果用户未输入quit则一直运行
  78. while self.enable:
  79. # 如果pages数组中的内容小于2个
  80. if len(self.pages) < 2:
  81. try:
  82. # 获取新的页面中的段子们
  83. myPage = self.GetPage(str(self.page))
  84. self.page += 1
  85. self.pages.append(myPage)
  86. except:
  87. print '无法链接糗事百科!'
  88. else:
  89. time.sleep(1)
  90.  
  91. def ShowPage(self,q,page):
  92. for items in q:
  93. print u'第%d页' % page , items[0]
  94. print self.myTool.Replace_Char(items[1])
  95. myInput = raw_input()
  96. if myInput == "quit":
  97. self.enable = False
  98. break
  99.  
  100. def Start(self):
  101. self.enable = True
  102. page = self.page
  103.  
  104. print u'正在加载中请稍候......'
  105.  
  106. # 新建一个线程在后台加载段子并存储
  107. thread.start_new_thread(self.LoadPage,())
  108.  
  109. #----------- 加载处理糗事百科 -----------
  110. while self.enable:
  111. # 如果self的page数组中存有元素
  112. if self.pages:
  113. nowPage = self.pages[0]
  114. del self.pages[0]
  115. self.ShowPage(nowPage,page)
  116. page += 1
  117.  
  118. #----------- 程序的入口处 -----------
  119. print u"""
  120. ---------------------------------------
  121. 程序:糗百爬虫
  122. 版本:0.1
  123. 作者:why
  124. 日期:2013-05-15
  125. 语言:Python 2.7
  126. 操作:输入quit退出阅读糗事百科
  127. 功能:按下回车依次浏览今日的糗百热点
  128. ---------------------------------------
  129. """
  130.  
  131. print u'请按下回车浏览今日的糗百内容:'
  132. raw_input(' ')
  133. myModel = HTML_Model()
  134. myModel.Start()

[Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析的更多相关文章

  1. Python爬虫_糗事百科

    本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...

  2. 爬虫_糗事百科(scrapy)

    糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...

  3. <爬虫实战>糗事百科

    1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...

  4. 手动爬虫之糗事百科(ptyhon3)

    一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...

  5. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  6. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  7. 【Python爬虫实战】多线程爬虫---糗事百科段子爬取

    多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...

  8. Python爬虫(十八)_多线程糗事百科案例

    多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...

  9. 2019基于python的网络爬虫系列,爬取糗事百科

    **因为糗事百科的URL改变,正则表达式也发生了改变,导致了网上许多的代码不能使用,所以写下了这一篇博客,希望对大家有所帮助,谢谢!** 废话不多说,直接上代码. 为了方便提取数据,我用的是beaut ...

随机推荐

  1. [Phonegap+Sencha Touch] 移动开发18 Sencha Touch项目通过phonegap打包后的程序名字的问题

    之前说过 sencha phonegap init com.pushsoft.myapp MyApp 之后打包的程序安装包apk的名字是"MyApp.apk",显示在手机桌面上的程 ...

  2. WIN8.1 IE11 F12开发者人员工具,开启什么都不显示

    WIN8.1 IE11 F12开发者人员工具,开启什么都不显示,求大神帮忙?  IE11也没法重装, 还原IE设置过了. 没有效果.   也试过把IE停掉,重启后再重新打开 也没用 已经解决了  删除 ...

  3. Spring事务处理探究

    开发环境: OS:windows XP       Web Server: jakarta-tomcat-5.0.28       DataBase Server: MS SQL Server 200 ...

  4. JSTL fmt 格式化时间

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. js获取本机mac地址,IP地址,计算机名

    <!DOCTYPE HTML> <html> <head> <title>js获取本机mac地址,IP地址,计算机名</title> < ...

  6. python urlopen SSL: CERTIFICATE_VERIFY_FAILED

    1.使用ssl创建未经验证的上下文,在urlopen中传入上下文参数 import sslimport urllib2 context = ssl._create_unverified_context ...

  7. struts从2.3.X升级到2.5.18中遇到的问题及解决办法

    1,2.5.X版本不再提供xwork.jar ,整合到了 struts-core包中.2,需要升级替换的jar文件:commons-langcommons-lang3ognl其他所有struts2开头 ...

  8. CenoOS下如何对mysql编码进行配置

    1 修改/etc/mysql/my.cnf配置文件 增加default-character-set=utf8 配置文件如下 [client] port = 3306 socket = /var/run ...

  9. 解决报错"Your security system have blocked an application with expired or not yet valid certificate from running"

    方法如下: Go to Control Panel Java in the Security tab click the "Edit Site List-" button clic ...

  10. CREATE DATABASE failed

    由于环境需要, 故修改SQL Server 2012的默认的数据库的数据文件和日志文件的位置. 如下: 创建数据库, 遭遇报错. 错误信息: A file activation error occur ...