scrapy抓取斗魚APP主播信息


如何進行APP抓包

首先確保手機和電腦連接的是同一個局域網(通過路由器轉發的網絡,校園網好像還有些問題)。

1.安裝抓包工具Fiddler,並進行配置

Tools>>options>>connections>>勾選allow remote computers to connect

2.查看本機IP

在cmd窗口(win+R快捷鍵),輸入ipconfig,查看(以太網)IP地址。

3.配置手機端。

手機連網后(和電腦端同一局域網),打開手機瀏覽器並訪問:http://ip:8888(ip是你第二步查看到的IP地址, 8888端口是Fiddler默認端口),

有些瀏覽器打不開網頁,換一下瀏覽器就行。

如果訪問成功,會出現一個網頁:

4.下載證書

點擊FiddlerRoot certificate,下載證書。如果不下載證書的話,只能抓到http請求,抓不到https請求。

5.安裝證書

部分手機可以直接點擊安裝

部分手機需要通過:

設置>>wifi(或WLAN)>>高級設置>>安裝證書>>選中下載好的FiddlerRoot.cer>>確定

或:

設置>>更多設置>>系統安全>>從存儲設備安裝

安裝后,可以按照自己的意願,給證書起一個名字,例如Fiddler,確定后會顯示安裝完成!

6.設置手機代理

手機設置代理后,打開Fiddler,接下來在手機端打開app或者瀏覽器,所有通過手機發送的請求都會被Fiddler抓取。

scrapy框架下載圖片

 Scrapy用ImagesPipeline類提供一種方便的方式下載和存儲圖片(需要PIL庫支持)。

主要特征:

  • 將下載圖片轉化為通用的jpg和rgb格式
  • 避免重復下載
  • 縮略圖生成
  • 圖片大小過濾

工作流程:

  • 抓取一個item,將圖片的urls放入image_urls字段
  • 從Spider返回的item,傳遞到 Item Pipeline
  • 當Item傳遞到ImagePipeline,將調用scrapy調度器和下載器完成image_urls中的url調度和下載。ImagePipeline會自動高優先級抓取這些url,同時,item會被鎖定直到圖片抓取完畢才解鎖
  • 圖片下載成功后,圖片下載路徑,url和校驗信息等會被填充到images字段中

scrapy抓取斗魚主播圖像

ImagePipeline簡介

 首先介紹一下圖片下載中的ImagePipeline類中的兩個重要方法。在自定義的ImagePipeline類中要重寫:

get_media_requests(item, info)和item_completed(results, items, info);其中,正如工作流所述,Pipeline從item中獲取圖片的urls並下載,

所以必須重載get_media_requests,並返回一個Request對象,這些請求對象將被pipelines處理

下載完成后,結果發送發哦item_complete方法,下載結果為一個二元組的list, 每個元組包含:

(success, image_info_or_failure),其中:

success: bool值,true表示下載成功

image_info_or_error: 如果success為True,則該字典包含以下鍵值對:{path:本地存儲路徑, checksum:校驗碼}

分析及編碼

通過Fiddler抓包工具分析,請求連接為:http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=0,其中

offset為變量,每次翻頁增加20。

首先,使用命令創建項目

scrapy startproject Douyu

 

來到items.py文件,編寫需要抓取的字段如下:

 

# -*- coding: utf-8 -*-

import scrapy

class DouyuItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    # 圖片鏈接
    image_link = scrapy.Field()

    # 圖片保存路徑
    image_path = scrapy.Field()

    # 主播名
    nick_name = scrapy.Field()

    # 房間號
    room_id = scrapy.Field()

    # 所在城市
    city = scrapy.Field()

    # 數據源
    source = scrapy.Field()

 

明確抓取目標后,生成爬蟲,開始編寫爬蟲邏輯

scrapy genspider douyu douyucdn.com  # 生成爬蟲

 

編寫爬蟲邏輯之前,在下載中間件中,給每個請求添加頭部信息:

# -*- coding: utf-8 -*-

# Define here the models for your spider middleware
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/spider-middleware.html

from scrapy import signals
from Douyu.settings import USER_AGENTS as ua
import random

class DouyuSpiderMiddleware(object):
    def process_request(self, request, spider):
        """
        給每一個請求隨機分配一個代理
        :param request:
        :param spider:
        :return:
        """
        user_agent = random.choice(ua)
        request.headers['User-Agent'] = user_agent

 

然后來到spiders文件夾下的爬蟲文件,開始編寫爬蟲邏輯:

# -*- coding: utf-8 -*-
import json
import scrapy
from Douyu.items import DouyuItem

class DouyuSpider(scrapy.Spider):
    name = 'douyu'
    allowed_domains = ['douyucdn.cn']

    offset = 0

    # 請求url
    base_url = "http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset="
    start_urls = [base_url + str(offset)]

    def parse(self, response):
        
        # 手機端斗魚返回的是json格式的數據,所有數據都在data中
        # 直接從請求響應體中獲取數據
        node_list = json.loads(response.body)['data']
        
        # 如果拿不到數據,說明已經爬取完所有翻頁
        if not node_list:
            return

        # 對具體數據進行解析
        for node in node_list:
            
            # 數據保存
            item = DouyuItem()
            item['image_link'] = node['vertical_src']
            item['nick_name'] = node['nickname']
            item['room_id'] = node['room_id']
            item['city'] = node['anchor_city']

            yield item
        
        # 實現翻頁
        self.offset += 20
        yield scrapy.Request(self.base_url + str(self.offset), callback=self.parse)

 

編寫完爬蟲邏輯后,可以開始編寫圖片下載邏輯了,來到pipelines文件:

# -*- coding: utf-8 -*-
import os
import scrapy

# scrapy下載圖片專用管道
from scrapy.pipelines.images import ImagesPipeline
# 在setting中指定圖片存儲路徑
from Douyu.settings import IMAGES_STORE

class ImageSourcePipeline(object):
    
    # 添加數據源
    def process_item(self, item, spider):
        item['source'] = spider.name
        return item


class DouyuImagePipeline(ImagesPipeline):

    # 發送圖片鏈接請求
    def get_media_requests(self, item, info):
        # 獲取item數據的圖片鏈接
        image_link = item['image_link']

        # 發送圖片請求,響應會保存在settings中指定的路徑下(IMAGES_STORE)
        try:
            yield scrapy.Request(url=image_link)
        except:
            print(image_link)

    def item_completed(self, results, item, info):
        """
        :param results: 下載圖片結果,包含一個二元組(下載狀態,圖片路徑)
        :param item:
        :param info:
        :return:
        """
        # 取出每個圖片的原本路徑
        # path為設定的圖片存儲路徑
        image_path = [x['path'] for ok, x in results if ok]

        # 默認保存當前圖片的路徑
        old_name = IMAGES_STORE + '\\' + image_path[0]

        # 新建當前圖片路徑,因為默認路徑有一些不需要的東西
        new_name = IMAGES_STORE + '\\'+item['nick_name'] + '.jpg'

        item['image_path'] = new_name
        try:
            # 將原本路徑的圖片名,修改為新建的圖片名
            os.rename(old_name, new_name)
        except:
            print("INFO:圖片更名錯誤!")

        return item

整體邏輯編寫完成,在settings文件中分別打開中間件、管道等的注釋信息,即可運行爬蟲!

運行結果:

完整代碼

參見:https://github.com/zInPython/Douyu

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM