Charles Proxy for Web Scrating(网络抓取代理)

2020-11-13 15:00:52

这篇文章将向你展示如何使用Charles Proxy对网站和移动应用程序上隐藏的和私有的API进行反向工程。

Charles Proxy是一个HTTP调试代理,可以检查网络调用并调试SSL流量。使用Charles,您可以检查请求/响应、标头和cookie。今天我们将看到如何设置Charles,以及如何使用Charles Proxy进行Web抓取。我们将专注于从大量使用Javascript的网页和移动应用程序中提取数据。Charles位于您的应用程序和互联网之间:

我们将了解如何在MacOS上安装和配置Charles,但也有Windows和Linux版本。

在安装Charles之后,您需要安装它的根证书。这将允许Charles拦截和解密SSL流量。

点击Install Root Certificate(安装根证书)后,它将打开您的MacOS Keychain访问权限,您必须打开Trust(信任)菜单,然后单击“Always Trust(始终信任)”。

现在,您需要转到代理&>SSL代理设置并添加“*”或要检查SSL的域。

在传统的服务器端呈现的网站中,HTML代码由后端服务构建,整个页面返回给HTTP客户端(通常是您的浏览器)。在过去的10年中,越来越多的网站使用React.js、Vue.js或Angel等单一页面应用程序框架在客户端呈现。

这些框架向后端API发送了许多请求,直接使用这些API可能是一个很好的想法,而不是抓取站点并使用无头浏览器呈现Javascript来提取所需的数据。它的速度会快得多,你不需要昂贵的硬件(无头浏览器需要大量内存和强大的CPU。)

我们将介绍不同的单页应用程序,看看Charles Proxy如何帮助您从后端API中发现和提取数据。

ProductHunt是一个著名的在线产品发布网站。它在科技生态系统中非常受欢迎。每天有几十个项目推出,所以首页只加载当天的产品。有无限的卷轴可以查看前几天的产品。

我们将使用Charles Proxy来分析后端API调用,并用一些Python代码重现它。

现在打开Charles Proxy,转到Producthut主页,滚动几次到页面底部。

默认情况下,Charles将捕获您的系统发出的每个HTTP请求,而不仅仅是您的浏览器。所以你会受到很多“污染”。您可以通过输入您感兴趣的域名进行过滤:

如果单击发送到/Fronend/GraphQL端点的POST请求之一,则可以检查请求和响应。

这些请求发生了很多事情,但如果比较发送到GraphQL API的内容,似乎唯一改变的就是游标参数。

它是Base64编码的,但幸运的是,Charles有一个快速解码Base64内容的功能。您只需选择它并单击鼠标右键:

Charles提供的杀手级功能之一是能够编辑任何请求和回放。在我们的例子中,它真的很棒,因为在请求中有很多头/cookie值,所以试图用HTTP客户端或在代码中重现请求将是一场噩梦。

为此,您可以右键单击请求,然后单击Compose。

然后,您可以使用光标值,并将其替换为以Base64编码的不同页码。然后点击Execute(执行)。

您也可以尝试删除不同的Cookie(这会起作用)。这是个好消息,因为如果Cookie是强制使用这个端点的,那么用我们的Python代码重现请求会更加复杂。

然后,您可以使用这样的工具将cURL命令转换为Python代码(使用精彩的请求包):https://curl.trillworks.com/。

