【爬虫成长之路】(六)【大众点评】mitmproxy中间人代理爬虫

本系列文章共十篇:

【爬虫成长之路】(一)爬虫系列文章导读
【爬虫成长之路】(二)各篇需要用到的库和工具
【爬虫成长之路】(三)【大众点评】selenium爬虫
【爬虫成长之路】(四)【大众点评】selenium登录+requests爬取数据
【爬虫成长之路】(五)【大众点评】浏览器扫码登录+油猴直接爬取数据
【爬虫成长之路】(六)【大众点评】mitmproxy中间人代理爬虫
【爬虫成长之路】(七)【大众点评】PC微信小程序+requests爬取数据
【爬虫成长之路】(八)【大众点评】安卓APP爬虫

本文需要用到的工具:mitmproxy中间人代理
本文需要用到的库:mitmproxybs4

爬取目标数据:

  1. 指定城市的店铺列表及其评分数据
  2. 指定店铺下的用户评论数据

一、需求分析

这一篇总共需要爬取两个页面的数据,分别是:

  1. 某城市的店铺列表页面
  2. 某店铺的评论列表页面

二、获取目标页面的URL

这里与前面获取的URL一致,不需要进行修改:

# 进行URL匹配时需要适当修改匹配规则
http://www.dianping.com/guangzhou/ch10
http://www.dianping.com/shop/H7fXoNAkaf******/review_all

三、mitmproxy简介和使用

mitmproxy是一款HTTP/HTTPS代理工具,其功能类似于Fiddler、Postman、Charles等抓包软件,不同之处在于mitmproxy提供了更为高级的开发接口,通过使用这些接口,我们能轻易的获取到HTTP数据,并对其进行修改。
mitmproxy官网地址

使用mitmproxy有几个地方需要注意,官网文档有详细说明,我在这里简单说一下大概使用步骤:

  1. mitmproxy 软件安装(需要安装mitmproxy软件才能使用)
  2. 安装mitmproxy的python库,pip install mitmproxy
  3. 阅读文档,编写程序
  4. 命令行启动mitmproxy,指定端口写好的程序(windows下是mitmdump,Linux下是mitmdump,还有一个图形界面mitmweb)
  5. 修改本地代理端口和命令行启动时配置的端口一致(如果还有其他代理软件开着,建议先关闭,避免相互影响)
  6. 安装mitmproxy的证书,证书下载地址是mitm.it,详细安装可参考官网关于证书

如果mitmproxy安装有问题的,可以参考如下文章:

  1. mitmproxy的安装
  2. Python3+mitmproxy安装使用教程(Windows)
  3. 安装mitmproxy以及遇到的坑和简单用法

四、分析文档结构

这里和前面的第三篇第四篇都是一致的,稍作修改即可,所以就不再重复了。

五、编写程序

其实关于mitmproxy获取数据的部分很简单,主要是要知道mitmproxy的工作原理,关键代码只需要按固定的格式去编写就好了。

程序启动方式
在控制台输入命令:

mitmdump -p 8000 -q -s mitm_spider.py
序号 参数 说明
1 -p 指定代理端口,这里需要和系统中配置的一致,否则代理不起作用,之后记得改回来
2 -q 可以屏蔽掉默认的无关输出
3 -s 指定脚本程序所在的路径

这里主要就是匹配URL,匹配到URL之后,就可以使用flow.response.text获取响应的内容了,之后便是和前面文章介绍的一样按固定格式提取数据即可。

关键代码:

import mitmproxy
from mitmproxy import ctx,http
from mitmproxy.http import flow

class Spider:
    def response(self, flow:flow):
        # 去掉cookie的HttpOnly参数
        shop_list_url = 'http://www.dianping.com/guangzhou'

        url = flow.request.url
        if url.startswith(shop_list_url):
            print(f'mitm 劫持成功,URL= {url}')
            body = flow.response.text
            #shop_info = parse_shop(body)
        elif 'review_all' in url and url.startswith('http://www.dianping.com'):
            print(f'mitm 劫持成功,URL= {url}')
            body = flow.response.text
            #comment_list = parse_comment(body)

addons = [
    Spider(),
]

全部程序源码:

import mitmproxy
import traceback
from mitmproxy import ctx,http
from mitmproxy.http import flow
from bs4 import BeautifulSoup as BS


def parse_shop(html):
    shop_info = []
    soup = BS(html, 'lxml')
    page_shop = soup.find_all('div', class_='txt')
    for shop in page_shop:
        shop_info.append({
            'shopid': shop.a['data-shopid'],
            'name': shop.a.text.strip(),
            'score': shop.find('div', class_='nebula_star').text.strip()
        })
    return shop_info


def parse_comment(html):
    soup = BS(html, 'lxml')
    comments = soup.find_all('div', class_='main-review')
    comment_list = []
    for item in comments:   # 遍历所有评论
        username = item.find('div', class_='dper-info').text.strip()
        items = item.find_all('span', class_='item')     # 各项评分
        detail_score = []
        for _item in items:
            detail_score.append(_item.text.strip())
        content = item.find('div', class_='review-words').text.strip()  # 获取到的评论不全,做了CSS加密
        comment_list.append({'username': username, 'item': detail_score, 'content': content})
    return comment_list


class Spider:
    def response(self, flow:flow):
        # 去掉cookie的HttpOnly参数
        shop_list_url = 'http://www.dianping.com/guangzhou'

        url = flow.request.url
        if url.startswith(shop_list_url):
            print(f'mitm 劫持成功,URL= {url}')
            # headers = flow.request.headers
            body = flow.response.text
            shop_info = parse_shop(body)
            for _ in shop_info:
                print(_)
        elif 'review_all' in url and url.startswith('http://www.dianping.com'):
            print(f'mitm 劫持成功,URL= {url}')
            # headers = flow.request.headers
            body = flow.response.text
            comment_list = parse_comment(body)
            for _ in comment_list:
                print(_)
                print(20*'--')


addons = [
    Spider(),
]

六、程序运行结果

程序运行结果如下,如果需要进一步处理,或需要提取更多的字段,可以重新编写数据解析函数。

mitmproxy劫取结果

七、优缺点分析

序号 优点 缺点
1 程序编写简单 可能会遇到部分APP反代理,检测到使用代理后直接不工作
2 几乎没有反爬问题,不用构造参数 配置过程稍微有点繁琐

第三~六篇所使用的爬取方法都没有参数构造问题,所以在很多场合下,如果对爬取速度要求不高的话,这几种方法是很好的。在做爬虫的过程中,很大部分的精力基本上是放在找接口参数构造上面的,这几篇文章所用到的方法中,接口容易查找,也不用构造参数,所以还是很有意义的。但是对于想要进一步提高爬取速度,这些方法都是不能满足要求的。

接下来的文章当中会讲解如何适当的提高爬取速度。其实对现在的爬虫来说,并不能一味的提高爬取速度,稳定其实相对来说显得更为重要些,如果在爬取过程中出现验证码,这也是一个麻烦的事,验证码大量出现的时候,是很容易被封账号的。

注:

  1. 如果您不希望我在文章提及您文章的链接,或是对您的服务器造成了损害,请联系我对文章进行修改;
  2. 本文仅爬取公开数据,不涉及到用户隐私;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容