作者:bigtrace
大家在简书上发表文章,最喜欢关心今天又多了多少访问量和赞。当然不只是简书,大部分的博客网站或者音乐社交如QQ空间,网易云音乐,都会去记录文章或者音乐的浏览或收听次数。可是你知道具体网站是怎么做到吗?
首先访问量的增加需要当前没有用户登录,页面每刷新一次,阅读量就会增加一次。
已经有人在网上做过简单研究,我这里进行更深入的探讨,并且附上python实例来教你如何快速增加简书记录访问量。
Replay XHR
该文中给我们提供了一个很简单的办法,那就是利用chrome自带的开发者工具,来对某一个post复制cURL
的命令,然后再用command line 运行这项指令。这在chrome中就类似于replay XHR
选项。 不停的点击这个选项来replay,就可以让简书识别出一次浏览行为.
当然这个方法简单粗暴,但是如何利用Python里面的pycURL
库来实现呢?
首先我们需要具体找到这个post命令在哪儿,然后找出post所需要提交的data form是什么
Post我们通过对post分析,发现其提交了一个uuid
的参数,而这个参数可以在第一次访问时,通过对该网页的源代码利用正则表达式找出。之后,这个uuid
可以在多次POST中重复使用。
可是当通过提交uuid
进行post,虽然发现其返回值为success,但访问量并未增加。于是我又对其进行更深入的分析,比如说看Request Header
和cookie
中是否存在关键变量,影响我们最终的结果。在不断的尝试过程中,我终于发现Request Header
中需要增加Origin
和 Referer
两个参数, 之后再代入uuid
进行post便可以成功刷新访问量。
顺便一提的是,我发现cookie中的Token
和_session_id
在每次提交时都会变,便以为这两个便是我们想要找的参数,但根据测试,其实它们可有可无。最终结论是Request Header
中就以上Origin
和 Referer
那两个参数最为重要。
实际应用
应用以上分析,我们可以利用Python 不停的调用此post 命令,来达到模拟增加访问量的目的。
下面附上代码:
提供你想访问的文章链接,和访问次数,即在code 中更改Post_link
和while
循环的次数。
模拟101次浏览某文章,效果图如下:
运行前 output 运行后# coding=utf-8
import pycurl
import urllib
from StringIO import StringIO
import json
import re
# class definition
class shua_view_class:
def __init__(self,link):
self.website = unicode(link)
self.configure()
def shouye(self):
buffer = StringIO()
self.c.setopt(pycurl.URL, self.website)
self.c.setopt(pycurl.POST, 0)
self.c.setopt(self.c.WRITEDATA, buffer)
self.c.perform()
body = buffer.getvalue().decode('utf-8')
self.uuid = re.search(r"uuid\":\"(.+)\"}", body).group(1)
view_count = re.search(r"views_count\":(\d+)", body).group(1)
#print self.uuid
print "view:" + str(view_count)
def configure(self):
self.c = pycurl.Curl()
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
self.c.setopt(pycurl.HTTPHEADER, ['Origin: http://www.jianshu.com', 'Referer: '+self.website]) # this line is very important to if we can succeed!
self.c.setopt(self.c.FOLLOWLOCATION, 1)
self.c.setopt(pycurl.VERBOSE, 0)
self.c.setopt(pycurl.FAILONERROR, True)
self.c.setopt(pycurl.USERAGENT, USER_AGENT)
def shuaview(self):
data_form = {
'uuid': self.uuid,
}
# print data_form
buffer = StringIO()
data_post = urllib.urlencode(data_form)
url = self.website.replace("/p/","/notes/") + '/mark_viewed.json'
#print url
self.c.setopt(pycurl.URL, url)
self.c.setopt(pycurl.POST, 1)
self.c.setopt(pycurl.POSTFIELDS, data_post)
self.c.setopt(self.c.WRITEFUNCTION, buffer.write)
self.c.perform()
response = buffer.getvalue()
response_json = json.loads(response)
def exit(self):
self.c.close()
# main function
Post_link="http://www.jianshu.com/p/120ab95ecef3"
n = 0
app=shua_view_class(Post_link)
app.shouye() # check the view number before we shua view
while True:
app.shuaview()
n += 1
if n > 100: # add 101 more views
break
app.shouye() # check the view number after we shua view
app.exit()
网友评论