RJ博客

Python多线程 - 刷简书阅读数

本文目录

今天发现简书在未登录状态下,访问一次阅读数+1,基于这个逻辑想到了再Linux下用curl访问链接增加阅读数,发现curl访问并没有使阅读数增加,基本确定简书是用ajax请求接口使阅读数+1的,经过排查发现是 mark_viewed.json 这个接口,下面以《QQ麻将番数规则》这篇文章为例讲解下,阅读数上报接口:

http://www.jianshu.com/notes/1a7358890b15/mark_viewed.json

一个简单的版本:

import requests
import thread

headers = {'Referer': 'http://www.jianshu.com/p/1a7358890b15'}
user_data = {'uuid':'b3a9e7fd-f0e1-40ce-adb9-d0cb61796880'}
url = 'http://www.jianshu.com/notes/1a7358890b15/mark_viewed.json'

data = []
count = 0

while 1:
    response = requests.post(url, headers=headers, data=user_data)
    
    count+=1
    if count%10==0:
        print count

运行结果:

C:\Users\Administrator\Desktop>python read_count.py
10
20
30
40
50

已经能让阅读数增加了,但是速度比较慢,而且此版本网络不好的话,post会报错,导致所属进程终止运行,当所有进程都被终止了,程序也就不会生效了。

于是添加了抛异常模块,同时于是结合了python的多线程编程:

import requests
import thread
import time

# header
headers = {'Referer': 'http://www.jianshu.com/p/1a7358890b15'}
# user_data
user_data = {'uuid':'b3a9e7fd-f0e1-40ce-adb9-d0cb61796880'}
# url
url = 'http://www.jianshu.com/notes/1a7358890b15/mark_viewed.json'

data = []
count = 0
passes = 0 

def calculate():
    global count,passes
    while 1:
        '''抛异常,不然网络不好的话,post会报错,导致所属进程终止运行,
        当所有进程都被终止了,程序也就不会生效了'''
        try:
            response = requests.post(url, headers=headers, data=user_data)
        except Exception as e:
            passes+=1
            print 'pass:'+str(passes)
        
        count+=1
        if count%100==0:
            print count

def runThread():
    for x in xrange(1,50):
        thread.start_new_thread( calculate, () )

if __name__ == '__main__':
    # 创建新线程
    try:
        runThread()
    except:
        print "Error: unable to start thread"

    while 1:
        time.sleep(1)
        pass

另一种多线程写法:

import requests
import threading
import time
 
# header
headers = {'Referer': 'http://www.jianshu.com/p/1a7358890b15'}
# user_data
user_data = {'uuid':'b3a9e7fd-f0e1-40ce-adb9-d0cb61796880'}
# url
url = 'http://www.jianshu.com/notes/1a7358890b15/mark_viewed.json'

data = []
threads = []
count = 0
passes = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        # print "Starting " + self.name
        print_time(self.name, self.counter, 100)

def print_time(threadName, delay, counter):
    global count,passes
    while counter:
        # time.sleep(delay)
        try:
            response = requests.post(url, headers=headers, data=user_data)
        except Exception as e:
            passes+=1
            print 'pass:'+str(passes)

        count+=1
        if count%100==0:
            print count

        counter -= 1

def runThread():
    for x in xrange(1,500):
        # 创建新线程
        exec("thread%s = myThread(%s, 'Thread-%s', 1)" %(x,x,x))
        # 开启新线程
        exec("thread%s.start()" %(x))
        # 添加线程到线程列表
        exec("threads.append(thread%s)" %(x))
    
 
count = 0
while count>=0:
    t0 = time.time()

    # 等待所有线程完成
    for t in threads:
        t.join()

    print "Exiting Main Thread"
    t1 = time.time()
    print "time used:"+str(t1-t0)

    print "Starting Main Thread"
    print "Total:"+str(count*50000)+"\n"
    count += 1

    runThread()

Windows下测试,刷50000次耗时127秒左右:

Exiting Main Thread
time used:127s
Starting Main Thread
Total:50000


References:

http://www.runoob.com/python/python-multithreading.html

相关推荐

发表评论