51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2546|回复: 5
打印 上一主题 下一主题

[讨论] Python爬虫Scrapy测试

[复制链接]
  • TA的每日心情
    擦汗
    2022-8-30 09:02
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2018-3-15 16:34:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    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()
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 00:58 , Processed in 0.067056 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表