如何進行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
