我不确定标题是否清晰,所以这是最新的:
我大约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()
脚本运行完美 - 发布评论。
所以我的问题是 - 第一个脚本的问题在哪里?为什么在第一个脚本中发布评论没有给出结果?它丢失了什么吗?
感谢您的时间和帮助!
答案 0 :(得分:0)
快速浏览一下mechanize源代码告诉我,最终mechanize使用urllib2.Request实例并调用其add_data成员。文档说,请求设置用户代理。你的网络服务器是否有可能拒绝帖子做缺乏或无效的用户代理?
有一个很好的教程,可以在旧的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)