Python mechanicalsoup获取Web表单

问题描述 投票:0回答:1

我正在写一个独立的机器人,登录JitJat,一个匿名的即时消息站点,并向用户发送消息。我成功地做到了这一点,我到达了the index,在那里我选择了我的收件人。

最后,我可以在the chat与某人聊天,但每当我尝试获取页面的形式时,我都会得到无。我尝试使用robobrowser,requests和mechanicalsoup多次这样做。

我的脚本在这里:

import mechanicalsoup

#Current url: https://jitjat.org/login.php
browser = mechanicalsoup.StatefulBrowser()
browser.open('https://jitjat.org/login.php')
print('Current url: ' + str(browser.get_url()))
browser.select_form()
browser['username'] = 'my username'
browser['password'] = 'my password'
browser.submit_selected()
print('Redirect: ' + str(browser.get_url()))

#Current url: https://jitjat.org/index.php
browser.follow_link("recipient username")
print('Redirect: ' + str(browser.get_url()))

#Current url: https://jitjat.org/chat.php?id=(recipient username)
browser.select_form()
print(browser.get_current_form().print_summary())

这里的页面来源:

<!DOCTYPE html>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

	<title>JitJat - anonymous instant messaging</title>
    
    <link href="css/jChat.css" rel="stylesheet" media="screen" type="text/css" />
	
    <link href="css/reset.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="css/bootstrap.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="css/bootstrap-responsive.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="css/user_css.css" rel="stylesheet" media="screen" type="text/css" />
   
    <script src="js/jquery.js" type="text/javascript"></script>
    <script src="js/bootstrap.js" type="text/javascript"></script>
    <script src="js/jChat.js" type="text/javascript"></script>
    <script src="js/jquery.nicescroll.js" type="text/javascript"></script>
    <script src="js/custom.js" type="text/javascript"></script> 
    
</head>

<body>
	
    <div class="navbar navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">
        
           <div id="header">  
                <div id="logo">
                    <a href="index.php"><h1>logo</h1></a>
                </div>
    
                <div id="info">
                    <ul id="userBox">
                        <li class="dropdown">
                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">ni47gv2x9ne<b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                <li><a href="?action=logout&token=20419ec4554207718f71e9c5255f3514"><span class="icon-off"></span> <strong>Logout</strong></a></li>
                            </ul>
                      	</li>
                    </ul>
                </div>
                <div class="clear"></div>
            </div>

        </div>
      </div>
    </div>
    
    <div class="container">
        <ul class="breadcrumb">
            <li><a href="index.php">Home</a><span class="divider">&raquo;</span></li>
            <li class="active">Chat</li>
        </ul>
    </div>
    



    
        <div class="container">
        <ul class="breadcrumb" align="center">
            <li><noscript>
<span style="font-weight: normal; color: #ff0000">You need to have scripting enabled to use Chat.</span>
</noscript>

<script type="text/javascript">
document.write('You are using <span style="font-weight: bold">Chat</span>.');
</script> Click to enter <a href="/chat.php?id=Bluebear&mode=messaging"><span style="font-weight: normal">Messaging</span></a> <img src="images/ui/question.png" width="13" height="13" style="vertical-align: -1px;" title="differences: click-to-send, manual refresh, manual scroll, multiple lines possible, delete single messages, see if message is unread"></li>

        </ul>
    </div>
    
    <div class="container">
    
	<!-- BOX -->
    <div class="box">
    
    	<div class="header">
    	
    	   <div style="z-index: 10; position: absolute; left: 88%; margin-top: 8px; width: 135px; height: 25px; border: 0px solid black;"><a href="/chat.php?id=Bluebear&nuke=1&mode=" title="delete all messages permanently">nuke conversation</a></div>

        <h4><img src="images/avatars/user1.png" width="14" height="14" style="vertical-align: -2px;"> <a href="/chat.php?id=bluebear&mode=">bluebear</a></h4>

        
        </div>

        
        
    
                <div class="content">
			<!-- jChat -->
            <ul class="messages-layout">
                <li class="messages"></li>
            </ul>
            <!-- Enter message field -->
             <span class="session_time">Online</span><span id="sample"></span>
            <div class="message-entry">
                <input type="text" id="text-input-field" class="input-sm" name="message-entry" /> 
                <div class="send-group">
                    <a href="#emoticons" data-option="emotions" class="attachEmotions" data-toggle="modal"></a>
                    <input type="submit" name="send-message" id="sendMessage" class="btn btn-primary" value="Send" />
                </div>
            </div>
            
            <!-- Emoticons Modal -->
            <div id="emoticons" class="modal hide fade">
                <div class="modal-header"><h4>Emotions</h4></div>
                <div class="modal-body"></div>
                <div class="modal-footer">
                    <a href="#" class="btn" data-dismiss="modal">Close</a>
                </div>
            </div>
            
            <!-- // jChat -->
                     
        </div>
        
    </div>
    <!-- // END BOX -->
    
    
    
    
     
    </div>
                  
</body> 
   
   <script>
   		$().Chat();
   </script>
   
</html>
How can I fix it? Do you have any idea to solve it?? Thank you for the attention!
python forms request python-requests
1个回答
1
投票

我解决了这个问题。对于所有那些有类似问题的人,由于特定的html代码,我建议使用robobrowser,一个智能的跨平台模块(有用的文档here)。

如果由于某种原因你无法获得页面的形式:

  1. 尝试指定表单的ID,如: browser = RoboBrowser(id='FormId')
  2. 尝试使用请求模块传递标头: import requests mysession = requests.session() open = mysession.get('website_url') print(open.headers) 像这样添加标题: mysession.headers = open.headers browser = RoboBrowser(id='FormId', session=mysession, history=True)

希望能帮助到你!

© www.soinside.com 2019 - 2024. All rights reserved.