3

我不确定标题是否足够清楚,所以这是怎么回事:

大约 3 周前我开始学习 Python,最近我给自己一个任务——登录一个网站,然后阅读特定页面,然后在同一页面上发表评论,所有这些都使用 Python scrypt。我在文档中进行了搜索,发现 urllib、urllib2 和 cookielib 模块正是我想要的。所以我想出了这个代码:

import urllib, urllib2, cookielib
import re

url_page = 'http://www.example.net/page/'
url_login = 'http://www.example.net/login.php'
url_post = 'http://www.example.net/post.php'

def main():

    #login data
    username = 'user1'
    password = 'user1'

    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    login_data = urllib.urlencode({'j_user' : username, 'j_pass' : password})
    opener.open(url_login, login_data)

    opener.open(url_page)    

    #comment is in string
    s = "abcd"

    #post data
    post_data = urllib.urlencode({'com' : s})
    opener.open(url_post, post_data)

if __name__=='__main__':
    main()

第一部分(登录)工作正常,我登录到网站,我可以得到页面。但什么也没发生 - 它无法发表评论。然后,我在这个网站上发现该mechanize模块是网页浏览的最佳解决方案。所以,我找到了这个脚本并根据我的目的对其进行了调整:

import mechanize
import cookielib
import urllib
import re

#required addresses
url_page = 'http://www.example.net/page/'

def main():
    br = mechanize.Browser() 
    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)

    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

    r = br.open(url_page)

    #selecting form
    br.select_form(nr=2)
    #setting inputs 
    br.form['j_user'] = 'user1'
    br.form['j_pass'] = 'user1'

    #login
    r = br.submit()

    r = br.open(url_page)

    s = "abcd"

    #posting
    br.select_form(nr=4)
    br.form['com'] = s
    br.submit()


if __name__ == '__main__':
    main()

脚本运行完美 - 它发布评论。

所以我的问题是 - 第一个脚本的问题在哪里?为什么在第一个脚本中发表评论没有给出结果?它缺少什么吗?

感谢您的时间和帮助!

4

1 回答 1

0

快速浏览一下 mechanize 源代码,我发现 mechanize 最终使用 urllib2.Request 实例并调用它的 add_data 成员。文档说 Request 设置了一个用户代理。您的网络服务器是否可能因为缺少或无效的用户代理而拒绝发布?

在旧的 PyMOTW 帖子中有一个关于做你想做的事情的很好的教程。http://www.doughellmann.com/PyMOTW/urllib2/ 它链接到有价值的资源,例如 Michael Foord 丢失的手册。http://www.voidspace.org.uk/python/articles/urllib2.shtml

看起来 HttpHandler 在请求中添加了 Content-Type: application/x-www-form-urlencoded 的标头。您可以尝试在第一种情况下添加它。它还设置 Content-Length 标头。

http://hg.python.org/cpython/file/457c0c9c7893/Lib/urllib2.py#l1112

post_data = urllib.urlencode({'com' : s})
post_headers_and_data = "Content-Type: application/x-www-form-urlencoded\nContent-Length: {0}\n\n{1}".format(len(post_data), post_data)
opener.open(url_post, post_headers_and_data)
于 2012-11-16T15:46:46.123 回答