本系列文章共十篇:
【爬蟲成長之路】(一)爬蟲系列文章導讀
【爬蟲成長之路】(二)各篇需要用到的庫和工具
【爬蟲成長之路】(三)【大眾點評】selenium爬蟲
【爬蟲成長之路】(四)【大眾點評】selenium登錄+requests爬取數(shù)據(jù)
【爬蟲成長之路】(五)【大眾點評】瀏覽器掃碼登錄+油猴直接爬取數(shù)據(jù)
【爬蟲成長之路】(六)【大眾點評】mitmproxy中間人代理爬蟲
【爬蟲成長之路】(七)【大眾點評】PC微信小程序+requests爬取數(shù)據(jù)
【爬蟲成長之路】(八)【大眾點評】安卓APP爬蟲
本文需要用到的工具:
mitmproxy
中間人代理
本文需要用到的庫:mitmproxy
先壕、bs4
爬取目標數(shù)據(jù):
- 指定城市的店鋪列表及其評分數(shù)據(jù)
- 指定店鋪下的用戶評論數(shù)據(jù)
一烙懦、需求分析
這一篇總共需要爬取兩個頁面的數(shù)據(jù)候址,分別是:
- 某城市的
店鋪列表
頁面 - 某店鋪的
評論列表
頁面
二、獲取目標頁面的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)文檔有詳細說明,我在這里簡單說一下大概使用步驟:
- mitmproxy 軟件安裝(需要安裝mitmproxy軟件才能使用)
- 安裝mitmproxy的python庫黍特,
pip install mitmproxy
- 閱讀文檔蛙讥,編寫程序
- 命令行啟動mitmproxy,指定
端口
和寫好的程序
(windows下是mitmdump灭衷,Linux下是mitmdump次慢,還有一個圖形界面mitmweb)- 修改本地代理端口和命令行啟動時配置的端口一致(如果還有其他代理軟件開著,建議先關閉翔曲,避免相互影響)
- 安裝mitmproxy的證書经备,證書下載地址是mitm.it,詳細安裝可參考官網(wǎng)關于證書
如果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ù)。
七塞茅、優(yōu)缺點分析
序號 | 優(yōu)點 | 缺點 |
---|---|---|
1 | 程序編寫簡單 | 可能會遇到部分APP反代理亩码,檢測到使用代理后直接不工作 |
2 | 幾乎沒有反爬問題,不用構造參數(shù) | 配置過程稍微有點繁瑣 |
第三~六篇所使用的爬取方法都沒有參數(shù)構造問題凡桥,所以在很多場合下蟀伸,如果對爬取速度要求不高的話,這幾種方法是很好的。在做爬蟲的過程中啊掏,很大部分的精力基本上是放在找接口
和參數(shù)構造
上面的蠢络,這幾篇文章所用到的方法中,接口容易查找迟蜜,也不用構造參數(shù)刹孔,所以還是很有意義的。但是對于想要進一步提高爬取速度娜睛,這些方法都是不能滿足要求的髓霞。
接下來的文章當中會講解如何適當?shù)奶岣吲廊∷俣取F鋵崒ΜF(xiàn)在的爬蟲來說畦戒,并不能一味的提高爬取速度方库,穩(wěn)定其實相對來說顯得更為重要些,如果在爬取過程中出現(xiàn)驗證碼障斋,這也是一個麻煩的事纵潦,驗證碼大量出現(xiàn)的時候,是很容易被封賬號的垃环。
注:
- 如果您不希望我在文章提及您文章的鏈接邀层,或是對您的服務器造成了損害,請聯(lián)系我對文章進行修改遂庄;
- 本文僅爬取公開數(shù)據(jù)寥院,不涉及到用戶隱私;