動態加載數據抓取-Ajax

特色:html

一、右鍵 -> 查看網頁源碼中沒有具體數據
二、滾動鼠標滑輪或其餘動做時加載

抓取:json

1、F12打開控制檯,頁面動做抓取網絡數據包
2、抓取json文件URL地址
# 控制檯中 XHR :異步加載的數據包
# XHR -> QueryStringParameters(查詢參數)

豆瓣電影數據抓取案例

1.目標網絡

一、地址: 豆瓣電影 - 排行榜 - 劇情
二、目標: 電影名稱、電影評分

2.F12抓包(XHR)dom

一、Request URL(基準URL地址) :https://movie.douban.com/j/chart/top_list?
2、Query String(查詢參數)
# 抓取的查詢參數以下:
type: 13 # 電影類型
interval_id: 100:90
action: ''
start: 0  # 每次加載電影的起始索引值
limit: 20 # 每次加載的電影數量

3.代碼實現異步

import requests
import time
from fake_useragent import UserAgent


class DoubanSpider():
  def __init__(self):
    self.base_url = 'https://movie.douban.com/j/chart/top_list'
    self.i = 0

  def get_html(self, params):
    ua = UserAgent()
    headers = {'User-Agent': ua.random}
    res = requests.get(
      url=self.base_url,
      params=params,
      headers=headers
    )
    res.encoding = 'utf-8'
    html = res.json()
    # 直接調用解析函數
    self.parse_html(html)

  def parse_html(self, html):
    # html:[{電影1信息},{電影2信息},{}]
    item = {}
    for one in html:
      item['name'] = one['title']
      item['score'] = one['score']
      item['time'] = one['release_date']
      print(item)
      self.i += 1

  def get_total(self,typ):
    url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(typ)
    ua = UserAgent()
    html = requests.get(url=url, headers={'User-Agent': ua.random}).json()
    total = html['total']
    return total

  def main(self):
    ty = input("請輸入電影類型(劇情|喜劇|動做)")
    typ_dict={'劇情':'11','喜劇':'24','動做':'5'}
    typ=typ_dict[ty]
    total = self.get_total(typ)
    for page in range(0, int(total), 20):
      params = {
        'type': typ,
        'interval_id': '100:90',
        'action': '',
        'start': str(page),
        'limit': '20'
      }
      self.get_html(params)
      time.sleep(1)
    print(self.i)


if __name__ == '__main__':
  spider = DoubanSpider()
  spider.main()
代碼
相關文章
相關標籤/搜索