导入请求标题={';Host';:';www.Producthunt.com;,';Accept';:';*/*';,';x-Requesters-with';:';XMLHttpRequest';,';User-agent';:';Mozilla/5.0(Macintosh;英特尔Mac OS X 10_15_6)AppleWebKit/537.36(khtml,像壁虎一样)Chrome/86.0.4240.111 Safari/537.36';,';内容类型';:';应用程序/json';,';起源';:';https://www.producthunt.com';,';SEC-FETCH-SITE';:';同源';,';SEC-FETCH-MODE';:';CORS';,';SEC-FETCH-DEST';:';Empty';,';Referer';:';https://www.producthunt.com/';,';Accept-Language';:';en-US,en;q=0.9';,}data=';{";operation Name";:";主页";,";变量";:{";Cursor";:";OA==";,";Feature";:True,";IncluddePromotedPost";:False,";VisibleOnHome";:True,";IncluddeLay.。:FALSE},";查询";:";查询主页($CURSOR:STRING,$PostCursor:STRING,$FECTURED:Boolean!,$IncluddePromotedPost:Boolean!,$visibleOnHompage:Boolean!){\\n部分(第一:1,之后:$CURSOR,特色:$FECTED){\\n边{\\n光标\\n节点{\\n ID\\n日期\\n CUTOFF_INDEX\\n POSTS_COUNT\\n卡片(第一:1,之后:$CURSOR){\\n边{\\n节点{\\n...FeedCards\\n_TypeName\\n}\\n帖子(之后:$postCursor,在主页上可见){\\n边{\\n节点{\\n...PostItemList\\n Feature_Comment{\\n id\\n正文:Body_Text\\n用户{\\n id\\n...UserImageLink\\n__TypeName\\n}\\n pageInfo{\\n。EndCursor\\n hasNextPage\\n__TypeName\\n}\\n pageInfo{\\n endCursor\\n hasNextPage\\n__TypeName\\n}\\n__TypeName\\n}\\n ad(种类:\\";馈送\\";)@Include(if:$cluddePromotedPost){\\n...AdFragment\\n__TypeName\\n}\\n PromotedEmail_Campaign(Promoted_type:主页)@Include(if:$cluddePromotedPost){\\n id\\n abTestName\\n abVariant{\\n id\\n...PromotedEmailAbTestVariantFragment\\n_TypeName\\n。\n id\\n主题\\n__TypeName\\n}\\n查看器{\\n id\\n电子邮件\\n Has_时事通讯_Subscription\\n__TypeName\\n}\\n ph_HOME_OG_IMAGE_url\\n}\\n\\n卡片上的FeedCard碎片{\\n...NewPostsCard\\n...BestProductsFromLastWeekCard\\n...MakersDiscus。N\\n NewPostsCard上的片段NewPostsCard{\\n IS_OFFERED\\n种类\\n帖子{\\n...PostItemList\\n_TypeName\\n}\\n_TypeName\\n}\\n\\n帖子上的片段PostItemList{\\n id\\n...帖子项\\n_TypeName\\n}\\n\\n帖子上的片段PostItem{\\n id\\n。已缩短的url\\n slug\\n标记线\\n更新的_at\\n主题{\\n边{\\n节点{\\n id\\n名称\\n slug\\n_TypeName\\n}\\n...PostThumbail\\n...PostVoteButton\\n_TypeName\\n}\\n\\n帖子上的片断PostThumbail{\\n id。\\n名称\\n缩略图{\\n id\\n media_type\\n...MediaThumbail\\n_TypeName\\n}\\n...PostStatusIcons\\n_TypeName\\n}\\n\\n媒体上的媒体缩略图碎片{\\n id\\n Image_UUID\\n_TypeName\\n}\\n\\n开机自检时分割PostStatusIcons。\\n\\n帖子上的片段PostVoteButton{\\n_id\\n id\\n Feature_at\\n update_at\\n Created_at\\n Disable_When_Scheduled\\n Has_Voted\\n...。在VOTABLE{\\n id\\n Votes_Count\\n__TypeName\\n}\\n__TypeName\\n}\\n\\n BestProductsFromLastWeekCard上的片段BestProductsFromLastWeekCard{\\n Posts{\\n Posts

几年前,让Charles Proxy在您的移动设备上运行有点复杂,您必须使用桌面Charles作为代理,使用相同的WiFi网络等。自2018年以来,他们推出了一款原生iOS应用程序,您可以在应用程序商店下载该应用程序:https://apps.apple.com/us/app/charles-proxy/id1134218562。

现在,让Charles拦截你最喜欢的应用程序HTTPS流量更容易了。安装应用程序,然后在主屏幕上激活它:

激活Charles并设置VPN配置后,您需要转到设置屏幕并启用SSL代理(只需按照说明操作):

当您打开SSL代理时,某些应用程序可能会停止工作。当您安装Charles时,您还将安装一个根证书,以便Charles可以检查您的SSL通信。

这是一种“中间人”攻击(但在这种情况下,你是在攻击自己)。

一些应用程序正在验证根证书,因此不接受Charles的根证书。这称为SSL钉住。

现在打开激活了Charles的应用程序,滚动几次以加载更多文章。

与Charles桌面应用程序一样,您需要过滤dev.to域,以避免看到其他所有应用程序发送的请求。

然后,您可以点击请求序列,并将其共享到Mac进行进一步分析(无需在移动设备上分析请求):

现在,我们将在Charles桌面应用程序上打开请求会话并处理请求。双击下载文件夹中的Charles会话文件(以.chlsj结尾):

与前一部分一样,您可以对此请求会话执行完全相同的分析。

有趣的请求位于/search端点上。这是一个标准的REST API。

似乎不需要任何身份验证/cookie或特定的头来获得成功的响应。您可以通过以下方式进行验证:

有趣的参数是页码和per_page count。您可以使用这些值。

导入请求参数=(';PER_PAGE';,';5';),(';PAGE';,';1';),(';SORT_BY';,';Hotness_Score';),(';SORT_DIRECTION';,';Desc';),(';已批准';,';';),(';CLASS_NAME';,';文章';),)响应=请求.get(';https://dev.to/search/feed_content';,Verify=False,Params=Params)打印(响应.text)。

这是我最喜欢的从难以抓取的网站中提取数据的技术之一。它比使用无头浏览器快得多,解析JSON响应也比经常更改的乱七八糟的HTML代码容易得多。

有很多Charles的功能是我们在本教程中没有看到的。例如,断点和响应重写。对于想要测试/调试单页应用程序或移动应用程序的人来说,这可能非常有趣。

当你想要从网站上提取数据或者对移动应用进行反向工程时,Charles是非常方便的,但在复杂的网站上进行任何类型的浏览器自动化也几乎是强制性的。

例如,使用常规浏览器开发工具可能很难理解身份验证工作流。一旦您开始拥有JWT令牌、CSRF令牌和OAuth,它就开始变得杂乱无章,能够对一系列请求执行全文搜索并重放/修改请求是必须的。

不会被屏蔽的网页抓取:这篇文章将向你展示不同的技术,以避免在抓取网页时被屏蔽。

最好的网页抓取工具:这篇文章是关于目前最好的网页抓取工具。

我希望你喜欢这篇介绍Charles和逆向工程的文章,并希望你能在你最喜欢的应用程序上进行实验。