糗事百科小爬虫

r囧r小猫 2022-07-13 23:38 260阅读 0赞

这几天看了不少phtyon 的基础,试着做了一个daemo
但不是很成功 不知道家里网络不太好还正则匹配的不好,re.findall 的数据不是特别的稳定,有时候要加载很长间,本来是计划用列表做有个缓存功能存2页,但最后还是没实现。这个还有很BUG 有兴趣的同学可看下

  1. #!/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import urllib
  4. import urllib2
  5. import re
  6. import thread
  7. import time
  8. #糗事百科爬虫类
  9. pageStories = []
  10. class QSBK:
  11. def __init__(self):
  12. self.pageIndex = 3
  13. self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  14. self.headers = { 'User-Agent' : self.user_agent }
  15. self.stories = []
  16. self.enable = False
  17. def getPage(self,pageIndex):
  18. try:
  19. url = 'http://www.qiushibaike.com/hot/page/'+str(pageIndex)
  20. request = urllib2.Request(url,headers = self.headers)
  21. #利用urlopen获取页面代码
  22. response = urllib2.urlopen(request)
  23. # #将页面转化为UTF-8编码
  24. pageCode = response.read().decode('utf-8')
  25. return pageCode
  26. except urllib2.URLError, e:
  27. if hasattr(e,"reason"):
  28. print u"连接糗事百科失败,错误原因",e.reason
  29. return None
  30. #传入某一页代码,返回本页不带图片的段子列表
  31. def getPageItems(self,pageIndex):
  32. pageCode = self.getPage(pageIndex)
  33. if not pageCode:
  34. print "页面加载失败...."
  35. return None
  36. pattern = re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<h2>(.*?)</h2>.*?<div.*?class'+
  37. '="content".*?<span>(.*?)/span>.*?<i.*?class="number">(.*?)</i>.*?<i.*?>(.*?)</i>.*?<div.*?class.*?"main-text">(.*?)<div',
  38. re.S)
  39. try:
  40. items= re.findall(pattern,pageCode)
  41. except IOError, e:
  42. print 'could not open file:', e
  43. #用来存储每页的段子们
  44. #遍历正则表达式匹配的信息
  45. for item in items:
  46. #haveImg = re.search("img",item[3])
  47. #如果不含有图片,把它加入list中
  48. # if not haveImg:
  49. #item[0]是一个段子的发布者,item[1]是发布时间,item[2]是内容,item[4]是点赞数
  50. pageStories.append([item[0].strip(),item[1].strip(),item[2].strip(),item[4].strip()])
  51. return pageStories
  52. #加载并提取页面的内容,加入到列表中
  53. def loadPage(self):
  54. #如果当前未看的页数少于2页,则加载新一页
  55. if self.enable == True:
  56. if len(self.stories) < 1:
  57. pageStories = self.getPageItems(self.pageIndex)
  58. if pageStories:
  59. self.stories.append(pageStories)
  60. self.pageIndex +=1
  61. def getOneStory(self,pageStories,page):
  62. for story in pageStories:
  63. input = raw_input()
  64. self.loadPage()
  65. if input == "Q":
  66. self.enable = False
  67. return
  68. print u"第%d页\t" u"作者:%s\n%s\n赞:%s\n神评论%s\n" %(page,story[0],story[1],story[2],story[3])
  69. def start(self):
  70. print u"正在读取糗事百科,按回车查看新段子,Q退出"
  71. self.enable = True
  72. self.loadPage()
  73. #局部变量,控制当前读到了第几页
  74. nowPage = 0
  75. while self.enable:
  76. if len(self.stories)>0:
  77. pageStories = self.stories[0]
  78. nowPage += 1
  79. #将全局list中第一个元素删除,因为已经取出\
  80. del self.stories[0]
  81. self.getOneStory(pageStories,nowPage)
  82. else:self.loadPage()
  83. spider = QSBK()
  84. spider.start()

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 百科爬虫

    这几天看了不少phtyon 的基础,试着做了一个daemo 但不是很成功 不知道家里网络不太好还正则匹配的不好,re.findall 的数据不是特别的稳定,有时候要加载很长