<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Townes &#187; Python 登录</title>
	<atom:link href="https://thetownes.coolpage.biz/?feed=rss2&#038;tag=python-%E7%99%BB%E5%BD%95" rel="self" type="application/rss+xml" />
	<link>https://thetownes.coolpage.biz</link>
	<description>本站已转移至：http://www.thetownes.info</description>
	<lastBuildDate>Thu, 01 Aug 2013 11:49:56 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>使用 Python 登录网站</title>
		<link>https://thetownes.coolpage.biz/?p=128</link>
		<comments>https://thetownes.coolpage.biz/?p=128#comments</comments>
		<pubDate>Tue, 09 Jul 2013 14:53:21 +0000</pubDate>
		<dc:creator>Will</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Python 登录]]></category>

		<guid isPermaLink="false">http://thetownes.coolpage.biz/?p=128</guid>
		<description><![CDATA[对于大部分论坛，我们想要抓取其中的帖子分析，首先需要登录，否则无法查看。 这是因 &#8230; <a href="https://thetownes.coolpage.biz/?p=128">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>对于大部分论坛，我们想要抓取其中的帖子分析，首先需要登录，否则无法查看。</p>
<p>这是因为 HTTP 协议是一个无状态(Stateless)的协议，服务器如何知道当前请求连接的用户是否已经登录了呢？有两种方式：</p>
<ol>
<li>在URI 中显式地使用 Session ID；</li>
<li>利用 Cookie，大概过程是登录一个网站后会在本地保留一个 Cookie，当继续浏览这个网站的时候，浏览器会把 Cookie 连同地址请求一起发送过去。</li>
</ol>
<p>Python 提供了相当丰富的模块，所以对于这种网络操作只要几句话就可以完成。我以登录 QZZN 论坛为例，事实上下面的程序几乎所有的 PHPWind 类型的论坛都是适用的。<br />
<code># -*- coding: GB2312 -*-</code><br />
<code><br />
from urllib import urlencode<br />
import cookielib, urllib2</code></p>
<p># cookie<br />
cj = cookielib.LWPCookieJar()<br />
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))<br />
urllib2.install_opener(opener)</p>
<p># Login<br />
user_data = {&#8216;pwuser&#8217;: &#8216;你的用户名&#8217;,<br />
&#8216;pwpwd&#8217;: &#8216;你的密码&#8217;,<br />
&#8216;step&#8217;:&#8217;2&#8242;</p>
<p><code>url_data = urlencode(user_data)<br />
login_r = opener.open("http://bbs.qzzn.com/login.php", url_data)<br />
</code></p>
<p>一些注释：</p>
<ol>
<li>urllib2 显然是比 urllib 高级一点的模块，里面包括了如何使用 Cookies。</li>
<li>在 urllib2 中，每个客户端可以用一个 opener 来抽象，每个 opener 又可以增加多个 handler 来增强其功能。</li>
<li>在构造 opener 时指定了 HTTPCookieProcessor 做为 handler，因此这个 handler 支持 Cookie。</li>
<li>使用 isntall_opener 后，调用 urlopen 时会使用这个 opener。</li>
<li>如果不需要保存 Cookie，cj 这个参数可以省略。</li>
<li>user_data 存放的就是登录所需要的信息，在登录论坛的时候把这个信息传递过去就行了。</li>
<li>urlencode 功能是把字典 user_data 编码成”?pwuser=username&amp;pwpwd=password”的形式，这样做是为了使程序易读一些。</li>
</ol>
<p>最后一个问题是，pwuser、pwpwd 这类的名字是从哪儿来的，这就要分析需要登录的网页了。我们知道，一般的登录界面都是一个表单，节选如下：<br />
<code>&lt;form action="login.php?" method="post" name="login" onSubmit="this.submit.disabled = true;"&gt;<br />
&lt;input type="hidden" value="" name="forward" /&gt;<br />
&lt;input type="hidden" value="http://bbs.qzzn.com/index.php" name="jumpurl" /&gt;<br />
&lt;input type="hidden" value="2" name="step" /&gt;</code></p>
<p>…<br />
<code></code></p>
<p>&lt;td width=&#8221;20%&#8221; onclick=&#8221;document.login.pwuser.focus();&#8221;&gt;&lt;input type=&#8221;radio&#8221; name=&#8221;lgt&#8221; value=&#8221;0&#8243; checked /&gt;用户名 &lt;input type=&#8221;radio&#8221; name=&#8221;lgt&#8221; value=&#8221;1&#8243; /&gt;UID&lt;/td&gt;<br />
&lt;td&gt;&lt;input type=&#8221;text&#8221; maxLength=&#8221;20&#8243; name=&#8221;pwuser&#8221; size=&#8221;40&#8243; tabindex=&#8221;1&#8243; /&gt; &lt;a href=&#8221;reg1ster.php&#8221;&gt;马上注册&lt;/a&gt;&lt;/td&gt;<br />
&lt;td&gt;密　码&lt;/td&gt;<br />
&lt;td&gt;&lt;input type=&#8221;password&#8221; maxLength=&#8221;20&#8243; name=&#8221;pwpwd&#8221; size=&#8221;40&#8243; tabindex=&#8221;2&#8243; /&gt; &lt;a href=&#8221;sendpwd.php&#8221; target=&#8221;_blank&#8221;&gt;找回密码&lt;/a&gt;&lt;/td&gt;</p>
<p><code>...</code></p>
<p>&lt;/form&gt;<br />
从这里可以看出，我们需要输入的用户名密码对应的就是 pwuser 和 pwpwd，而 step 对应的则是登录（这个是尝试出来的）。</p>
<p>注意到，这个论坛表单采用的是 post 方式，如果是 get 方式则本文的方法就需要变动一下，不能直接 open，而是应该首先 Request，然后再 open。更详细的请看手册…</p>
]]></content:encoded>
			<wfw:commentRss>https://thetownes.coolpage.biz/?feed=rss2&#038;p=128</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
