mitmproxy与python使用教程?如何能让 Python 实时获取到抓包的结果
mitmproxy与python使用教程2020-09-27 17:29:24人已围观
如何能让 Python 实时获取到抓包的结果
fiddler 可以写 js
burpsuite 可以写 python 脚本
mitmproxy
anyproxy
在 rule 里用 nodejs (懂点 js 应该都能驾驭) 处理数据
也可以把数据 post 到你自的 api 里(这样就不限定语言了)
BTW,我目前是在 android 机器里安装 anyproxy,监听到特定 app 的特定请求后,在 nodejs 里清洗数据,json 化后添加到远程 redis 队列,后台处理队列的有 python 也有 php
如何能让 Python 实时获取到抓包的结果
fiddler 可以写 js 脚本 burpsuite 可以写 python 脚本 mitmproxy anyproxy 在 rule 里用 nodejs (懂点 js 应该都能驾驭)
如何抓取汽车之家的车型库 Python中文社区
实际上,关于「抓取汽车之家的车型库我已经在「使用 Mitmproxy 接口」一文中了方法,不过那篇文章里讲的是利用 API 接口来抓取数据,一般来说,因为接口不会频繁改动,相对 WEB 页面而言更稳定,所以通常这是数据抓取的最佳选择,不过利用 API 接口来抓取数据有一些缺点,比如有的数据没有 API 接口,亦可能虽然有 API 接口,但是数据使用了加密格式,此时只能通过 WEB 页面来抓取数据。
既然要通过 WEB 页面来抓取数据,那么就不得不提到Scrapy,它可以说是爬虫之王,我曾经听说有人用 Scrapy,以有限的硬件资源在几天的时间里把淘宝商品数据从头到尾撸了一遍,如此看来,本文用 Scrapy 来抓取汽车之家的车型库应该是绰绰有余的了。
在抓取汽车之家的车型库之前,我们应该对其结构有一个大致的了解,按照百科中的描述,其大致分为四个级别,分别是品牌、厂商、车系、车型。本文主要关注车系和车型两个级别的数据。在抓取前我们要确定从哪个页面开始抓取,比较好的选择有两个,分别是产品库和品牌找车,选择哪个都可以,本文选择的是品牌找车,不过因为品牌找车页面使用了 js 来按字母来加载数据,所以直接使用它的话可能会有点不必要的麻烦,好在我们可以直接使用从A到Z的字母页面。
假设你已经有了 Scrapy 的运行环境(注:本文代码以 Python3 版本为准):
shell> scrapy startproject autohome
shell> cd autohome
shell> scrapy genspider automobile www.autohome.com.cn -t crawl
如此就生成了一个基本的蜘蛛骨架,需要说明的是 Scrapy 有两种蜘蛛,分别是 spider 和 crawl,其中 spider 主要用于简单的抓取,而 crawl 则可以用来实现复杂的抓取,复杂在哪里呢?主要是指蜘蛛可以根据规则萃取需要的链接,并且可以逐级自动抓取。就抓取汽车之家的车型库这个任务而言,使用 spider 就可以实现,不过鉴于 crawl 在功能上更强大,本文选择 crawl 来实现,其工作流程大致如下:通过 start_urls 设置起始页,通过 rules 设置处理哪些链接,一旦遇到匹配的链接地址,那么就会触发对应的 callback,在 callback 中可以使用 xpath/css 选择器来选择数据,并且通过 item loader 来加载 item:
车系
车型
文件:autohome/items.py:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader.processors import MapCompose, TakeFirst
class SeriesItem(scrapy.Item):
series_id = scrapy.Field(
input_processor=MapCompose(lambda v: v.strip("/")),
output_processor=TakeFirst()
)
series_name = scrapy.Field(output_processor=TakeFirst())
class ModelItem(scrapy.Item):
model_id = scrapy.Field(
input_processor=MapCompose(lambda v: v[6:v.find("#")-1]),
output_processor=TakeFirst()
)
model_name = scrapy.Field(output_processor=TakeFirst())
series_id = scrapy.Field(output_processor=TakeFirst())
文件:autohome/autohome/spiders/automobile.py:
# -*- coding: utf-8 -*-
import json
import string
from scrapy import Request
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from urllib.parse import parse_qs, urlencode, urlparse
from autohome.items import ModelItem, SeriesItem
class AutomobileSpider(CrawlSpider):
name = "automobile"
allowed_domains = ["www.autohome.com.cn"]
start_urls = [
"" x ".html"
for x in string.ascii_uppercase if x not in "EIUV"
]
rules = (
Rule(LinkExtractor(allow=("/\d /#",)), callback="parse_item"),
)
def parse(self,response):
params = {
"url": response.url,
"status": response.status,
"headers": response.headers,
"body": response.body,
}
response = HtmlResponse(**params)
return super().parse(response)
def parse_item(self, response):
sel = response.css("div.path")
loader = ItemLoader(item=SeriesItem(), selector=sel)
loader.add_css("series_id", "a:last-child::attr(href)")
loader.add_css("series_name", "a:last-child::text")
series = loader.load_item()
# 即将销售
版权声明:本站所有文章皆为原创,欢迎转载或转发,请保留网站地址和作者信息。