51Testing软件测试论坛

标题: Python爬虫Scrapy测试 [打印本页]

作者: 胖虎    时间: 2018-3-15 16:34
标题: Python爬虫Scrapy测试
  1. # -*- coding:utf-8 -*-
  2. import urllib
  3. import urllib2
  4. import re
  5. import thread
  6. import time

  7. #糗事百科爬虫类
  8. class QSBK:
  9.     #初始化方法,定义一些变量
  10.     def __init__(self):
  11.         self.pageIndex = 1
  12.         self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  13.         #初始化headers
  14.         self.headers = { 'User-Agent' : self.user_agent }
  15.         #存放段子的变量,每一个元素是每一页的段子们
  16.         self.stories = []
  17.         #存放程序是否继续运行的变量
  18.         self.enable = False
  19.     #传入某一页的索引获得页面代码
  20.     def getPage(self,pageIndex):
  21.         try:
  22.             url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
  23.             #构建请求的request
  24.             request = urllib2.Request(url,headers = self.headers)
  25.             #利用urlopen获取页面代码
  26.             response = urllib2.urlopen(request)
  27.             #将页面转化为UTF-8编码
  28.             pageCode = response.read().decode('utf-8')
  29.             return pageCode

  30.         except urllib2.URLError, e:
  31.             if hasattr(e,"reason"):
  32.                 print u"连接糗事百科失败,错误原因",e.reason
  33.                 return None


  34.     #传入某一页代码,返回本页不带图片的段子列表
  35.     def getPageItems(self,pageIndex):
  36.         pageCode = self.getPage(pageIndex)
  37.         if not pageCode:
  38.             print "页面加载失败...."
  39.             return None
  40.         pattern = re.compile('<div.*?author.*?>.*?<a.*?<img.*?</a>.*?<a.*?<h2>(.*?)</h2>.*?</div>.*?<div.*?' +
  41.                              'content">(.*?)</div>', re.S)
  42.         items = re.findall(pattern,pageCode)
  43.         #用来存储每页的段子们
  44.         pageStories = []
  45.         #遍历正则表达式匹配的信息
  46.         for item in items:
  47.             #是否含有图片
  48.             haveImg = re.search("img",item[1])
  49.             #如果不含有图片,把它加入list中
  50.             if not haveImg:
  51.                 replaceBR = re.compile('<br/>')
  52.                 text = re.sub(replaceBR,"\n",item[1])
  53.                 #item[0]是一个段子的发布者,item[1]是内容,item[2]是发布时间,item[4]是点赞数
  54.                 pageStories.append([item[0].strip(),text.strip()])
  55.         return pageStories


  56.     #加载并提取页面的内容,加入到列表中
  57.     def loadPage(self):
  58.         #如果当前未看的页数少于2页,则加载新一页
  59.         if self.enable == True:
  60.             if len(self.stories) < 2:
  61.                 #获取新一页
  62.                 pageStories = self.getPageItems(self.pageIndex)
  63.                 #将该页的段子存放到全局list中
  64.                 if pageStories:
  65.                     self.stories.append(pageStories)
  66.                     #获取完之后页码索引加一,表示下次读取下一页
  67.                     self.pageIndex += 1
  68.    
  69.     #调用该方法,每次敲回车打印输出一个段子
  70.     def getOneStory(self,pageStories,page):
  71.         #遍历一页的段子
  72.         for story in pageStories:
  73.             #等待用户输入
  74.             input = raw_input()
  75.             #每当输入回车一次,判断一下是否要加载新页面
  76.             self.loadPage()
  77.             #如果输入Q则程序结束
  78.             if input == "Q":
  79.                 self.enable = False
  80.                 return
  81.             print u"第%d页\t发布人:%s\t内容:%s" %(page,story[0],story[1])
  82.    
  83.     #开始方法
  84.     def start(self):
  85.         print u"正在读取糗事百科,按回车查看新段子,Q退出"
  86.         #使变量为True,程序可以正常运行
  87.         self.enable = True
  88.         #先加载一页内容
  89.         self.loadPage()
  90.         #局部变量,控制当前读到了第几页
  91.         nowPage = 0
  92.         while self.enable:
  93.             if len(self.stories)>0:
  94.                 #从全局list中获取一页的段子
  95.                 pageStories = self.stories[0]
  96.                 #当前读到的页数加一
  97.                 nowPage += 1
  98.                 #将全局list中第一个元素删除,因为已经取出
  99.                 del self.stories[0]
  100.                 #输出该页的段子
  101.                 self.getOneStory(pageStories,nowPage)


  102. spider = QSBK()
  103. spider.start()
复制代码



作者: 海海豚    时间: 2018-3-16 13:32
谢谢分享!
作者: libingyu135    时间: 2018-4-25 16:43
6666
作者: 梦想家    时间: 2018-5-8 10:19

作者: Miss_love    时间: 2018-5-8 13:28
支持分享
作者: 梦想家    时间: 2018-5-8 13:44





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2