请选择 进入手机版 | 继续访问电脑版
楼主: runrum
542 0

[问答] 请教Python 多线程模拟登入问题 [推广有奖]

  • 0关注
  • 0粉丝

初中生

19%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
50 点
帖子
2
精华
0
在线时间
20 小时
注册时间
2017-2-27
最后登录
2017-8-15

runrum 发表于 2017-2-27 15:02:45 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
         在网上找了段多线程的示例代码,试着改了下,添加了模拟登入。好吧问题来了,因为没学过类继承的概念,
定义了登入的空方法login后,不知道怎么调用了。请教下,添加login后的代码具体要如何修改。
       (header和post参数可能跟我给url的不匹配,因为我的目标url不是下面的那个;希望用requests 的 session方法模拟登入,红色处应该是要修改的地方)


import requests
from bs4 import BeautifulSoup
from threading import Thread,Lock
from Queue import Queue
import time

class Fetcher:
    def __init__(self,threads):
        self.
        self.lock = Lock() #线程锁
        self.q_req = Queue() #任务队列
        self.q_ans = Queue() #完成队列
        self.threads = threads
        for i in range(threads):
            t = Thread(target=self.threadget)
            t.setDaemon(True)
            t.start()
        self.running = 0

    def login(self):
            url = 'http://www.verycd.com/signin'
            UA = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0"
            header = { "User-Agent": UA,
                                "Referer": "http://www.verycd.com/signin"
                             }
            login_session = requests.Session()
            r = login_session.get(url, headers = header)
            login_soup = BeautifulSoup(r.content, "html.parser")
            token = login_soup.find('input', {'name':'_token'})['value']
            print(token)
            postData = { 'username': 'xxxxxxx',
                                   'password': 'xxxxxxx',
                                   '_token': token,
                                 }
            login_session.post(url, data = postData, headers = header)
            return self.login_session

            
    def __del__(self): #解构时需等待两个队列完成
        time.sleep(0.5)
        self.q_req.join()
        self.q_ans.join()
   
    def taskleft(self):
        return self.q_req.qsize()+self.q_ans.qsize()+self.running

    def push(self,req):
        self.q_req.put(req)

    def pop(self):
        return self.q_ans.get()

    def threadget(self):
        while True:
            req = self.q_req.get()
            with self.lock: #要保证该操作的原子性,进入critical area
                self.running += 1
            try:
                ans = self.login_session.get(req).content
            except Exception, what:
                ans = ''
                print what
            self.q_ans.put((req,ans))
            with self.lock:
                self.running -= 1
            self.q_req.task_done()
            time.sleep(1) # don't spam

if __name__ == "__main__":
    links = [ 'http://www.verycd.com/topics/%d/'%i for i in range(5420,5430) ]
    f = Fetcher(threads=10)
    for url in links:
        f.push(url)
    while f.taskleft():
        url,content = f.pop()
        print url,len(content)
更多

0





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:多线程

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 23:25