zoukankan      html  css  js  c++  java
  • Spider -- 常规 爬取网站 步骤

    1、爬取网站基本步骤:

    1. 确定网页是动态或静态类型

    2. 确定url格式

    3. 发送请求

    4. 获取请求响应

    5. 解析响应数据,获取想要数据

    6. 保存数据(本地文件、数据库)

    2、案例演示:

      1、大致程序框架:

    # 程序结构
    class xxxSpider(object):
        def __init__(self):
            # 定义常用变量,url,headers及计数等
            
        def get_html(self):
            # 获取响应内容函数,使用随机User-Agent
        
        def parse_html(self):
            # 使用正则表达式来解析页面,提取数据
        
        def write_html(self):
            # 将提取的数据按要求保存,csv、MySQL数据库等
            
        def main(self):
            # 主函数,用来控制整体逻辑
            
    if __name__ == '__main__':
        # 程序开始运行时间戳
        start = time.time()
        spider = xxxSpider()
        spider.main()
        # 程序运行结束时间戳
        end = time.time()
        print('执行时间:%.2f' % (end-start))

      2、猫眼电影top100抓取案例

        

    猫眼电影 - 榜单 - top100榜
    电影名称、主演、上映时间

      数据抓取实现

    • 1、确定响应内容中是否存在所需数据

      右键 - 查看网页源代码 - 搜索关键字 - 存在!!
    • 2、找URL规律

        第1页:https://maoyan.com/board/4?offset=0
        第2页:https://maoyan.com/board/4?offset=10
        第n页:offset=(n-1)*10
    • 3、正则表达式

    <div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>
    • 4、编写程序框架,完善程序

    from urllib import request
    import re
    import time
    import random
    from fake_useragent import UserAgent
    ​
    class MaoyanSpider(object):
      def __init__(self):
        self.url = 'https://maoyan.com/board/4?offset={}'
        # 计数
        self.num = 0
    ​
      # 获取
      def get_html(self,url):
        headers = {
          'User-Agent' : UserAgent().random
        }
        req = request.Request(url=url,headers=headers)
        res = request.urlopen(req)
        html = res.read().decode('utf-8')
        # 直接调用解析函数
        self.parse_html(html)
    ​
      # 解析
      def parse_html(self,html):
        re_bds = r'<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>'
        pattern = re.compile(re_bds,re.S)
        # film_list: [('霸王别姬','张国荣','1993'),()]
        film_list = pattern.findall(html)
        # 直接调用写入函数
        self.write_html(film_list)
    ​
      def write_html(self,film_list):
        item = {}
        for film in film_list:
          item['name'] = film[0].strip()
          item['star'] = film[1].strip()
          item['time'] = film[2].strip()[5:15]
          print(item)
    ​
          self.num += 1def main(self):
        for offset in range(0,31,10):
          url = self.url.format(offset)
          self.get_html(url)
          time.sleep(random.randint(1,2))
        print('共抓取数据:',self.num)
    ​
    if __name__ == '__main__':
      start = time.time()
      spider = MaoyanSpider()
      spider.main()
      end = time.time()
      print('执行时间:%.2f' % (end-start))

     

  • 相关阅读:
    c++ primer plus 第六章 课后题答案
    动态创建easyui控件的渲染问题
    晨报
    动态构建easyUI grid
    早起
    周末
    js ajax方式拼接参数
    5个月
    锻炼
    东湖夜色
  • 原文地址:https://www.cnblogs.com/gengyufei/p/12642932.html
Copyright © 2011-2022 走看看