2015年6月20日星期六

程序员的黑科技_用代码回复博客

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
程序员的黑科技_用代码回复博客  阅读原文»

程序员的黑科技_用代码回复博客

本文讲述了如何使用代码模拟HTTP请求来实现数据爬取、点赞、评论回复等功能。

内容包括:

1.抓包软件WireShark的简单使用方法

2.Python库requests的基本使用

3.一个用代码回复博客的例子

首先,要模拟HTTP请求,我们要知道被模拟的真实HTTP它到底包含了哪些东西。它的目标URL是什么,参数是什么,是不是带cookie?除此之外还包括了哪些(比如Header)

为了获取这些信息,我们可以使用抓包软件WireShark来捕获我们真实提交请求时的数据

这里解释一下为什么要用WireShark?(Chrome浏览器本身其实也自带类似功能,有兴趣的朋友可以去研究下,但是我还是觉得抓包软件牛逼)

你可能觉得我要模拟HTTP请求来提交表单,只要看下网页源代码中的form表单有哪些字段就可以了。

没错,对于一些耿直的安全防护水平低的网站来说,这个方法确实可行。但对于大多数网站是行不通的

拿某博客网站做例子,看到它源代码中有个表单域如下:


然而我开着抓包软件,在真实地完成一次评论操作后,获取到的POST请求是这样的:


当然,这可能是因为它的onsubmit中修改了参数名字。但是就算是你正确填写了参数名,可能也没法获得正确的结果。其中缘由,下文的例子会具体阐述。

通过抓包软件,我们获取到了真实的HTTP请求的内容(上面红字所提到的)。接下来就可以通过代码来模拟。当然,在模拟时肯定会碰到各种问题,这时候我们要做的就是比较模拟的包(即代码发送的包。你看,不用抓包软件你怎么去获取代码发送的请求?)和真实请求的包的内容,来完善代码(比如添加一些cookie、header等等)。

本文我使用Python来编写,用了它强大的requests 库来模拟。

OK,到这里大致思路已经清楚了:使用抓包软件获取真实HTTP请求的内容,并用python代码来模拟。接下来我们看一下怎么去使用WireShark获取我们需要的信息。

打开WireShark,看到主界面如下:


这时候选择一个正在使用的网络连接之后Start(开始抓包),然后出现如下的界面:


在这里我们看到各种各样的包,一会儿就把整个屏给刷满了。别急,我们给它做点过滤。

在Filter输入栏中输入过滤规则: ip.dst==116.213.120.41 and http.request.method=="POST"

解释一下:目标IP地址为116.... 以及 包内容为: 以POST方法提交的HTTP请求(关于过滤规则网上查一下比比皆是)

现在清爽多了是不是:


这里显示的是我真实登录慕课网所post的请求的内容。可以看到URL、提交的内容以及一些乱七八糟的信息。

有同学可能不清楚怎么获得慕课的IP:打开终端Ping一下慕课的网址就可以了,如下所示:


OK,到这里想必读者已经清楚如何利用WireShark来获取真实请求的包了。有了包的数据,接下来就要用代码来模拟了!

本来想拿新浪博客做例子的。抓了下包看了内容吓哭了。也忒多了。还是拿某博客为例吧。

首先给个链接看看回复博客的效果:

http://blog.csdn.net/u012422829/article/details/46491779 这篇博客里抽风一样的评论有的是我之前做测试的时候真实提交的,有的是用代码提交的。

然后直接上代码:

[python] view plain

  1. importrequests

  2. frombs4importBeautifulSoup

  3. url='https://passport.csdn.net/account/login'

  4. sess=requests.session()

  5. printsess

  6. html1=sess.get(url).text

  7. soup1=BeautifulSoup(html1)

  8. p1=soup1.select("[name=lt]")[0]["value"]

  9. p2=soup1.select("[name=execution]")[0]["value"]

  10. data={

  11. "lt":p1,

  12. "execution":p2,

  13. "_eventId":"submit",

  14. "username":"yourname",

  15. "password":"yourpsw"

  16. }

  17. r=sess.post(url,data)

  18. printr.text

  19. commentUrl="http://blog.csdn.net/u012422829/comment/submit?id=46491779"

  20. html2=sess.get(url).text

  21. commentdata={

  22. "commentid":'',

  23. "content":"IamexcitedthatIcanreplymyblogbymypythoncode!",

  24. "replyId":'',

  25. }

  26. headers={'content-type':'application/x-www-form-urlencoded',

  27. 'User-Agent':'Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/41.0.2272.118Safari/537.36'}

  28. sess.headers.update(he

    阅读更多内容

没有评论:

发表评论