【爬蟲成長之路】(六)【大眾點評】mitmproxy中間人代理爬蟲

本系列文章共十篇:

【爬蟲成長之路】(一)爬蟲系列文章導讀
【爬蟲成長之路】(二)各篇需要用到的庫和工具
【爬蟲成長之路】(三)【大眾點評】selenium爬蟲
【爬蟲成長之路】(四)【大眾點評】selenium登錄+requests爬取數(shù)據(jù)
【爬蟲成長之路】(五)【大眾點評】瀏覽器掃碼登錄+油猴直接爬取數(shù)據(jù)
【爬蟲成長之路】(六)【大眾點評】mitmproxy中間人代理爬蟲
【爬蟲成長之路】(七)【大眾點評】PC微信小程序+requests爬取數(shù)據(jù)
【爬蟲成長之路】(八)【大眾點評】安卓APP爬蟲

本文需要用到的工具:mitmproxy中間人代理
本文需要用到的庫:mitmproxy先壕、bs4

爬取目標數(shù)據(jù):

  1. 指定城市的店鋪列表及其評分數(shù)據(jù)
  2. 指定店鋪下的用戶評論數(shù)據(jù)

一烙懦、需求分析

這一篇總共需要爬取兩個頁面的數(shù)據(jù)候址,分別是:

  1. 某城市的店鋪列表頁面
  2. 某店鋪的評論列表頁面

二、獲取目標頁面的URL

這里與前面獲取的URL一致涛碑,不需要進行修改:

# 進行URL匹配時需要適當修改匹配規(guī)則
http://www.dianping.com/guangzhou/ch10
http://www.dianping.com/shop/H7fXoNAkaf******/review_all

三分俯、mitmproxy簡介和使用

mitmproxy是一款HTTP/HTTPS代理工具蹈垢,其功能類似于Fiddler畜伐、Postman、Charles等抓包軟件瑞眼,不同之處在于mitmproxy提供了更為高級的開發(fā)接口龙宏,通過使用這些接口,我們能輕易的獲取到HTTP數(shù)據(jù)伤疙,并對其進行修改银酗。
mitmproxy官網(wǎng)地址

使用mitmproxy有幾個地方需要注意辆影,官網(wǎng)文檔有詳細說明,我在這里簡單說一下大概使用步驟:

  1. mitmproxy 軟件安裝(需要安裝mitmproxy軟件才能使用)
  2. 安裝mitmproxy的python庫黍特,pip install mitmproxy
  3. 閱讀文檔蛙讥,編寫程序
  4. 命令行啟動mitmproxy,指定端口寫好的程序(windows下是mitmdump灭衷,Linux下是mitmdump次慢,還有一個圖形界面mitmweb)
  5. 修改本地代理端口和命令行啟動時配置的端口一致(如果還有其他代理軟件開著,建議先關閉翔曲,避免相互影響)
  6. 安裝mitmproxy的證書经备,證書下載地址是mitm.it,詳細安裝可參考官網(wǎng)關于證書

如果mitmproxy安裝有問題的部默,可以參考如下文章:

  1. mitmproxy的安裝
  2. Python3+mitmproxy安裝使用教程(Windows)
  3. 安裝mitmproxy以及遇到的坑和簡單用法

四、分析文檔結構

這里和前面的第三篇造虎、第四篇都是一致的傅蹂,稍作修改即可,所以就不再重復了算凿。

五份蝴、編寫程序

其實關于mitmproxy獲取數(shù)據(jù)的部分很簡單,主要是要知道m(xù)itmproxy的工作原理氓轰,關鍵代碼只需要按固定的格式去編寫就好了婚夫。

程序啟動方式
在控制臺輸入命令:

mitmdump -p 8000 -q -s mitm_spider.py
序號 參數(shù) 說明
1 -p 指定代理端口,這里需要和系統(tǒng)中配置的一致署鸡,否則代理不起作用案糙,之后記得改回來
2 -q 可以屏蔽掉默認的無關輸出
3 -s 指定腳本程序所在的路徑

