返回顶部

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))

 

 

posted @ 2020-04-06 17:14  Be-myself  阅读(1163)  评论(0编辑  收藏  举报
levels of contents 点击查看具体代码内容