myqf123 发表于 2021-12-5 12:49:27

python课后作业求助:1.写一个登录豆瓣的客户端,总是出现HTTP Error 418

"""写一个登录豆瓣的客户端,总是不成功,提示urllib.error.HTTPError: HTTP Error 418:需要怎么改,求指正 """
import re
import urllib.request
import http.cookiejar
import urllib.parse

#豆瓣的登陆url
loginurl = 'https://www.douban.com/accounts/login'
#构建一个CookieJar对象实例来保存cookie
cookiejar = http.cookiejar.CookieJar()
#使用HttpCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = urllib.request.HTTPCookieProcessor(cookiejar)
#通过build_opener()来构建opener
opener = urllib.request.build_opener(handler)

data = {
    "form_email":"your email",
    "form_password":"your password",
    "source":"index_nav" #没有的话登录不成功
}

data = {}
data['form_email'] = "你的账号"
data['form_password'] = "你的密码"
data['source'] = 'index_nav'

#从首页提交登录,以get方法访问页面,访问之后会自动保存cookie到cookiejar中
response=opener.open(loginurl, urllib.parse.urlencode(data).encode('utf-8'))

#验证成功跳转至登录页
if response.geturl() == "https://www.douban.com/accounts/login":
    html = response.read().decode('utf-8')

    #验证码图片地址
    imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html)
    if imgurl:
      url = imgurl.group(1)
      #将验证码图片保存至同目录下
      res = urllib.request.urlretrieve(url, 'v.jpg')
      #获取captcha-id参数
      captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>' ,html)

      if captcha:
            vcode = input('请输入图片上的验证码:')
            data["captcha-solution"] = vcode
            data["captcha-id"] = captcha.group(1)
            data["user_login"] = "登录"
            #提交验证码验证
            response = opener.open(loginurl, urllib.parse.urlencode(data).encode("utf-8"))
            ''' 登录成功跳转至首页 '''
            if response.geturl() == "http://www.douban.com/":
                print('login success ! ')

suchocolate 发表于 2021-12-5 13:50:03

#豆瓣的登陆url
# ....
opener.addheaders = [('User-agent', 'Mozilla')]   # 修改默认的user-agent,否则会被反扒。
opener = urllib.request.build_opener(handler)
老教程都落伍了,建议换个教程。https://gitee.com/Python3WebSpider/Python3WebSpider

myqf123 发表于 2021-12-6 10:24:43

suchocolate 发表于 2021-12-5 13:50
老教程都落伍了,建议换个教程。https://gitee.com/Python3WebSpider/Python3WebSpider

感谢,请问下.add_header和.addheaders的效果是一样的吗?他们之间有什么区别?

suchocolate 发表于 2021-12-6 11:38:44

本帖最后由 suchocolate 于 2021-12-6 11:41 编辑

myqf123 发表于 2021-12-6 10:24
感谢,请问下.add_header和.addheaders的效果是一样的吗?他们之间有什么区别?

效果是一样的,都是修改默认的头中字段的信息。但这两个方法是不同对象的方法:# 1. openner 的 addheaders方法:
>>> from urllib import request
>>> url = "https://www.whatismyip.com"
>>> proxy_support = request.ProxyHandler({'http': '125.108.106.64:9000'})
>>> opener = request.build_opener(proxy_support)
>>> dir(opener)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_call_chain', '_open', 'add_handler', 'addheaders', 'close', 'error', 'handle_error', 'handle_open', 'handlers', 'open', 'process_request', 'process_response']# 注意,没有add_headers方法
>>> type(opener)# openner对象
<class 'urllib.request.OpenerDirector'>
>>> opener.addheaders = [('User-agent', 'Firefox')]
>>>



# 2. Request对象的add_header方法
>>> from urllib import request
>>> req = request.Request(url='http://www.baidu.com')
>>> dir(req)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_data', '_full_url', '_parse', '_tunnel_host', 'add_header', 'add_unredirected_header', 'data', 'fragment', 'full_url', 'get_full_url', 'get_header', 'get_method', 'has_header', 'has_proxy', 'header_items', 'headers', 'host', 'origin_req_host', 'remove_header', 'selector', 'set_proxy', 'type', 'unredirected_hdrs', 'unverifiable']# 注意没有addheaders方法
>>> type(req)# request对象
<class 'urllib.request.Request'>
>>> req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')

myqf123 发表于 2021-12-6 11:51:07

suchocolate 发表于 2021-12-6 11:38
效果是一样的,都是修改默认的头中字段的信息。但这两个方法是不同对象的方法:

感谢解惑!大概明白了
页: [1]
查看完整版本: python课后作业求助:1.写一个登录豆瓣的客户端,总是出现HTTP Error 418