這里主要就是匹配URL,匹配到URL之后靴庆,就可以使用flow.response.text獲取響應的內容了时捌,之后便是和前面文章介紹的一樣按固定格式提取數(shù)據(jù)即可。

關鍵代碼:

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

class Spider:
    def response(self, flow:flow):
        # 去掉cookie的HttpOnly參數(shù)
        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參數(shù)
        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(),
]

六奢讨、程序運行結果

程序運行結果如下,如果需要進一步處理焰薄,或需要提取更多的字段拿诸,可以重新編寫數(shù)據(jù)解析函數(shù)。

mitmproxy劫取結果

七塞茅、優(yōu)缺點分析

序號 優(yōu)點 缺點
1 程序編寫簡單 可能會遇到部分APP反代理亩码,檢測到使用代理后直接不工作
2 幾乎沒有反爬問題,不用構造參數(shù) 配置過程稍微有點繁瑣

第三~六篇所使用的爬取方法都沒有參數(shù)構造問題凡桥,所以在很多場合下蟀伸,如果對爬取速度要求不高的話,這幾種方法是很好的。在做爬蟲的過程中啊掏,很大部分的精力基本上是放在找接口參數(shù)構造上面的蠢络,這幾篇文章所用到的方法中,接口容易查找迟蜜,也不用構造參數(shù)刹孔,所以還是很有意義的。但是對于想要進一步提高爬取速度娜睛,這些方法都是不能滿足要求的髓霞。

接下來的文章當中會講解如何適當?shù)奶岣吲廊∷俣取F鋵崒ΜF(xiàn)在的爬蟲來說畦戒,并不能一味的提高爬取速度方库,穩(wěn)定其實相對來說顯得更為重要些,如果在爬取過程中出現(xiàn)驗證碼障斋,這也是一個麻煩的事纵潦,驗證碼大量出現(xiàn)的時候,是很容易被封賬號的垃环。

注:

  1. 如果您不希望我在文章提及您文章的鏈接邀层,或是對您的服務器造成了損害,請聯(lián)系我對文章進行修改遂庄;
  2. 本文僅爬取公開數(shù)據(jù)寥院,不涉及到用戶隱私;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涛目,一起剝皮案震驚了整個濱河市秸谢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霹肝,老刑警劉巖钮追,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阿迈,居然都是意外死亡元媚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門苗沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刊棕,“玉大人,你說我怎么就攤上這事待逞∩牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵识樱,是天一觀的道長嗤无。 經(jīng)常有香客問我震束,道長,這世上最難降的妖魔是什么当犯? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任垢村,我火速辦了婚禮,結果婚禮上嚎卫,老公的妹妹穿的比我還像新娘嘉栓。我一直安慰自己,他們只是感情好拓诸,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布侵佃。 她就那樣靜靜地躺著,像睡著了一般奠支。 火紅的嫁衣襯著肌膚如雪馋辈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天倍谜,我揣著相機與錄音首有,去河邊找鬼。 笑死枢劝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的卜壕。 我是一名探鬼主播您旁,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轴捎!你這毒婦竟也來了鹤盒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤侦副,失蹤者是張志新(化名)和其女友劉穎侦锯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秦驯,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡尺碰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了译隘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲桥。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖固耘,靈堂內的尸體忽然破棺而出题篷,到底是詐尸還是另有隱情,我是刑警寧澤厅目,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布番枚,位于F島的核電站法严,受9級特大地震影響,放射性物質發(fā)生泄漏葫笼。R本人自食惡果不足惜深啤,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渔欢。 院中可真熱鬧墓塌,春花似錦、人聲如沸奥额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫挨。三九已至韩肝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間九榔,已是汗流浹背哀峻。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哲泊,地道東北人剩蟀。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像切威,于是被迫代替她去往敵國和親育特。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容