测开学习一阶段(2)编程思维训练---爬虫小案例

  •  学习目的:散代码→面向过程→面向对象,学习各阶段的设计思路,实现步骤
  • 1.基础版本

  流程:

    1.访问url

    2.转换格式,抓取数据

    3.格式化输出,保存到本地文件

import requests
from lxml import etree
url = 'http://www.51testing.com/html/90/category-catid-90.html'
# 访问url
rsp = requests.get(url)
# 进行页面字符集转换
cod = rsp.apparent_encoding
rsp.encoding = 'gbk'
content = rsp.text
# 将页面信息转为dom格式
doc = etree.HTML(content)
# 查看返回结果
#print(content)
# 新建文件 file = open('data.txt','w') for j in range(2,5): print(j - 1) file.write(r'第{}页'.format(j-1)+'\n') # 提取数据 for i in range(1,11): ele = doc.xpath('/html/body/div[2]/div[3]/div[2]/div['+str(i)+']/div/p/text()')[0] print("第:{} 行--{}".format(i, ele)) # ele里面存在不可识别的字符,防止写入文件时报错,需要进行处理 new_ele = ''.join(ele.split()) file.write(r"第:{} 行{}".format(i, new_ele)+'\n'+'\n') # 获取第二页 url = 'http://www.51testing.com/html/90/category-catid-90-page-'+str(j)+'.html' rsp = requests.get(url) cod = rsp.apparent_encoding rsp.encoding = 'gbk' content = rsp.text doc = etree.HTML(content)

     爬取效果:

    

  • 2.面向过程封装设计 
    • 思路:独立模块,模块之间,整体
      • 独立模块:输入,处理,输出
      • 模块之间:返回值,传参
      • 整体:模块间的调用顺序
  • 版本优化操作
    • 独立模块设计:
      • 获取页面信息:1.输入:url;2.处理:发送页面请求,页面编码转换;3.输出:页面对象
      • 提取页面元素:1.输入:页面对象;2.处理:转化为dom格式,通过xpath元素定位;3.输出:元素内容列表
      • 保存抓取内容:1.输入:元素内容列表;2.处理:创建一个文件,写入元素内容,保存并关闭文件;3.输出:抓取文件
      • 其他模块:待定...
    • 分版本实践:
      • v1.0单个页面抓取:传入固定url,提取一个页面元素,进行元素保存
        • 流程图:
        • #**********************************************
          # 使用面向过程思想对爬虫代码进行封装
          # V1.0:实现一个页面的元素抓取
          # 一共设计3个方法
          #*********************************************
          
          
          import requests
          from lxml import etree
          
          
          #******************获取页面信息******************
          def get_page():
              # 输入url
              url = 'http://www.51testing.com/html/90/category-catid-90.html'
              # 发送请求
              rsp = requests.get(url)
              # 页面编码转化
              cod = rsp.apparent_encoding
              rsp.encoding = 'gbk'
              # 输出:页面对象
              #print(rsp.text)
              return rsp.text
          
          #******************提取页面元素******************
          def get_element(content):
              # 输入:页面对象,传入get_page的返回值
              # 定义列表,存储元素内容
              #listcont = []
              tmp = ''
              # 转化为dom格式
              doc = etree.HTML(content)
              # 循环提取页面元素
              for i in range(1,11):
                  # 通过xpath元素定位
                  ele = doc.xpath('/html/body/div[2]/div[3]/div[2]/div['+str(i)+']/div/p/text()')[0]
                  # ele里面存着不可识别的字符,防止写入文件时报错,需要进行处理
                  new_ele = ''.join(ele.split())
                  # 打印输出元素
                  #print("第:{} 行--{}".format(i, new_ele))
                  # 输出:元素内容列表
                  tmp = tmp+str(i)+new_ele+'\n'+'\n'
          
              #print(listcont)
              return tmp
          
          #******************保存抓取内容******************
          def save_element(tmpcontent):
              # 1.输入:元素内容列表;
          
              # 创建一个文件,
              file = open('spider.txt', 'a')
              # 写入元素内容
              file.write(tmpcontent)
              # 保存并关闭文件
              file.close()
          
          if __name__ == '__main__':
              listc = []
              content = get_page()
              listc = get_element(content)
              save_element(listc)
        • 抓取效果

      • v2.0多个页面抓取:由主程序传入url
        •   流程图:
          • #******************获取页面信息******************
            def get_page(url):
                # 发送请求
                rsp = requests.get(url)
                # 页面编码转化
                cod = rsp.apparent_encoding
                rsp.encoding = 'gbk'
                # 输出:页面对象
                #print(rsp.text)
                return rsp.text
            #**********************************************
            
            #  中间代码不变........
            
            if __name__ == '__main__':
                #url = 'http://www.51testing.com/html/90/category-catid-90.html'
                #url = 'http://www.51testing.com/html/90/category-catid-90-page-2.html'
                for i in range(1,6):
                    # 如果首页
                    if i == 1:
                        url = 'http://www.51testing.com/html/90/category-catid-90.html'
                    else:
                        url = 'http://www.51testing.com/html/90/category-catid-90-page-'+str(i)+'.html'
            
                    content = get_page(url)
                    strcont = get_element(content)
                    save_element(strcont)
      • v3.0灵活页面抓取
        • 流程图:

 

  • 3.面向对象封装设计
    • 思路:属性设计,方法设计,类设计
      • 属性设计:方法之间传递参数
      • 方法设计:与面向过程的方法直接对应
      • 类设计:把属性和方法封装到类中
  • 版本优化操作
    • 分版本实践:
      • v1.0单个页面抓取:1.分析要设置的属性;2.保留之前的方法;3.把方法和属性封装到类中;
      • 流程图:
      •  

         

      •  

        代码:在面向过程v1.0版本上,新建了爬虫类,设置了两个属性
      • #**********************************************
        # 使用面向对象思想对爬虫代码进行封装
        # V1.0:实现一个页面的元素抓取
        # 一共设计3个方法,两个属性
        #*********************************************
        
        
        import requests
        from lxml import etree
        
        # 定义爬虫类
        class spider_v1():
            #******************获取页面信息******************
            def get_page(self):
                # 输入url
                url = 'http://www.51testing.com/html/90/category-catid-90.html'
                # 发送请求
                rsp = requests.get(url)
                # 页面编码转化
                cod = rsp.apparent_encoding
                rsp.encoding = 'gbk'
                # 输出:页面对象
        
                # 设置属性1(在哪里产生就在哪里定义)
                self.content = rsp.text
        
                #print(self.content)
            #**********************************************
        
        
            #******************提取页面元素******************
            def get_element(self): #原来面向过程接收content参数就不需要了,使用时,直接self.content
                # 输入:页面对象,传入get_page的返回值
                # 定义列表,存储元素内容
                #listcont = []
                tmp = ''
                # 转化为dom格式
                doc = etree.HTML(self.content) # 这里需要使用get_page产生的属性self.content
                # 循环提取页面元素
                for i in range(1,11):
                    # 通过xpath元素定位
                    ele = doc.xpath('/html/body/div[2]/div[3]/div[2]/div['+str(i)+']/div/p/text()')[0]
                    # ele里面存着不可识别的字符,防止写入文件时报错,需要进行处理
                    new_ele = ''.join(ele.split())
                    # 打印输出元素
                    #print("第:{} 行--{}".format(i, new_ele))
                    # 输出:元素内容列表
                    tmp = tmp+str(i)+new_ele+'\n'+'\n'
        
                # 设置属性2
                self.tmpcontent = tmp
        
                #print(self.tmpcontent)
        
            #******************保存抓取内容******************
            def save_element(self):
                # 1.输入:元素内容列表;
        
                # 创建一个文件,
                file = open('spider.txt', 'a')
                # 写入元素内容
                file.write("{}".format(self.tmpcontent)+'\n')
                # 保存并关闭文件
                file.close()
        
        
        
        if __name__ == '__main__':
            # 实例化
            obj = spider_v1()
            # 调用获取页面信息方法
            obj.get_page()
            # 调用提取页面元素方法
            obj.get_element()
            # 调用保存抓取内容方法
            obj.save_element()

         

      • v2.0单个页面抓取:需要设置属性3
      • 流程图
         
      •  

        代码:
      • #**********************************************
        # 使用面对象程思想对爬虫代码进行封装
        # V2.0:实现多个页面的元素抓取
        # 一共设计3个方法,3个属性
        #*********************************************
        
        
        import requests
        from lxml import etree
        
        # 定义爬虫类
        class spider_v2():
        
            # url在main中传入的,需要在类的初始化方法中设置
            def __init__(self,i):
        
                if i == 1:
                    self.url = 'http://www.51testing.com/html/90/category-catid-90.html'
                else:
                    self.url = 'http://www.51testing.com/html/90/category-catid-90-page-'+str(i)+'.html'
        
        
        
            #******************获取页面信息******************
            def get_page(self):
                # 发送请求
                rsp = requests.get(self.url)
                # 页面编码转化
                cod = rsp.apparent_encoding
                rsp.encoding = 'gbk'
                # 输出:页面对象
        
                # 设置属性1(在哪里产生就在哪里定义)
                self.content = rsp.text
        
                print(self.content)
            #**********************************************
        
        
            #******************提取页面元素******************
            def get_element(self):
                # 输入:页面对象,传入get_page的返回值
                # 定义列表,存储元素内容
                #listcont = []
                tmp = ''
                # 转化为dom格式
                doc = etree.HTML(self.content)
                # 循环提取页面元素
                for i in range(1,11):
                    # 通过xpath元素定位
                    ele = doc.xpath('/html/body/div[2]/div[3]/div[2]/div['+str(i)+']/div/p/text()')[0]
                    # ele里面存着不可识别的字符,防止写入文件时报错,需要进行处理
                    new_ele = ''.join(ele.split())
                    # 打印输出元素
                    #print("第:{} 行--{}".format(i, new_ele))
                    # 输出:元素内容列表
                    tmp = tmp+str(i)+' '+new_ele+'\n'+'\n'
        
                # 设置属性2
                self.tmpcontent = tmp
        
                print(self.tmpcontent)
        
        
            #******************保存抓取内容******************
            def save_element(self):
                # 1.输入:元素内容列表;
                # 创建一个文件,
                file = open('spider.txt', 'a')
                # 写入元素内容
                file.write(self.tmpcontent)
                # 保存并关闭文件
                file.close()
        
        
        
        if __name__ == '__main__':
        
            for i in range(1,6):
                obj = spider_v2(i)
                obj.get_page()
                obj.get_element()
                obj.save_element()

         


posted @ 2023-01-10 14:05  沐沂  阅读(73)  评论(0)    收藏  举报